【问题标题】:node.js ncp | fs.readdir | missing files | use of callbacknode.js ncp | fs.readdir |丢失的文件 |回调的使用
【发布时间】:2018-04-25 10:40:41
【问题描述】:

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

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

这是它没有复制的文件列表

【问题讨论】:

    标签: node.js fs readdir


    【解决方案1】:
    • 线索 1:

      检查您的 fs.readdir 上报告的顺序

    • 线索 2:

      现在,按照字母顺序,查找列表中的下一个出现(按字母顺序)

    • 线索 3:

      检查其名称上的特殊字符。

    • 线索 4 - 测试可能的解决方案*

      如您所见,`new dictionary.json" 名称上有一个空格。删除此名称上的空格,然后重试。

    • 线索 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 是异步的,因此 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]$
    

    【讨论】:

    • 我试过了,但在控制台上给我“ok”,同样的问题是存在一些文件未复制
    • 您是否尝试过删除new dictionary.json 上的空间,例如重命名为new_dictionary.json
    • 不,我没有,因为在正常情况下我不知道文件夹中的文件名,我只是在那个问题之后打开文件夹并检查文件名
    • 在这里,他们还说您需要目标文件名。也许这种需求与文件名上的空间有关..? stackoverflow.com/a/38639253/3617531
    • 我猜不出来,因为还有一个 sw.js 文件,它没有空间,也没有复制
    猜你喜欢
    • 2016-04-04
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多