programing

Node.js에 파일/디렉토리가 있는지 동기화하여 확인

magicmemo 2023. 5. 26. 20:50
반응형

Node.js에 파일/디렉토리가 있는지 동기화하여 확인

파일이나 디렉터리가 있는지 node.js를 사용하여 동기적으로 확인하려면 어떻게 해야 합니까?

이 질문에 대한 답은 수년간 바뀌었습니다.현재의 답은 여기 맨 위에 있으며, 그 다음에 지난 몇 년 동안의 다양한 답이 시간순으로 나열되어 있습니다.

현재 답변

다음을 사용할 수 있습니다.

const fs = require("fs"); // Or `import fs from "fs";` with ESM
if (fs.existsSync(path)) {
    // Do something
}

그것은 몇 년 동안 사용되지 않았지만, 더 이상 그렇지 않습니다.문서에서:

:fs.exists()더 이상 사용되지 않습니다.fs.existsSync() ( 매개 변수는 " " " 입니다." (" " " " " " " " " " ):fs.exists()에서는 다른 Node.js 콜백과 일치하지 않는 매개 변수를 허용합니다. fs.existsSync()콜백을 사용하지 않습니다.)

특히 동기식 검사를 요청했지만, 비동기식 검사를 대신 사용할 수 있는 경우(일반적으로 I/O가 가장 적합함),async기능 또는 (이(가) 권장되지 않는 경우):

async함수:

try {
    await fs.promises.access("somefile");
    // The check succeeded
} catch (error) {
    // The check failed
}

또는 콜백을 사용한 경우:

fs.access("somefile", error => {
    if (!error) {
        // The check succeeded
    } else {
        // The check failed
    }
});

과거의 답변

다음은 연대순으로 기록된 답변입니다.

  • 원답년원
    (stat/statSync또는lstat/lstatSync)
  • 9월 2012년 9월
    (exists/existsSync)
  • 2월 2015년 2월 데이트업
    (임시의 폐지에 주의)exists/existsSync 저희는 그서우아다시마리는래▁back다▁to시▁so'▁probablyre아▁we마그.stat/statSync또는lstat/lstatSync)
  • 12월 2015년 12월 12일
    .fs.access(path, fs.F_OK, function(){})/fs.accessSync(path, fs.F_OK)입니다. for " "/docs for "는 오류입니다. 문서는 다음에 대한 것입니다.fs.stat 다니합장용▁using를 사용하는 것을 합니다.fs.access개봉하지 않고 존재 확인이 필요한 경우)
  • 12월 2016년 12월 12일
    fs.exists()여전히 사용되지 않지만fs.existsSync()더 이상 사용되지 않습니다.그래서 당신은 지금 그것을 안전하게 사용할 수 있습니다.

2010년 원본 답변:

사용할 수 있습니다.statSync또는lstatSync(아래 링크), 개체를 제공합니다.일반적으로 함수의 동기화 버전을 사용할 수 있는 경우 비동기 버전과 이름이 같습니다.Sync마지막에그렇게statSync는 의동버전다니입의 입니다.stat;lstatSync는 의동버전다니입의 입니다.lstat 타기.

lstatSync예를 들어 존재 여부와 존재 여부를 모두 알려줍니다. 존재 여부와 존재 여부를 알아야 할 경우 파일 또는 디렉토리(또는 일부 파일 시스템, 심볼릭 링크, 블록 장치, 문자 장치 등).

var fs = require('fs');
try {
    // Query the entry
    stats = fs.lstatSync('/the/path');

    // Is it a directory?
    if (stats.isDirectory()) {
        // Yes it is
    }
}
catch (e) {
    // ...
}

...그리고 마찬가지로, 파일이라면, 다음과 같은 것이 있습니다.isFile만약 그것이 블록 장치라면, 거기에.isBlockDevice 참고:try/catch항목이 전혀 없는 경우 오류가 발생합니다.

항목이 무엇이든 상관하지 않고 존재 여부만 알고 싶다면 (또는 최신 버전의 경우)를 사용할 수 있습니다.fs.existsSync) 사용자 618408이 언급한 대로:

var path = require('path');
if (path.existsSync("/the/path")) { // or fs.existsSync
    // ...
}

은 지않다습니하필이 try/catch하지만 그것이 무엇인지에 대한 정보는 제공하지 않습니다. 단지 그것이 거기에 있다는 것입니다. path.existsSync오래 전에 사용되지 않았습니다.


참고 사항:동기식으로 확인하는 방법을 명시적으로 물어보셨기 때문에 저는xyzSync위 기능의 버전입니다.그러나 I/O를 사용하는 경우에는 가능한 한 동기식 통화를 피하는 것이 좋습니다.I/O 하위 시스템에 대한 호출은 CPU의 관점에서 상당한 시간이 걸립니다.전화하는 것이 얼마나 쉬운지 주목하세요.lstatSync:

// Is it a directory?
lstat('/the/path', function(err, stats) {
    if (!err && stats.isDirectory()) {
        // Yes it is
    }
});

하지만 동기화 버전이 필요하면 거기에 있습니다.

2012년 9월 업데이트

아래 답변은 몇 년 전에 나온 것으로, 지금은 좀 구식입니다.현재의 방법은 파일/디렉토리 존재에 대한 동기식 검사(또는 물론 비동기식 검사의 경우)를 수행하는 데 사용됩니다.path아래 버전.

예:

var fs = require('fs');

if (fs.existsSync(path)) {
    // Do something
}

// Or

fs.exists(path, function(exists) {
    if (exists) {
        // Do something
    }
});

2015년 2월 업데이트

그리고 여기 우리는 2015년에 있고 노드 문서는 이제 다음과 같이 말합니다.fs.existsSync)fs.exists되지 않을 (인지 확인하는하기 때문입니다; "사용되지 않을 것입니다." (노드 사람들은 그것을 열기 전에 무언가가 존재하는지 여부를 확인하는 것이 어리석다고 생각하기 때문입니다; 하지만 그것이 무언가가 존재하는지 여부를 확인하는 유일한 이유는 아닙니다!)

그래서 우리는 아마도 다양한 것들로 돌아갔을 것입니다.stat물론 이것이 다시 바뀌지 않는 한.

2015년 12월 업데이트

얼마나 오래되었는지는 모르겠지만 /도 있습니다. 그리고 적어도 2016년 10월 현재 문서는 다음을 사용할 것을 권장합니다.fs.access존재 확인("이후 파일을 조작하지 않고 파일이 존재하는지 확인하는 것이 좋습니다.")을 수행합니다.그러나 액세스할 수 없는 것은 오류로 간주되므로 파일에 액세스할 수 있을 것으로 예상되는 경우 이 방법이 가장 좋습니다.

var fs = require('fs');

try {
    fs.accessSync(path, fs.F_OK);
    // Do something
} catch (e) {
    // It isn't accessible
}

// Or

fs.access(path, fs.F_OK, function(err) {
    if (!err) {
        // Do something
    } else {
        // It isn't accessible
    }
});

2016년 12월 업데이트

다음을 사용할 수 있습니다.

if (fs.existsSync(path)) {
    // Do something
}

그것은 몇 년 동안 사용되지 않았지만, 더 이상 그렇지 않습니다.문서에서:

:fs.exists()더 이상 사용되지 않습니다.fs.existsSync() ( 매개 변수는 " " " 입니다." (" " " " " " " " " " ):fs.exists()에서는 다른 Node.js 콜백과 일치하지 않는 매개 변수를 허용합니다. fs.existsSync()콜백을 사용하지 않습니다.)

출처를 보면, 동기화된 버전이 있습니다.path.exists-path.existsSync서류에서 누락된 것 같습니다.

업데이트:

path.exists그리고.path.existsSync이제 더 이상 사용되지 않습니다.사용하십시오.

2016년 업데이트:

fs.exists 그리고 또한 더 이상 사용되지 않습니다.대신 fs.stat() 또는 fs.access()사용합니다.

2019년 업데이트:

사용하다fs.existsSync그것은 사용되지 않습니다.https://nodejs.org/api/fs.html#fs_fs_existssync_path

Node 문서에 따라 2015년 기준으로 현재 권장되는 API를 사용하면 다음과 같습니다.

var fs = require('fs');

function fileExists(filePath)
{
    try
    {
        return fs.statSync(filePath).isFile();
    }
    catch (err)
    {
        return false;
    }
}

@broadband가 댓글에서 제기한 EPERM 문제에 대해 좋은 지적을 제기합니다.fileExists()는 대부분의 경우 부울 반환을 보장할 수 없기 때문에 이에 대해 생각하는 좋은 방법이 아닐 수 있습니다.파일이 존재하는지 또는 존재하지 않는지 확인할 수 있지만 권한 오류가 발생할 수도 있습니다.확인 중인 파일이 들어 있는 디렉터리에 대한 권한이 부족할 수 있으므로 사용 권한 오류가 파일이 있음을 의미하지는 않습니다.물론 파일 존재를 확인하는 동안 다른 오류가 발생할 수도 있습니다.

그래서 위의 제 코드는 정말 File Exist And Do입니다.액세스 권한이 있지만(), doesFileNotExist가 문제일 수 있습니다.앤드 캔ICreateIt()는 완전히 다른 논리입니다(EPERM 오류 등을 설명해야 함).

fs.existsSync 답변은 여기서 묻는 질문을 직접 해결하지만, 이는 종종 원하는 것이 아닙니다("무엇"이 경로에 존재하는지"만 알고 싶어하는 것이 아니라 존재하는 "물건"이 파일인지 디렉토리인지에 관심이 있습니다).

결론은 파일이 존재하는지 확인하는 경우 결과에 따라 어떤 조치를 취하려고 하기 때문에 그렇게 하고 있을 수 있으며, 그 논리(검사 및/또는 후속 조치)는 해당 경로에서 발견된 것이 파일 또는 디렉토리일 수 있다는 생각을 수용해야 한다는 것입니다.확인하는 과정에서 EPERM 또는 기타 오류가 발생할 수 있습니다.

다른 업데이트

이 질문에 대한 답이 필요하여 직접 노드 문서를 찾아봤는데, fs.exists를 사용하지 말고 fs.open을 사용하고 출력 오류를 사용하여 파일이 존재하지 않는지 탐지해야 합니다.

문서에서:

fs.fs.fs.는 시대착오적이고 역사적인 이유만으로 존재합니다.당신 자신의 코드에서 그것을 사용할 이유가 거의 없어야 합니다.

특히 파일을 열기 전에 파일이 존재하는지 확인하는 것은 경쟁 조건에 취약하게 만드는 안티패턴입니다. 다른 프로세스는 tof.exists()와 fs.open() 호출 사이의 파일을 제거할 수 있습니다.파일을 열고 오류가 없을 때 처리하기만 하면 됩니다.

http://nodejs.org/api/fs.html#fs_fs_exists_path_callback

아래 기능을 사용하여 파일이 존재하는지 테스트합니다.또한 다른 예외도 포착합니다.그래서 권리 문제가 있을 경우를 대비해서 예를 들어.chmod ugo-rwx filename 는Windows 서에서 사용할 수 있습니다.Right Click -> Properties -> Security -> Advanced -> Permission entries: empty list ..함수는 예외를 반환해야 합니다.파일이 있지만 액세스 권한이 없습니다.이런 종류의 예외를 무시하는 것은 잘못된 것입니다.

function fileExists(path) {

  try  {
    return fs.statSync(path).isFile();
  }
  catch (e) {

    if (e.code == 'ENOENT') { // no such file or directory. File really does not exist
      console.log("File does not exist.");
      return false;
    }

    console.log("Exception fs.statSync (" + path + "): " + e);
    throw e; // something else went wrong, we don't have rights, ...
  }
}

예외 출력, nodejs 오류 문서(파일이 없는 경우):

{
  [Error: ENOENT: no such file or directory, stat 'X:\\delsdfsdf.txt']
  errno: -4058,
  code: 'ENOENT',
  syscall: 'stat',
  path: 'X:\\delsdfsdf.txt'
}

파일에 대한 권한이 없지만 존재하는 경우 예외:

{
  [Error: EPERM: operation not permitted, stat 'X:\file.txt']
  errno: -4048,
  code: 'EPERM',
  syscall: 'stat',
  path: 'X:\\file.txt'
}
const fs = require('fs');

아래와 같은 기능을 확인합니다.

if(fs.existsSync(<path_that_need_to_be_checked>)){
  // enter the code to excecute after the folder is there.
}
else{
  // Below code to create the folder, if its not there
  fs.mkdir('<folder_name>', cb function);
}

fs.dll은 더 이상 사용하지 않습니다. https://nodejs.org/api/fs.html#fs_fs_exists_path_callback

https://github.com/nodejs/node-v0.x-archive/blob/master/lib/module.js#L86 에서 사용되는 코어 nodejs 방법을 구현할 수 있습니다.

function statPath(path) {
  try {
    return fs.statSync(path);
  } catch (ex) {}
  return false;
}

그러면 stats 개체가 반환되고 stats 개체를 얻으면 시도할 수 있습니다.

var exist = statPath('/path/to/your/file.js');
if(exist && exist.isFile()) {
  // do something
}

여기에 있는 몇 가지 대답은fs.exists그리고.fs.existsSync둘 다 사용되지 않습니다.문서에 따르면 이것은 더 이상 사실이 아닙니다..fs.exists이제 제거되었습니다.

fs.exists()는 더 이상 사용되지 않지만 fs.existsSync()는 사용되지 않습니다. (callback 매개 변수 tofs.exists()는 다른 Node.js callback.fs.existsSync()와 일치하지 않는 매개 변수를 허용합니다.)

따라서 fs.existsSync()를 안전하게 사용하여 파일이 있는지 동기화할 수 있습니다.

path의 모이듈의제않습다니공을 .path.exists그래서 당신은 그것을 가지고 장난쳐야 합니다.fs모듈.

내가 상상할 수 있는 가장 빠른 것은 사용하는 것입니다.fs.realpathSync이것은 당신이 잡아야 할 오류를 던질 것이므로, 당신은 시도/실패를 통해 당신만의 래퍼 기능을 만들어야 합니다.

fileSystem(fs) 테스트를 사용하면 오류 개체가 트리거되며, 오류 개체를 try/catch 문으로 묶어야 합니다.수고를 덜고 0.4.x 분기에 소개된 기능을 사용합니다.

var path = require('path');

var dirs = ['one', 'two', 'three'];

dirs.map(function(dir) {
  path.exists(dir, function(exists) {
    var message = (exists) ? dir + ': is a directory' : dir + ': is not a directory';
    console.log(message);
  });
});

업데이트된 답변은 질문에 직접적으로 대답하지 않으며, 더 많은 대안을 제공한다는 점을 지적하는 '주의'를 가진 사람들을 위해 업데이트되었습니다.

솔루션 동기화:

fs.existsSync('filePath')여기에서도 문서를 참조하십시오.

경로가 있으면 true를 반환하고, 없으면 false를 반환합니다.

비동기 Promise 솔루션

비동기 컨텍스트에서는 다음을 사용하여 동기화 방법으로 비동기 버전을 쓸 수 있습니다.await例드:을 간단히할 수 .비동기 콜백 방법을 다음과 같은 약속으로 간단히 전환할 수 있습니다.

function fileExists(path){
  return new Promise((resolve, fail) => fs.access(path, fs.constants.F_OK, 
    (err, result) => err ? fail(err) : resolve(result))
  //F_OK checks if file is visible, is default does no need to be specified.

}

async function doSomething() {
  var exists = await fileExists('filePath');
  if(exists){ 
    console.log('file exists');
  }
}

접속 중인 문서들

fs.extra(npmifs-extra) 및 fs.ensureFile을 사용하거나 fs.sureDirfincefs.exists 디렉토리에 대해 fs.exe 파일을 사용할 수 있으며 fs.access()를 사용하여 fs.open(), fs.readFile() 또는 fs.writeFile()을 호출하기 전에 파일의 액세스 가능성을 확인하지 않도록 권장합니다.이렇게 하면 다른 프로세스가 두 호출 간에 파일의 상태를 변경할 수 있기 때문에 경쟁 상태가 발생합니다.대신 사용자 코드는 파일을 직접 열고/읽고/쓰며 파일에 액세스할 수 없는 경우 발생하는 오류를 처리해야 합니다."

의 문서에는 파일을 조작하지 않을 경우 사용하라고 나와 있습니다.그것은 정당성을 부여하지 않았습니다. 메모리 사용이 더 빠를 수도 있고 덜 짧을 수도 있습니다.

저는 선형 자동화를 위해 노드를 사용하기 때문에 파일 존재 여부를 테스트할 때 사용하는 기능을 공유한다고 생각했습니다.

var fs = require("fs");

function exists(path){
    //Remember file access time will slow your program.
    try{
        fs.accessSync(path);
    } catch (err){
        return false;
    }
    return true;
}

이는 이미 응답되었지만 모듈을 설치하는 것을 좋아한다면 을 사용할 수 있습니다. 이는 다음을 의미합니다.

파일이 존재합니까?

const dtfe = require('dtfe');
 
dtfe('package.json');
//=> true

❄️ 사용할 수 있습니다.graph-fs

directory.exists // boolean

이를 위한 간단한 래퍼 솔루션은 다음과 같습니다.

var fs = require('fs')
function getFileRealPath(s){
    try {return fs.realpathSync(s);} catch(e){return false;}
}

용도:

  • 디렉토리와 파일 모두에 사용 가능
  • 항목이 있는 경우 파일 또는 디렉토리의 경로를 반환합니다.
  • 품목이 존재하지 않으면 false를 반환합니다.

예:

var realPath,pathToCheck='<your_dir_or_file>'
if( (realPath=getFileRealPath(pathToCheck)) === false){
    console.log('file/dir not found: '+pathToCheck);
} else {
    console.log('file/dir exists: '+realPath);
}

=== 연산자를 사용하여 반환이 거짓인지 테스트해야 합니다.적절한 작업 조건에서 fs.realpathSync()가 false를 반환할 논리적인 이유가 없으므로 100% 작동해야 한다고 생각합니다.

오류가 발생하지 않고 성능이 저하되지 않는 솔루션을 보고 싶습니다.API 관점에서 fs.exists()는 가장 우아한 솔루션으로 보입니다.

답변을 보면 이에 대한 공식적인 API 지원은 없는 것으로 보입니다(직접적이고 명시적인 확인에서와 같이).stat을 사용하라는 답변이 많지만 엄격하지는 않습니다.예를 들어 stat에서 발생한 오류가 존재하지 않는다는 것을 의미한다고 가정할 수 없습니다.

존재하지 않는 것과 함께 사용해 보겠습니다.

$ node -e 'require("fs").stat("god",err=>console.log(err))'
{ Error: ENOENT: no such file or directory, stat 'god' errno: -2, code: 'ENOENT', syscall: 'stat', path: 'god' }

존재하지만 액세스할 수 없는 것으로 테스트해 보겠습니다.

$ mkdir -p fsm/appendage && sudo chmod 0 fsm
$ node -e 'require("fs").stat("fsm/appendage",err=>console.log(err))'
{ Error: EACCES: permission denied, stat 'access/access' errno: -13, code: 'EACCES', syscall: 'stat', path: 'fsm/appendage' }

최소한 당신은 원할 것입니다:

let dir_exists = async path => {
    let stat;
    try {
       stat = await (new Promise(
           (resolve, reject) => require('fs').stat(path,
               (err, result) => err ? reject(err) : resolve(result))
       ));
    }
    catch(e) {
        if(e.code === 'ENOENT') return false;
        throw e;
    }

    if(!stat.isDirectory())
        throw new Error('Not a directory.');

    return true;
};

실제로 동기화할 것인지 아니면 동기화할 것처럼 기록할 것인지에 대한 질문은 명확하지 않습니다.이 예에서는 wait/async를 사용하여 동기식으로만 작성되고 비동기식으로 실행됩니다.

즉, 최상위 수준에서 이를 다음과 같이 불러야 합니다.

(async () => {
    try {
        console.log(await dir_exists('god'));
        console.log(await dir_exists('fsm/appendage'));
    }
    catch(e) {
        console.log(e);
    }
})();

다른 방법은 .then 및 .catch를 사용하여 비동기 호출에서 반환된 약속을 추가로 필요한 경우 이를 실행하는 것입니다.

존재하는 항목이 있는지 확인하려면 디렉토리나 파일과 같은 올바른 유형의 항목인지 확인하는 것이 좋습니다.이는 예제에 포함되어 있습니다.심볼릭 링크가 허용되지 않는 경우 stat 대신 lstat을 사용해야 합니다. stat은 링크를 자동으로 통과합니다.

여기에 있는 모든 비동기-동기화 코드를 교체하고 statSync를 대신 사용할 수 있습니다.그러나 일단 비동기 및 대기가 보편적으로 지원되면 동기 호출은 결국 중복되어 감가상각될 것입니다(그렇지 않으면 비동기와 마찬가지로 체인 전체에서 정의해야 합니다).

파일이 있는지 여부를 확인하려면 파일이 있는지 여부를 확인해야 합니다.

function getFile(path){
    try{
        return require(path);
    }catch(e){
        return false;
    }
}

언급URL : https://stackoverflow.com/questions/4482686/check-synchronously-if-file-directory-exists-in-node-js

반응형