如何使用 node.js 同步检查文件或目录是否存在?
多年来,这个问题的答案已经改变。在 目前的 答案是在此间举行的顶部,然后用按时间顺序多年的各种答案:
您可以使用fs.existsSync():
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()不使用回调。)
fs.exists()
您已经明确要求进行 同步 检查,但是如果您可以改用 异步 检查(通常最好使用I / O),fs.promises.access请在使用async函数的情况下使用,否则fs.access(由于exists不赞成使用),请使用:
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)
stat
statSync
lstat
lstatSync
2012年9月更新 (exists/ existsSync)
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)
fs.access(path, fs.F_OK, function(){})
fs.accessSync(path, fs.F_OK)
fs.stat
2016年12月更新 fs.exists()仍不推荐使用,但fs.existsSync()不再推荐使用。因此,您现在可以安全使用它。
您可以使用statSync或lstatSync(文档链接)为您提供一个fs.Stats对象。通常,如果功能的同步版本可用,则其名称将与Sync结尾的异步版本同名。所以,statSync是的同步版本stat; lstatSync是等的同步版本lstat。
fs.Stats
Sync
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;如果条目根本不存在,则会引发错误。
isFile
isBlockDevice
try/catch
如果您不在乎该条目 是 什么,而只想知道它是否存在,则可以使用user618408指出的path.existsSync(或使用最新的fs.existsSync):
path.existsSync
fs.existsSync
var path = require('path'); if (path.existsSync("/the/path")) { // or fs.existsSync // ... }
它不需要a,try/catch但不会为您提供任何有关事物的信息,只是它在那里。path.existsSync很久以前不推荐使用。
旁注:您已经明确询问了如何 同步 检查,因此我使用了xyzSync上述功能的版本。但是,只要有可能,使用I / O最好避免同步调用。从CPU的角度来看,调用I / O子系统要花费大量时间。请注意调用lstat比lstatSync:
xyzSync
// Is it a directory? lstat('/the/path', function(err, stats) { if (!err && stats.isDirectory()) { // Yes it is } });
但是,如果您需要同步版本,则可以使用它。
下面几年前的答案现在有点过时了。当前的方法是用来fs.existsSync对文件/目录是否存在进行同步检查(或者当然 fs.exists要进行异步检查),而不是path下面的版本。
fs.exists
path
例:
var fs = require('fs'); if (fs.existsSync(path)) { // Do something } // Or fs.exists(path, function(exists) { if (exists) { // Do something } });
现在我们到了2015年,Node文档现在说fs.existsSync(和fs.exists)“将被弃用”。(因为Node员工认为在打开某个东西之前先检查是否存在某种东西是愚蠢的;但这并不是检查某个东西是否存在的唯一原因!)
因此,我们可能会回到各种stat方法…当然,除非/除非再次改变。
不知道它已经存在多久了,但是也有fs.access(path, fs.F_OK, ...)/fs.accessSync(path, fs.F_OK)。并且至少从2016年10月开始,该fs.stat文档建议使用fs.access做存在性检查( “fs.access()_建议先检查 _文件是否存在,然后再对其进行操作 。” )。但是请注意,访问不可用被认为是 错误 ,因此,如果您期望文件可访问,则可能是最好的选择:
fs.access(path, fs.F_OK, ...)
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 } });
if (fs.existsSync(path)) { // Do something }