如何使用node.js同步检查文件或目录是否存在?
当前回答
这已经得到了回答,但如果您喜欢安装模块,可以使用dtfe,它代表
文件是否存在?
const dtfe = require('dtfe');
dtfe('package.json');
//=> true
其他回答
fs.exists()已弃用,请勿使用https://nodejs.org/api/fs.html#fs_fs_exists_path_callback
您可以使用以下方式实现核心nodejs:https://github.com/nodejs/node-v0.x-archive/blob/master/lib/module.js#L86
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
}
使用当前推荐的(截至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()检查文件的可访问性。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应该直接打开/读取/写入文件,并在文件不可访问时处理引发的错误。"
我使用下面的函数来测试文件是否存在。它还捕捉到其他例外。因此,如果存在权限问题,例如chmod ugo rwx文件名或在Windows中右键单击->财产->安全->高级->权限条目:空列表。。函数应返回异常。该文件存在,但我们无权访问它。忽略此类异常是错误的。
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'
}
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);
}
推荐文章
- 错误:无法找到模块“webpack”
- 在node.js中使用async / await文件系统
- NodeJS -用NPM安装错误
- 如何为本地安装npm包设置自定义位置?
- 回调函数来处理管道的完成
- Express函数中的“res”和“req”参数是什么?
- node.js TypeError:路径必须是绝对路径或指定根路径到res.sendFile[解析JSON失败]
- Passport.js -错误:序列化用户到会话失败
- Node.js vs .Net性能
- 从电子应用程序中删除菜单栏
- 如何用node.js实现一个安全的REST API
- 如何处理Node.js中的循环依赖
- 在猫鼬,我如何排序的日期?(node . js)
- 如何在Node.js内进行远程REST调用?旋度吗?
- 如何用分发文件发布npm包?