[英]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) => {})
})
const fs_extra = require('fs-extra')
for (let file of files)
fs_extra.move(file, new_name, { overwrite: false }, (err) => {})
每次所有 3 個文件都被覆蓋並重命名為一個文件。
我相信會發生這種情況,因為所有exists
的檢查都比任何rename
發生得更快。
我知道如何同步完成此任務,但想確保沒有合適的異步方式來完成此任務。
您可以創建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();
});
});
}
})();
如果您不想與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()
.
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.