node.js fs.exists()将被弃用,取而代之的是什么?

Bla*_*ode 13 node.js

根据文档 node.js,fs.exists()将被弃用.他们的推理:

fs.exists()是一种时代错误,只是出于历史原因而存在.几乎没有理由在你自己的代码中使用它.

特别是,在打开文件之前检查文件是否存在是一种反模式,使您容易受到竞争条件的影响:另一个进程可能会在调用fs.exists()和fs.open()之间删除该文件.只需打开文件并在错误处理时处理错误.

fs.exists()将被弃用.

我目前在移动文件之前使用它,因为fs.rename()似乎在目标文件夹中安静地覆盖具有相同名称的文件.

我的问题是; 我应该使用什么来防止fs.rename()覆盖目标文件夹中的文件?我认为有一种我不知道的方式.否则我没有看到fs.exists()被弃用的原因.

由于我不想打开文件,因此建议使用fs.open()似乎有些过分.


编辑,按照@jfriend00的要求获取更多关于我正在做什么的信息.

我正在制作一个Electron应用程序,用户可以将文件分类到不同的目录中.它不是服务器软件,它旨在每天运行用户机器,处理他们的文档.这是到目前为止移动文件的代码:

function moveFile(destIndex){
    var from = queue[currentQueueIndex].path;
    var to = destinations[destIndex].path + path.sep + path.basename(from);
    console.log("[i] Move file (from/to): ");
    console.log(from);
    console.log(to);

    //Check if file exists, if yes: give them the choice to cancel.
    fs.stat(to, function (err, stats) {
        if (err){
            move(from, to);
        } else {
            var confirmed = confirm("File already exists, will overwrite.");
            if (confirmed) {
                move(from, to);
            }
        }
    });
    next(); //Show the next file to the user
}

function move(from, to){
    fs.rename(from, to, function (err) {
        if (err) throw err;
        console.log('[i] Move successful');
        queue[currentQueueIndex].path = to;
        queue[currentQueueIndex].moved = true;
    });
}
Run Code Online (Sandbox Code Playgroud)

在第一个注释之后,以fs.stat开头的部分,我检查我将要用fs.rename创建的文件是否已经存在.我想这是受竞争条件影响的,但我发现fs.rename无论如何处理重复.
由于此应用程序用于"家庭计算",我不认为文件检查和重命名之间文件消失的情况很可能发生.但是,我可以避免的潜在问题越多越好.

msc*_*dex 7

io.js文档提到使用fs.stat()fs.access()代替fs.exists().

  • fs.stat() 看起来很有希望,但是当我尝试使用它 `var stat = fs.statSync(file);` 时,我在不存在的文件上收到 ENOENT 错误。我该如何处理? (2认同)

DDN*_*hep 7

使用fs.existsSync().

fs.existsSync()尚未弃用.

https://nodejs.org/api/fs.html#fs_fs_existssync_path

fs.existsSync(路径)

添加于:v0.1.21路径| fs.exists()的同步版本.如果文件存在则返回true,否则返回false.

请注意,不推荐使用fs.exists(),但不推荐使用fs.existsSync().(fs.exists()的callback>参数接受与其他> Node.js回调不一致的参数.fs.existsSync()不使用回调.)

  • 弃用该函数而不是仅仅更改函数接口以与其他 Node.js 回调保持一致似乎很奇怪。 (3认同)
  • 更改函数签名可能会破坏现有代码 (2认同)

cda*_*uth 5

这是一个使用fs.stat,但也正确处理错误的示例:

async function fileExists(filename) {
    try {
        await fs.promises.stat(filename);
        return true;
    } catch (err) {
        if (err.code === 'ENOENT') {
            return false;
        } else {
            throw err;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)