如何使用node.js同步检查文件或目录是否存在?
当前回答
很可能,如果你想知道文件是否存在,你计划在它存在的时候需要它。
function getFile(path){
try{
return require(path);
}catch(e){
return false;
}
}
其他回答
另一个更新
我自己需要这个问题的答案,我查阅了节点文档,似乎您不应该使用fs.exists,而是使用fs.open并使用输出的错误来检测文件是否不存在:
从文档中:
fs.exists()是一个时代错误,只因历史原因而存在。在您自己的代码中使用它几乎没有任何理由。特别是,在打开文件之前检查文件是否存在让你容易受到种族状况影响的反模式:另一种进程可能会在调用fs.exists()和fs.open()。只需打开文件并在不存在时处理错误那里
http://nodejs.org/api/fs.html#fs_fs_exists_path_callback
查看源代码,有一个同步版本的path.exists-path.existsSync。看起来文档中没有找到它。
更新:
path.exists和path.existsSync现在已弃用。请使用fs.exists和fs.existsSync。
2016年更新:
fs.exists和fs.existsSync也已被弃用。请改用fs.stat()或fs.access()。
2019年更新:
使用fs.existsSync。它没有被弃用。https://nodejs.org/api/fs.html#fs_fs_existssync_path
从答案来看,似乎没有官方的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);
}
})();
另一种方法是在异步调用返回的promise上使用.then和.catch。
如果你想检查某个东西是否存在,那么最好确保它是正确类型的东西,比如目录或文件。这包括在示例中。如果不允许使用符号链接,则必须使用lstat而不是stat,因为stat将自动遍历链接。
您可以替换此处的所有异步到同步代码,改用statSync。然而,一旦异步和等待成为普遍支持,Sync调用将变得多余,最终将被贬值(否则,您将不得不在所有地方和链上定义它们,就像异步一样,使其变得毫无意义)。
path模块不提供path.exists的同步版本,因此必须使用fs模块。
我能想到的最快的事情是使用fs.realpathSync,它将抛出一个必须捕获的错误,因此您需要使用try/catch创建自己的包装函数。
很可能,如果你想知道文件是否存在,你计划在它存在的时候需要它。
function getFile(path){
try{
return require(path);
}catch(e){
return false;
}
}
推荐文章
- DeprecationWarning:当我将脚本移动到另一个服务器时,由于安全性和可用性问题,Buffer()已弃用
- 我如何确定正确的“max-old-space-size”为Node.js?
- npm犯错!代码UNABLE_TO_GET_ISSUER_CERT_LOCALLY
- Access-Control-Allow-Origin不允许Origin < Origin >
- 如何获得所有已注册的快捷路线?
- 你可以为你的组织托管一个私有的存储库来使用npm吗?
- 如何定位父文件夹?
- Gulp命令未找到-安装Gulp后错误
- 在Node.js中写入文件时创建目录
- 如何将自定义脚本添加到包中。Json文件,运行javascript文件?
- 使用child_process。execSync但保持输出在控制台
- SyntaxError:在严格模式下使用const
- 在Node.js中递归复制文件夹
- 如何在node.js中设置默认时区?
- “react-scripts”不被视为内部或外部命令