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
( docs link )를 사용할 수 있습니다 . 일반적으로 함수의 동기 버전을 사용할 수 있는 경우 끝에 있는 비동기 버전과 이름이 같습니다 . 의 동기 버전도 마찬가지 입니다 . 등 의 동기 버전입니다 .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 년에있는 노드의 문서가 지금 그런 말을 fs.existsSync
(그리고 fs.exists
"더 이상 사용되지 않습니다"). (노드 사람들은 그것을 열기 전에 무언가 존재하는지 확인하는 것이 멍청하다고 생각하기 때문에, 그것이 존재하는지 확인하는 유일한 이유는 아닙니다!)
그래서 우리는 아마도 다양한 stat
방법으로 돌아 왔을 것입니다 . 물론 이것이 다시 변하지 않는 한.
2015 년 12 월 업데이트
얼마나 오래 있었는지 모르지만 fs.access(path, fs.F_OK, ...)
/fs.accessSync(path, fs.F_OK)
. 그리고 적어도 2016 년 10 월부터 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.exists
fs.existsSync
2016 업데이트 :
fs.exists
그리고 fs.existsSync
또 한 사용되지 않습니다 . 대신 fs.stat () 또는 fs.access ()를 사용하십시오.
현재 권장되는 (2015 년 기준) API (노드 문서 당)를 사용하여 다음을 수행합니다.
var fs = require('fs');
function fileExists(filePath)
{
try
{
return fs.statSync(filePath).isFile();
}
catch (err)
{
return false;
}
}
댓글에서 @broadband가 제기 한 EPERM 문제에 대한 응답으로 좋은 점이 있습니다. fileExists ()는 아마도 많은 경우에 이것을 생각하는 좋은 방법이 아닐 것입니다. 왜냐하면 fileExists ()는 실제로 부울 반환을 약속 할 수 없기 때문입니다. 파일이 존재하는지 또는 존재하지 않는지 확실히 결정할 수 있지만 권한 오류가 발생할 수도 있습니다. 확인중인 파일이 포함 된 디렉토리에 대한 권한이 부족할 수 있으므로 권한 오류가 반드시 파일이 존재한다는 것을 의미하지는 않습니다. 물론 파일 존재를 확인하는 데 다른 오류가 발생할 가능성이 있습니다.
따라서 위의 코드는 실제로 doesFileExistAndDoIHaveAccessToIt ()이지만 귀하의 질문은 doesFileNotExistAndCouldICreateIt () 일 수 있습니다. 이는 완전히 다른 논리 일 것입니다 (특히 EPERM 오류를 설명해야 함).
fs.existsSync 답변은 여기에서 묻는 질문을 직접 해결하지만 원하는 것이 아닐 수 있습니다 (경로에 "무언가"가 있는지 알고 싶지만 "사물"이 있는지 여부에 관심이있을 수 있음). 존재하는 파일 또는 디렉토리).
결론은 파일이 존재하는지 확인하는 경우 결과를 기반으로 어떤 조치를 취하고 그 논리 (확인 및 / 또는 후속 조치)가 아이디어를 수용해야하기 때문에 그렇게하는 것입니다. 해당 경로에서 발견 된 것은 파일 또는 디렉토리 일 수 있으며 검사 과정에서 EPERM 또는 기타 오류가 발생할 수 있습니다.
또 다른 업데이트
이 질문에 대한 답변이 필요하면 노드 문서를 찾았습니다 .fs.exists를 사용 해서는 안되는 것 같습니다 . 대신 fs.open을 사용하고 출력 된 오류를 사용하여 파일이 존재하지 않는지 감지하십시오.
문서에서 :
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 () 를 사용 하여 파일이 있는지 동 기적으로 확인할 수 있습니다.
The path
module does not provide a synchronous version of path.exists
so you have to trick around with the fs
module.
Fastest thing I can imagine is using fs.realpathSync
which will throw an error that you have to catch, so you need to make your own wrapper function with a try/catch.
Using fileSystem (fs) tests will trigger error objects, which you then would need to wrap in a try/catch statement. Save yourself some effort, and use a feature introduce in the 0.4.x branch.
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);
});
});
The documents on fs.stat()
says to use fs.access()
if you are not going to manipulate the file. It did not give a justification, might be faster or less memeory use?
I use node for linear automation, so I thought I share the function I use to test for file existence.
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;
}
updated asnwer for those people 'correctly' pointing out it doesnt directly answer the question, more bring an alternative option.
Sync solution:
fs.existsSync('filePath')
also see docs here.
Returns true if the path exists, false otherwise.
Async Promise solution
In an async context you could just write the async version in sync method with using the await
keyword. You can simply turn the async callback method into an promise like this:
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');
}
}
the docs on access().
Here is a simple wrapper solution for this:
var fs = require('fs')
function getFileRealPath(s){
try {return fs.realpathSync(s);} catch(e){return false;}
}
Usage:
- Works for both directories and files
- If item exists, it returns the path to the file or directory
- If item does not exist, it returns false
Example:
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);
}
Make sure you use === operator to test if return equals false. There is no logical reason that fs.realpathSync() would return false under proper working conditions so I think this should work 100%.
I would prefer to see a solution that does not does not generate an Error and resulting performance hit. From an API perspective, fs.exists() seems like the most elegant solution.
From the answers it appears that there is no official API support for this (as in a direct and explicit check). Many of the answers say to use stat, however they are not strict. We can't assume for example that any error thrown by stat means that something doesn't exist.
Lets say we try it with something that doesn't exist:
$ 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' }
Lets try it with something that exists but that we don't have access to:
$ 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' }
At the very least you'll want:
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;
};
The question is not clear on if you actually want it to be syncronous or if you only want it to be written as though it is syncronous. This example uses await/async so that it is only written syncronously but runs asyncronously.
This means you have to call it as such at the top level:
(async () => {
try {
console.log(await dir_exists('god'));
console.log(await dir_exists('fsm/appendage'));
}
catch(e) {
console.log(e);
}
})();
An alternative is using .then and .catch on the promise returned from the async call if you need it further down.
If you want to check if something exists then it's a good practice to also ensure it's the right type of thing such as a directory or file. This is included in the example. If it's not allowed to be a symlink you must use lstat instead of stat as stat will automatically traverse links.
You can replace all of the async to sync code in here and use statSync instead. However expect that once async and await become universally supports the Sync calls will become redundant eventually to be depreciated (otherwise you would have to define them everywhere and up the chain just like with async making it really pointless).
참고URL : https://stackoverflow.com/questions/4482686/check-synchronously-if-file-directory-exists-in-node-js
'development' 카테고리의 다른 글
React JSX 내부 루프 (0) | 2020.09.27 |
---|---|
Django는 확장됩니까? (0) | 2020.09.27 |
ArrayList 변환 (0) | 2020.09.27 |
주어진 요소에 클래스를 어떻게 추가합니까? (0) | 2020.09.27 |
Node.js의 Express.js에서 GET (쿼리 문자열) 변수를 얻는 방법은 무엇입니까? (0) | 2020.09.27 |