NodeJs:fs.stat()或fs.access()检查文件夹是否存在?

Ben*_*wer 5 fs node.js

我目前正在尝试找出在存储文件之前检查本地文件夹是否存在的“正确”方法,并且nodejs文档有些混乱。

fs.exists()已被废弃,你应该fs.stat()或fs.access()使用。到目前为止,一切都很好。

fs.stat():

不建议在调用fs.open(),fs.readFile()或fs.writeFile()之前使用fs.stat()检查文件是否存在。而是,用户代码应直接打开/读取/写入文件,并在文件不可用时处理引发的错误。

这说明我应该尝试编写,捕获错误,创建文件夹,然后重试。即使我正在移动/重命名文件,我也可以,所以我不直接使用上述三个功能之一。

然后,文档说:

要检查文件是否存在而不随后对其进行操作,建议使用fs.access()。

由于我不是真正在修改文件,而是“仅”修改内容,因此有人可能会认为这是修改的方法。

但是再一次,fs.access()文档详细介绍了为什么这也是一个坏主意:

不建议在调用fs.open(),fs.readFile()或fs.writeFile()之前使用fs.access()检查文件的可访问性。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。而是,用户代码应直接打开/读取/写入文件,并处理无法访问文件时引发的错误。

Yadda yadda yadda,已经有一些相关的问题(herehere),但是是否有不超过两年的“最佳实践”的官方信息?

Yud*_*rya 9

我猜文档建议在fs.access之后没有操作时用来检查文件是否存在是因为它是一个较低级别和简单的 API,其单一目的是检查文件访问元数据(包括文件是否存在)。就性能而言,更简单的 API 也可能更好一点,因为它可能只是到底层本机代码的直接映射。(注意:我没有做过任何基准测试,请谨慎对待我的陈述)。

fs.statfs.access. 它返回文件访问之外的信息。

import {promises as fs} from "fs";
import * as oldfs from "fs";

(async function() {
    // fs.stat has higher level abstraction
    const stat = await fs.stat(__dirname);
    console.log(stat.isDirectory());
    console.log(stat.isFile());
    console.log(stat.ctime);
    console.log(stat.size);

    try {
        // fs.access is low level API, it throws error when it doesn't match any of the flags
        // is dir exists? writable? readable?
        await fs.access(__dirname, oldfs.constants.F_OK | oldfs.constants.W_OK | oldfs.constants.R_OK);
    } catch (error) {
        console.log(`${__dirname} is not exists / writable / readable`);
    }
})();

Run Code Online (Sandbox Code Playgroud)


nds*_*svw 7

您可以轻松地通过existsSync().

但是如果你想异步地做,就这样做:

await fs.promises.access("path");
Run Code Online (Sandbox Code Playgroud)

或者把它放在像这样的 try-catch 中......

try {
     await fs.promises.access("path");
    // The check succeeded
} catch (error) {
    // The check failed
}
Run Code Online (Sandbox Code Playgroud)