簡體   English   中英

如果目標文件不存在,則在 Node.js 中異步重命名文件

[英]Rename files asynchronously in Node.js if destination files don't exist

僅當目標文件不存在時,我才嘗試在 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發生得更快。

我知道如何同步完成此任務,但想確保沒有合適的異步方式來完成此任務。

您可以創建Promiseresolve重命名文件時的

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

如果您不想與Promise混合使用async / await

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

@ ponury-kostek解決方案出色地工作,並標記為已接受的答案。

我結束了以下代碼,因為它短了一點:

async function rename_files() {

  for (let file of files)                
      await fs.move(file, new_name)
}
rename_files()  
  • 而不是將 fs 庫包裝在 promises 中。
  • 我喜歡導入fs庫的promise實現。
  • 然后使用await調用 fs 方法。

.

import {promises as fs_promises} from 'fs'; // The promise implmentation of fs library.

async function renameFile() {
    const fileFullPath = '1234.txt';
    const newFileFullPath = '5678.txt';

    await fs_promises.rename(fileFullPath, newFileFullPath, (error) => {
        if (error) {
            console.log(error);
        } else {
            console.log("\nFile Renamed\n");
        }
    });
}

await renameFile(); // Call the async method.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM