[node.js] Node.js에 파일 / 디렉토리가 있는지 동 기적으로 확인

파일이나 디렉토리가 존재하는 경우 node.js를 사용하여 동기식으로 어떻게 확인할 수 있습니까?



답변

이 질문에 대한 답변은 수년에 걸쳐 변경되었습니다. 현재의 대답은 연대순으로 수년에 걸쳐 다양한 답변 다음, 상단에 여기에 있습니다 :

현재 답변

당신은 사용할 수 있습니다 fs.existsSync():

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와 함께 일반적으로 가장) 대신에 수표를 사용 fs.promises.access하면 사용하는 경우 async기능 또는 fs.access(이후 exists사용되지 않습니다 )없는 경우 :

에서 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
    }
});

역사적 답변

다음은 시간순으로 기록 된 답변입니다.

  • 2010 년의 원래 답변

    ( stat/ statSync또는 lstat/ lstatSync)
  • 2012 년 9 월 업데이트

    ( exists/ existsSync)
  • 2015 년 2 월 업데이트

    ( exists/의 사용 중단이 임박 existsSync했으므로 stat/ statSync또는 lstat/로 되돌아 갈 수 있음 lstatSync)
  • 2015 년 12 월 업데이트

    ( fs.access(path, fs.F_OK, function(){})/ 도 fs.accessSync(path, fs.F_OK)있지만 파일 / 디렉토리가 존재하지 않으면 오류입니다. 열지 않고 존재 여부를 확인 해야하는 경우 fs.stat사용 fs.access하는 것이 좋습니다 . )
  • 2016 년 12 월 업데이트
    는 더 이상 사용
    fs.exists()되지 않지만 fs.existsSync()더 이상 사용되지 않습니다. 이제 안전하게 사용할 수 있습니다.

2010 년 원문 :

당신은 사용할 수 있습니다 statSync또는 lstatSync( 문서 링크 ), 당신에게 제공하는 fs.Stats객체 . 일반적으로 동기 버전의 함수를 사용할 수 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.; 항목이 존재하지 않으면 오류가 발생합니다.

항목 무엇인지 상관하지 않고 항목의 존재 여부 만 알고 싶다면 user618408에서 언급 한대로path.existsSync (또는 최신 버전으로 fs.existsSync) 사용할 수 있습니다 .

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

필요하지는 않지만 try/catch그게 무엇인지에 대한 정보는 제공 하지 않습니다 . path.existsSync오래 전에 사용되지 않습니다.


참고 사항 : 동기식 으로 확인하는 방법을 명시 적으로 요청 했으므로 xyzSync위 기능 버전을 사용했습니다 . 그러나 가능하면 I / O를 사용하면 동기 호출을 피하는 것이 가장 좋습니다. I / O 하위 시스템으로의 호출은 CPU의 관점에서 상당한 시간이 걸립니다. 전화 lstat하는 것이 얼마나 쉬운 지 참고하십시오 lstatSync.

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

그러나 동기 버전이 필요하면 거기에 있습니다.

2012 년 9 월 업데이트

몇 년 전의 아래 답변은 이제 약간 오래된 것입니다. 현재 방법은 아래 버전이 아닌 fs.existsSync파일 / 디렉토리 존재에 대한 동기 검사 (또는 fs.exists비동기 검사) 를 수행하는 데 사용 하는 것 path입니다.

예:

var fs = require('fs');

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

// Or

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

2015 년 2 월 업데이트

그리고 여기에 우리는 2015 년이며 Node 문서는 이제 ” fs.existsSync그리고 fs.exists더 이상 사용되지 않을 것”이라고 말합니다. (노드 사람들은 무언가를 열기 전에 무언가 존재하는지 확인하는 것이 멍청하다고 생각하기 때문에 그것이 존재하는지 여부를 확인하는 유일한 이유는 아닙니다!)

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

2015 년 12 월 업데이트

얼마나 오래 있었는지 모르지만 fs.access(path, fs.F_OK, ...)/도fs.accessSync(path, fs.F_OK) 있습니다. 그리고, 10 월 2016로 적어도 fs.stat설명서를 사용하는 것이 좋습니다 fs.access존재 검사를 수행하는 ( “파일이 나중에 그것을 조작하지 않고있는 경우, 확인하려면 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 월 업데이트

당신은 사용할 수 있습니다 fs.existsSync():

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

몇 년 동안 더 이상 사용되지 않지만 더 이상 사용되지 않습니다. 문서에서 :

참고 fs.exists()사용되지 있지만 fs.existsSync()아닙니다. fs.exists()다른 Node.js 콜백과 일치하지 않는 매개 변수를 허용 하는 콜백 매개 변수 fs.existsSync()는 콜백을 사용하지 않습니다.


답변

소스를 보면 동기 버전 인 path.exists-이 path.existsSync있습니다. 문서에서 누락 된 것 같습니다.

최신 정보:

path.exists그리고 path.existsSync지금 사용되지 않습니다 . 및을 사용하십시오fs.existsfs.existsSync .

2016 업데이트 :

fs.exists 그리고 fs.existsSync또 한 사용되지 않습니다 . 대신 fs.stat () 또는 fs.access ()를 사용하십시오.

2019 업데이트 :

사용하십시오 fs.existsSync. 더 이상 사용되지 않습니다.
https://nodejs.org/api/fs.html#fs_fs_existssync_path


답변

현재 권장되는 (2015 년 기준) API (노드 문서 당)를 사용하면 다음과 같습니다.

var fs = require('fs');

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

의견에서 @broadband가 제기 한 EPERM 문제에 대한 응답으로 좋은 지적을 제시합니다. fileExists ()는 실제로 부울 리턴을 약속 할 수 없기 때문에 많은 경우에 이것을 생각하는 좋은 방법이 아닐 수 있습니다. 파일이 존재하는지 또는 존재하지 않는지 확실하게 결정할 수 있지만 권한 오류가 발생할 수도 있습니다. 권한 오류는 확인중인 파일이 포함 된 디렉토리에 대한 권한이 없기 때문에 파일이 존재한다는 것을 의미하지는 않습니다. 물론 파일 존재를 확인하는 데 다른 오류가 발생할 수 있습니다.

따라서 위의 코드는 실제로 doesFileExistAndDoIHaveAccessToIt ()이지만 귀하의 질문은 doesFileNotExistAndCouldICreateIt () 일 수 있습니다. 이것은 완전히 다른 논리입니다 (특히 EPERM 오류를 설명해야 함).

fs.existsSync 답변이 여기에 직접 질문 한 내용을 해결하지만, 종종 원하는 것이 아닐 것입니다 ( “무언가”가 경로에 존재하는지 여부를 알고 싶지는 않을 것입니다. 존재하는 것은 파일 또는 디렉토리입니다).

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


답변

다른 업데이트

이 질문에 자신에 대한 답변을 필요로 내가 노드 문서를보고, 당신이해야 것 없는 파일이 존재하지 않는 경우 감지 fs.open 사용하고 출력 오류를 사용하는 대신, fs.exists를 사용 :

문서에서 :

fs.exists ()는 시대를 초월한 것이며 역사적 이유로 만 존재합니다. 자신의 코드에서 사용할 이유가 거의 없습니다.

특히 파일을 열기 전에 파일이 존재하는지 확인하면 안티 패턴으로 인해 경쟁 조건에 취약 해집니다. 다른 프로세스가 fs.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'
}


답변

fs.exists ()는 더 이상 사용되지 않습니다 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 ()는 사용되지 않습니다. fs.exists ()에 대한 콜백 매개 변수는 다른 Node.js 콜백과 일치하지 않는 매개 변수를 승인합니다. fs.existsSync ()는 콜백을 사용하지 않습니다.

따라서 fs.existsSync () 를 안전하게 사용 하여 파일이 존재하는지 동 기적으로 확인할 수 있습니다.