javascript - 如果目标文件不存在,则在 Node.js 中异步重命名文件

标签 javascript node.js asynchronous fs fs-extra

仅当目标文件不存在时,我才尝试在 Node.js 中异步重命名文件。

我做了如下快速测试:

const fs = require('fs')

const files = [ 'file1', 'file2', 'file3' ]
const new_name = 'new-name' // same destination name for all 

fs.exists() - DEPRECATED

for (let file of files)

  fs.exists(new_name, (exists) => {
    if (!exists) fs.rename(file, new_name, (err) => {})
   })

fs.access() - RECOMMENDED

for (let file of files)

  fs.access(new_name, fs.constants.F_OK, (err) => {
    if (err) fs.rename(file, new_name, (err) => {})
  })

fs.move() - from fs-extra

const fs_extra = require('fs-extra')

for (let file of files) 

  fs_extra.move(file, new_name, { overwrite: false }, (err) => {})
<小时/>

每次都会覆盖所有 3 个文件并重命名为一个文件。

<小时/>

我相信会发生这种情况,因为所有 exists 检查都会比任何 rename 发生更早发生。

我知道如何同步完成此任务,但想确保没有适当的异步方法来完成此任务。

最佳答案

您可以创建Promise,当文件重命名时解决

fs.rename(file, new_name, (err) => {
    resolve(); <------
});

或者当跳过重命名时

fs.access(new_name, fs.constants.F_OK, (err) => {
    if (err) {
        return fs.rename(file, new_name, (err) => {
            resolve();
        });
    }
    resolve(); <------
});

完整代码

(async () => {
    for (let file of files) {
        await new Promise((resolve) => {
            fs.access(new_name, fs.constants.F_OK, (err) => {
                if (err) {
                    return fs.rename(file, new_name, (err) => {
                        resolve();
                    });
                }
                resolve();
            });
        });
    }
})();

如果您不想将 async/awaitPromise 混合使用

(async () => {
    function rename(file, new_name) {
        return new Promise((resolve) => {
            fs.access(new_name, fs.constants.F_OK, (err) => {
                if (err) {
                    return fs.rename(file, new_name, (err) => {
                        resolve();
                    });
                }
                resolve();
            });
        });
    }

    for (let file of files) {
        await rename(file, new_name);
    }
})();

关于javascript - 如果目标文件不存在,则在 Node.js 中异步重命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57624775/

相关文章:

Swift 3 - 异步请求表为空,刷新后填充

javascript - Kendo UI sortable within a sortable

c# - 处置后台 worker

javascript - 对预建表实现属性

javascript - Node 无密码发送每个 token 请求的动态正文

javascript - 如何在带有 Electron 和 NodeJs 8 的 Angular 7 中通过 Jest 迁移或使用现有的 karma Jasmine

javascript - Dialogflow 复合实体参数在不应定义时未定义

c# - 我应该将 await 与 async Action 方法一起使用吗?

javascript - 如果字符串包含某个子字符串,则在任何字符串赋值上设置断点

javascript - 如何在执行下一行之前等待执行完成