파일이나 디렉토리가 존재하는 경우 node.js를 사용하여 어떻게 동기적으로 확인할 수 있습니까?
질문자 :Ragnis
이 질문에 대한 답은 수년에 걸쳐 바뀌었습니다. 현재 답변은 여기 맨 위에 있으며 시간순으로 몇 년에 걸친 다양한 답변이 뒤따릅니다.
현재 답변
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년의 원래 답변:
fs.Stats
객체 를 제공하는 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
이 언급한 path.existsSync
(또는 최신 fs.existsSync와 함께 사용)를 사용할 수 있습니다.
var path = require('path'); if (path.existsSync("/the/path")) { // or fs.existsSync // ... }
try/catch
필요하지 않지만 그것이 무엇인지에 대한 정보는 제공하지 않습니다.
Community Wiki
path.exists
- path.existsSync
의 동기 버전이 있습니다. 문서에서 누락 된 것 같습니다.
업데이트:
path.exists
및 path.existsSync
는 이제 더 이상 사용되지 않습니다 . .fs.exists
및 fs.existsSync
사용하십시오
2016년 업데이트:
fs.exists
및 더 이상 사용되지 않습니다 . 대신 fs.stat() 또는 fs.access()를 사용하십시오.fs.existsSync
도
2019년 업데이트:
fs.existsSync
사용합니다. 더 이상 사용되지 않습니다. https://nodejs.org/api/fs.html#fs_fs_existssync_path
Jeff
현재 권장되는(2015년 기준) API(Node 문서에 따라)를 사용하여 다음과 같이 합니다.
var fs = require('fs'); function fileExists(filePath) { try { return fs.statSync(filePath).isFile(); } catch (err) { return false; } }
댓글에서 @broadband가 제기한 EPERM 문제에 대한 응답으로 좋은 점을 제시합니다. fileExists()는 실제로 부울 반환을 약속할 수 없기 때문에 fileExists()는 많은 경우 이에 대해 생각하는 좋은 방법이 아닙니다. 파일이 존재하는지 여부를 확실히 결정할 수 있지만 권한 오류가 발생할 수도 있습니다. 권한 오류가 반드시 파일이 존재함을 의미하는 것은 아닙니다. 검사 중인 파일이 포함된 디렉토리에 대한 권한이 부족할 수 있기 때문입니다. 물론 파일 존재 여부를 확인하는 과정에서 다른 오류가 발생할 가능성도 있습니다.
따라서 위의 코드는 실제로 dosFileExistAndDoIHaveAccessToIt()이지만 귀하의 질문은 완전히 다른 논리(무엇보다도 EPERM 오류를 설명해야 함)인 dosFileNotExistAndCouldICreateIt()일 수 있습니다.
fs.existsSync 답변이 여기에서 묻는 질문을 직접 해결하지만, 그것은 종종 당신이 원하는 것이 아닐 것입니다 (당신은 "무언가"가 경로에 존재하는지 알고 싶어하지 않을 것입니다. 아마도 "사물"이 존재하는 파일 또는 디렉토리).
결론은 파일이 존재하는지 확인하기 위해 검사하는 경우 결과를 기반으로 몇 가지 작업을 수행하려고 하고 해당 논리(검사 및/또는 후속 작업)가 아이디어를 수용해야 하기 때문에 그렇게 하는 것일 수 있습니다. 해당 경로에서 발견된 것이 파일 또는 디렉토리일 수 있으며 확인하는 과정에서 EPERM 또는 기타 오류가 발생할 수 있습니다.
BobDickinson
또 다른 업데이트
이 질문에 자신에 대한 답변을 필요로 내가 노드 문서를보고, 당신이 파일이 존재하지 않는 경우 감지 fs.open 사용하고 출력 오류를 사용하는 대신, fs.exists를 사용하지 해봐야 할 것 같습니다 :
문서에서 :
fs.exists()는 시대착오적이며 역사적 이유로만 존재합니다. 자신의 코드에서 사용할 이유가 거의 없습니다.
특히 파일을 열기 전에 파일이 존재하는지 확인하는 것은 경쟁 조건에 취약하게 만드는 안티 패턴입니다. 다른 프로세스가 fs.exists() 및 fs.open() 호출 사이에 파일을 제거할 수 있습니다. 파일을 열고 파일이 없을 때 오류를 처리하기만 하면 됩니다.
Melbourne2991
파일이 존재하는지 테스트하기 위해 아래 함수를 사용합니다. 다른 예외도 포착합니다. 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' }
broadband
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 }
gsalgadotoledo
여기에 대한 일부 답변은 fs.exists
및 fs.existsSync
가 모두 더 이상 사용되지 않는다고 말합니다. 문서에 따르면 이것은 더 이상 사실이 아닙니다. fs.exists
만 더 이상 사용되지 않습니다.
fs.exists()는 더 이상 사용되지 않지만 fs.existsSync()는 사용되지 않습니다. (fs.exists()에 대한 콜백 매개변수는 다른 Node.js 콜백과 일치하지 않는 매개변수를 허용합니다. fs.existsSync()는 콜백을 사용하지 않습니다.)
따라서 fs.existsSync() 를 사용하여 파일이 존재하는지 동기적으로 확인할 수 있습니다.
jstice4all
path
모듈은 path.exists의 동기 버전을 제공하지 않으므로 fs
모듈을 사용하여 path.exists
내가 상상할 수 있는 가장 빠른 방법은 fs.realpathSync
하는 오류가 발생하므로 try/catch로 래퍼 함수를 직접 만들어야 합니다.
Ivo Wetzel
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); }); });
user1248475
질문에 직접 대답하지 않고 더 많은 대안 옵션을 제공한다고 지적하는 사람들을 위해 업데이트된 답변입니다.
동기화 솔루션:
fs.existsSync('filePath')
도 여기에서 문서 를 참조하십시오.
경로가 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.
비동기 약속 솔루션
await
키워드를 사용하여 동기화 방법으로 비동기 버전을 작성할 수 있습니다. 다음과 같이 비동기 콜백 메서드를 promise로 간단히 전환할 수 있습니다.
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'); } }
access()에 대한 문서.
Joel Harkes
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); }
Vijay G
이것은 이미 답변되어 있지만 모듈 설치를 좋아한다면 dtfe
파일이 존재합니까?
const dtfe = require('dtfe'); dtfe('package.json'); //=> true
abranhe
fs-extra (npm i fs-extra) 및 해당 fs.ensureFile 또는 디렉토리 fs.ensureDir에 대해 사용할 수 있습니다. fs.open(), fs.readFile() 또는 fs.writeFile()을 호출하기 전에 fs.access()를 사용하여 파일의 액세스 가능성을 확인하십시오. 이렇게 하면 다른 프로세스가 파일의 상태를 대신 사용자 코드는 파일을 직접 열고/읽고/쓰기해야 하며 파일에 액세스할 수 없는 경우 발생하는 오류를 처리해야 합니다."
Fisheiyy
fs.stat()
에 대한 문서는 파일을 조작하지 않으fs.access()
를 사용하라고 말합니다. 그것은 정당성을 제공하지 않았습니다, 더 빠르거나 더 적은 메모리 사용이 될 수 있습니까?
나는 선형 자동화를 위해 노드를 사용하므로 파일 존재 여부를 테스트하는 데 사용하는 기능을 공유한다고 생각했습니다.
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; }
Grallen
그래프-fs
설치
npm i graph-fs
사용하다
const {Node} = require("graph-fs"); const directory = new Node("/path/to/directory"); directory.exists; // <--
Yairopro
다음은 이에 대한 간단한 래퍼 솔루션입니다.
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); }
=== 연산자를 사용하여 return이 false인지 테스트하는지 확인하십시오. fs.realpathSync()가 적절한 작업 조건에서 false를 반환할 논리적 이유가 없으므로 이것이 100% 작동해야 한다고 생각합니다.
오류 및 결과적인 성능 저하를 생성하지 않는 솔루션을 보고 싶습니다. API 관점에서 fs.exists()는 가장 우아한 솔루션처럼 보입니다.
Timothy C. Quinn
답변에서 이에 대한 공식 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; };
실제로 동기화되기를 원하는지 또는 동기화된 것처럼 작성되기를 원하는지 여부에 대한 질문은 명확하지 않습니다. 이 예제에서는 await/async를 사용하여 동기식으로만 작성되지만 비동기식으로 실행됩니다.
즉, 최상위 수준에서 다음과 같이 호출해야 합니다.
(async () => { try { console.log(await dir_exists('god')); console.log(await dir_exists('fsm/appendage')); } catch(e) { console.log(e); } })();
대안은 더 필요한 경우 비동기 호출에서 반환된 약속에 .then 및 .catch를 사용하는 것입니다.
어떤 것이 존재하는지 확인하고 싶다면 디렉토리나 파일과 같은 올바른 유형인지 확인하는 것도 좋은 방법입니다. 이것은 예제에 포함되어 있습니다. 심볼릭 링크가 허용되지 않는 경우 stat가 자동으로 링크를 트래버스하므로 stat 대신 lstat를 사용해야 합니다.
여기에서 모든 비동기를 교체하여 코드를 동기화하고 대신 statSync를 사용할 수 있습니다. 그러나 일단 async 및 await가 보편적으로 지원되면 Sync 호출이 중복되어 결국 감가상각될 것입니다.
jgmjgm
파일이 존재하는지 알고 싶다면 파일이 존재하는 경우 이를 요구할 계획입니다.
function getFile(path){ try{ return require(path); }catch(e){ return false; } }
SwiftNinjaPro
출처 : http:www.stackoverflow.com/questions/4482686/check-synchronously-if-file-directory-exists-in-node-js
'etc. > StackOverFlow' 카테고리의 다른 글
Matplotlib를 사용하여 표시하는 대신 이미지 파일에 플롯 저장 (0) | 2022.07.09 |
---|---|
iOS 또는 macOS에서 활성 인터넷 연결을 확인하려면 어떻게 해야 합니까? (0) | 2022.07.09 |
Android 8: 일반 텍스트 HTTP 트래픽이 허용되지 않음 (0) | 2022.07.09 |
JSON 문자열을 객체로 안전하게 변환 (0) | 2022.07.09 |
JavaScript 문자열을 모두 소문자로 변환하시겠습니까? (0) | 2022.07.09 |