node.js ncp | fs.readdir |丢失文件|使用回调

时间:2018-04-25 10:40:41

标签: node.js fs readdir

我曾尝试通过“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结果

enter image description here

这是包含我要复制的所有文件的文件夹

enter image description here

这是未复制的文件列表

enter image description here

1 个答案:

答案 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]$