node.js ncp |fs.readdir |недостающие файлы |использование обратного вызова - PullRequest
0 голосов
/ 25 апреля 2018

Я пытался скопировать много файлов в папке с помощью «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.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 голосов
/ 25 апреля 2018
  • КЛИЙ 1:

    Проверьте заказ, указанный на вашем fs.readdir

  • КЛЕЙ 2:

    Теперь, в алфавитном порядке, найдите следующее вхождение в вашем списке (в алфавитном порядке)

  • КЛУБ 3:

    Проверьте наличие специальных символов в названии.

  • КЛЕЙ 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]$
...