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

时间:2019-08-23 10:48:56

标签: 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()-已弃用

for (let file of files)

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

fs.access()-推荐

for (let file of files)

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

fs.move()-来自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的检查都要早触发。

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

2 个答案:

答案 0 :(得分:3)

您可以创建Promise,其中resolve是重命名文件的地方

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

答案 1 :(得分:1)

@ ponury-kostek解决方案工作出色,被标记为可接受的答案。

我结束了下面的代码,因为它有点短:

async function rename_files() {

  for (let file of files)                
      await fs.move(file, new_name)
}
rename_files()