如何使用node.js同步检查文件或目录是否存在?
当前回答
查看源代码,有一个同步版本的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
其他回答
另一个更新
我自己需要这个问题的答案,我查阅了节点文档,似乎您不应该使用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
这里有一个简单的包装解决方案:
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()似乎是最优雅的解决方案。
使用当前推荐的(截至2015年)API(根据节点文档),我会这样做:
var fs = require('fs');
function fileExists(filePath)
{
try
{
return fs.statSync(filePath).isFile();
}
catch (err)
{
return false;
}
}
针对@broadband在评论中提出的EPERM问题,这提出了一个很好的观点。在很多情况下,fileExists()可能不是一个很好的方法来考虑这一点,因为fileExistes()不能真正承诺布尔返回。您可能能够确定文件是否存在,但也可能会出现权限错误。权限错误并不一定意味着该文件存在,因为您可能对包含要检查的文件的目录缺少权限。当然,在检查文件是否存在时,也有可能遇到其他错误。
因此,我上面的代码实际上是doesFileExistAndDoIHaveAccessToIt(),但您的问题可能是doesFileNotExistAndCouldICreateIt(),这将是完全不同的逻辑(需要考虑EPERM错误等)。
虽然fs.existsSync的答案直接解决了这里提出的问题,但这通常不是您想要的(您不只是想知道路径上是否存在“某物”,您可能关心存在的“某物”是文件还是目录)。
底线是,如果您正在检查文件是否存在,那么您这样做可能是因为您打算根据结果采取一些操作,并且逻辑(检查和/或后续操作)应该考虑到在该路径中找到的东西可能是文件或目录,并且在检查过程中可能会遇到EPERM或其他错误。
您可以使用fs extra(npm i fs extra)及其fs.ensureFile或用于目录fs.ensure Dir,因为fs.exists已被取消处理,fs.access不建议您在使用该文件后对其进行编辑“在调用fs.open()、fs.readFile()或fs.writeFile()之前,不要使用fs.access()检查文件的可访问性。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应该直接打开/读取/写入文件,并在文件不可访问时处理引发的错误。"
推荐文章
- 同步和异步编程(在node.js中)的区别是什么?
- 如何编辑通过npm安装的节点模块?
- “node_modules”文件夹应该包含在git存储库中吗
- 使用package.json在全局和本地安装依赖项
- this.libOptions.parse不是一个函数
- 对嵌套文件夹运行npm install的最好方法是什么?
- 节点Multer异常字段
- 很好的初学者教程socket.io?
- CALL_AND_RETRY_LAST分配失败-进程内存不足
- 在Ubuntu上安装Node.js
- 使用express.js代理
- Node -使用NODE_MODULE_VERSION 51根据不同的Node.js版本编译
- RabbitMQ / AMQP:单队列,同一消息的多个消费者?
- Node.js同步执行系统命令
- 禁用包的postinstall脚本