小编典典

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

all

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


阅读 277

收藏
2022-02-25

共1个答案

小编典典

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

当前答案

您可以使用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()不使用回调。)

您已明确要求进行 同步 检查,但如果您可以使用 异步 检查(通常最好使用
I/O),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/statSynclstat/ lstatSync

  • 2012 年 9 月更新
    ( exists/ existsSync)

  • 2015 年 2 月更新
    (注意即将弃用exists/ 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年的原始答案:

您可以使用statSyncor
lstatSync文档链接),它会为您提供一个fs.Statsobject。通常,如果函数的同步版本可用,它将与异步版本具有相同的名称,Sync末尾带有。statSync;的同步版本也是如此statlstatSynclstat等的同步版本。

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;
如果该条目根本不存在,它将引发错误。

如果您不关心条目
什么,只想知道它是否存在,您可以使用path.existsSync(或使用
latest, fs.existsSync),如user618408
所述

var path = require('path');
if (path.existsSync("/the/path")) { // or fs.existsSync
    // ...
}

它不需要 atry/catch但不会给你任何关于事物是什么的信息,只是它就在那里。path.existsSync很久以前就被弃用了。


旁注:您明确询问如何 同步 检查,因此我使用了xyzSync上述功能的版本。但只要有可能,对于 I/O,最好避免同步调用。从 CPU
的角度来看,调用 I/O
子系统需要大量时间。请注意调用lstat而不是lstatSync

// Is it a directory?
lstat('/the/path', function(err, stats) {
    if (!err && stats.isDirectory()) {
        // Yes it is
    }
});

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

2012 年 9 月更新

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

例子:

var fs = require('fs');

if (fs.existsSync(path)) {
    // Do something
}

// Or

fs.exists(path, function(exists) {
    if (exists) {
        // Do something
    }
});

2015 年 2 月更新

我们在 2015 年,Node 文档现在说fs.existsSync(并且fs.exists)“将被弃用”。(因为 Node
的人认为在打开某个东西之前检查它是否存在是愚蠢的,但它不是检查某个东西是否存在的唯一原因!)

所以我们可能会回到各种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');

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
    }
});

2016 年 12 月更新

您可以使用fs.existsSync()

if (fs.existsSync(path)) {
    // Do something
}

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

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

2022-02-25