Sys*_*ter 2 javascript asynchronous fs node.js fs-extra
仅当目标文件不存在时,我才尝试在 Node.js 中异步重命名文件。
我做了一个快速测试,如下所示:
const fs = require('fs')
const files = [ 'file1', 'file2', 'file3' ]
const new_name = 'new-name' // same destination name for all
Run Code Online (Sandbox Code Playgroud)
fs.exists() - 已弃用
for (let file of files)
fs.exists(new_name, (exists) => {
if (!exists) fs.rename(file, new_name, (err) => {})
})
Run Code Online (Sandbox Code Playgroud)
fs.access() - 推荐
for (let file of files)
fs.access(new_name, fs.constants.F_OK, (err) => {
if (err) fs.rename(file, new_name, (err) => {})
})
Run Code Online (Sandbox Code Playgroud)
const fs_extra = require('fs-extra')
for (let file of files)
fs_extra.move(file, new_name, { overwrite: false }, (err) => {})
Run Code Online (Sandbox Code Playgroud)
每次,所有 3 个文件都会被覆盖并重命名为一个文件。
我相信这种情况会发生,因为所有exists检查都比任何rename检查都发生得早。
我知道如何同步完成此任务,但想确保没有适当的异步方法来执行此操作。
您可以创建文件重命名的Promise时间resolve
fs.rename(file, new_name, (err) => {
resolve(); <------
});
Run Code Online (Sandbox Code Playgroud)
或者当跳过重命名时
fs.access(new_name, fs.constants.F_OK, (err) => {
if (err) {
return fs.rename(file, new_name, (err) => {
resolve();
});
}
resolve(); <------
});
Run Code Online (Sandbox Code Playgroud)
完整代码
(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();
});
});
}
})();
Run Code Online (Sandbox Code Playgroud)
如果你不想与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);
}
})();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2583 次 |
| 最近记录: |