我曾尝试通过“ncp”复制文件夹中的大量文件,但每次检查文件是否被复制时,并非所有文件都存在。总有一些文件丢失。
我曾尝试使用fs.readdir来检查那些文件是否存在,但fs给出了相同的结果,但是有些文件丢失了
我的ncp代码
ncp(path.join(req.body.uploadPath,req.body.packageName,resourceDirectoryName), path.join(req.body.uploadPath,req.body.packageName), (err) => {
if (err) {
//devmode report
devMode.report('**error** '+err);
}
})
我的fs代码
fs.readdir(path.join(req.body.uploadPath,req.body.packageName,resourceDirectoryName), (err, files)=>{
console.log('####', files)
})
这是fs.readdir结果
这是包含我要复制的所有文件的文件夹
这是未复制的文件列表
答案 0 :(得分:1)
CLUE 1:
检查fs.readdir上报告的订单
CLUE 2:
现在,按字母顺序排列,查找列表中的下一个事件(按字母顺序排列)
CLUE 3:
检查名称上的特殊字符。
CLUE 4 - 测试可能的解决方案*
如您所见,“new dictionary.json”的名称上有一个空格。删除此名称上的空格,然后重试。
CLUE 5 - 更改来电,然后添加StopOnError
添加一个StopOnError选项以显示它是否停在那里以及为什么
ncp (
path.join(req.body.uploadPath, req.body.packageName, resourceDirectoryName),
path.join(req.body.uploadPath,req.body.packageName),
{stopOnErr: true},
(err) => {
if (err)
{
return console.error(err);
}
console.log("ok");
}
)
<强>解强>
在处理了这个问题一段时间之后,找到了问题: 用户在执行后立即执行fs.readdir NCP。 由于NCP是异步的,fs.readdir并没有阅读整个群体 复制文件,因为它们仍未被复制。
然后,在fs.readdir之前的延迟只是解决所有问题的解决方案。不是空格或特殊字符。
最后,一个真正的解决方案
由于异步编程具有每个人都学习的第一天的学校 如何处理回调,有一个例子可以处理 回调,并解决问题。
var ncp = require('ncp').ncp;
var fs = require('fs');
ncp.limit = 16;
var source="dir1"
var destination="dir2"
console.log('Starting');
console.log(new Date().toISOString());
ncp(source, destination, mycallback );
function mycallback(err)
{
//here we are inside a callback declared in an outer function
if (err) {
return console.log(err);
}
console.log('done!');
console.log(new Date().toISOString());
fs.readdir(destination, function (err, files){
console.log("Files Copied to Dir2 "+ files.length);
//here we are inside fs.readdir callback
copyTwo();
});
//as fs.readdir is also async, I cannot execute copyTwo() here, and I must execute inside fs.reddir callback
}
function copyTwo()
{
console.log('Starting CopyTwo');
console.log(new Date().toISOString());
source="dir2"
destination="dir3"
//This function uses an embedded callback
ncp(source, destination, function (err)
{
// here we are inside the function declared (with-no-name) to use directly asembedded callback
if (err) {
return console.log(err);
}
console.log('done!');
console.log(new Date().toISOString());
fs.readdir(destination, function (err, files){
console.log("Files Copied to Dir3 "+ files.length);
});
});
}
[admin-sp@localhost pruebaApp]$ ls dir1 | wc -l
7777
[admin-sp@localhost pruebaApp]$ ls dir2 | wc -l
0
[admin-sp@localhost pruebaApp]$ ls dir3 | wc -l
0
[admin-sp@localhost pruebaApp]$ node index.js
Starting
2018-05-01T00:55:50.683Z
done!
2018-05-01T00:55:57.063Z
Files Copied to Dir2 7777
Starting CopyTwo
2018-05-01T00:55:57.069Z
done!
2018-05-01T00:56:03.030Z
Files Copied to Dir3 7777
[admin-sp@localhost pruebaApp]$