如果目标文件不存在,则在 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() - 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) => {})
})
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();
});
});
}
})();
如果您不想将 async
/await
与 Promise
混用
(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()
仅当目标文件 不存在 .
时,我才尝试在 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) => {})
})
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();
});
});
}
})();
如果您不想将 async
/await
与 Promise
(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()