同步检查Node.js中是否存在文件/目录

如何使用node.js同步检查文件或目录是否存在

多年来,这个问题的答案发生了变化。当前的答案在顶部,然后是历年来按时间顺序排列的各种答案:

当前答案

您可以使用fs.existsSync()

const fs=require(“fs”);//或“从“fs”导入fs”`与ESM
if(fs.existsSync(路径)){
//做点什么
}

它被弃用了好几年,但现在不再是了。从文档中:

请注意,fs.exists()已被弃用,但fs.existsSync()未被弃用。(修订)
回调参数到fs.exists()接受
与其他Node.js回调不一致。fs.existsSync()不一致
使用回调。)

您特别要求进行同步检查,但如果您可以使用异步检查(通常最好使用I/O),如果您使用的是async函数,请使用fs.promises.access,否则请使用fs.access(因为存在不推荐):

async函数中:

试试看{
等待fs.promises.access(“somefile”);
//检查成功了
}捕获(错误){
//检查失败了
}

或通过回调:

fs.access(“somefile”,错误=&gt{
如果(!错误){
//检查成功了
}否则{
//检查失败了
}
});


历史答案

以下是按时间顺序排列的历史答案:

  • 2010年的原始答案

    stat/statSynclstat/lstatSync

  • 2012年9月更新

    存在/存在同步

  • 2015年2月更新

    (注意到即将被弃用,存在/existsSync,因此我们可能回到stat/statSynclstat/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年的原始答复:

您可以使用statSynclstatSync(文档链接),这将为您提供一个fs.Stats对象。通常,如果函数的同步版本可用,它将与异步版本具有相同的名称,并在末尾使用Sync。因此statSyncstat的同步版本lstatSync是同步版本的lstat

lstatSync告诉您是否存在某个内容,如果存在,它是文件还是目录(或者在某些文件系统中是符号链接、块设备、字符设备等),例如,如果您需要知道它是否存在并且是目录:

var fs=require('fs');
试一试{
//查询条目
stats=fs.lstatSync('/the/path');
//它是目录吗?
if(stats.isDirectory()){
//是的
}
}
捕获(e){
// ...
}

…同样,如果它是一个文件,则有isFile;如果是块设备,则有isBlockDevice等。注意try/catch;如果条目根本不存在,它将抛出一个错误

如果您不关心条目是什么,只想知道它是否存在,您可以使用用户618408注意到的path.existsSync(或使用最新的fs.existsSync):

var path=require('path');
if(path.existsSync(“/the/path”){//或fs.existsSync
// ...
}

它不需要try/catch,但不提供关于它是什么的信息,只是它在那里。path.existsSync很久以前就被弃用了


旁注:您明确询问了如何同步检查,因此我使用了上述函数的xyzync版本。但在可能的情况下,使用I/O时,最好避免同步调用。从CPU的角度来看,对I/O子系统的调用需要花费大量的时间。请注意,调用lstat而不是lstatSync是多么容易:

//它是一个目录吗?
lstat('/the/path',函数(err,stats){
如果(!err&stats.isDirectory()){
//是的
}
});

但是如果你需要同步版本,它就在那里

2012年9月更新

以下几年前的答案现在有点过时了。当前的方法是使用fs.existsSync同步检查文件/目录是否存在(当然,对于异步检查,fs.exists),而不是下面的路径版本

例如:

var fs=require('fs');
if(fs.existsSync(路径)){
//做点什么
}
//或
fs.exists(路径、函数(exists){
如果(存在){
//做点什么
}
});

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’);
试一试{
fs.accessSync(路径,fs.F_OK);
//做点什么
}捕获(e){
//它是不可接近的
}
//或
fs.access(路径、fs.F_确定、函数(错误){
如果(!err){
//做点什么
}否则{
//它是不可接近的
}
});

2016年12月更新

您可以使用fs.existsSync()

if(fs.existsSync(path)){
//做点什么
}

它被弃用了好几年,但现在不再是了。从文档中:

请注意,fs.exists()已被弃用,但fs.existsSync()未被弃用。(修订)
回调参数到fs.exists()接受
与其他Node.js回调不一致。fs.existsSync()不一致
使用回调。)

发表评论