我正在尝试使用 JavaScript 和 NodeJS 将一些文件从一个文件夹复制到另一个文件夹。我正在从文本文件中读取文件名来实现此目的,但只有最后一个文件被传输。
FileNames.txt
具有 F:/Some Folder/Origin Folder
中存在的文件的名称,我想将这些文件复制到 F:/Some Folder/Target Folder
中。 count
变量用于验证传输的文件数量。
function readFileContents() {
fs.readFile(
"F:/Some Folder/FileNames.txt",
"utf8",
(err, data) => {
if (err) {
console.log(err);
} else {
data.split("\n").forEach(d => transferFiles(d));
}
console.log(count);
}
);
}
function transferFiles(fileName) {
fs.cp(
`F:/Some Folder/Origin Folder/${fileName}`,
`F:/Some Folder/Target Folder/${fileName}`,
err => {
if (err) {
console.log(err);
} else {
console.log(`Transferred ${fileName}`);
count++;
}
}
);
}
所以,你的代码:
data.split("\n").forEach(d => transferFiles(d));
将开始所有传输并立即返回,无需等待任何传输完成。您显示的代码无法真正知道它们何时全部完成,也无法查看最终计数是多少,因为您没有跟踪一切何时完成。
我建议使用
await fs.promises.cp(...)
,这是该函数的 promise 版本,然后您可以 await
每个函数并按顺序执行它们,并且更容易知道它们何时全部完成。不要将 .forEach()
与异步代码一起使用,因为它不支持 Promise,也不会尊重 Promise。相反,只使用普通的 for
循环或 for/of
循环,这两者都是 Promise 和 wait 友好的。