Я пытался скопировать много файлов в папку с помощью "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.info('####', files)
})
И это результат fs.readdir
Это папка со всеми файлами, которые я хочу скопировать
Это список файлов, которые он не копировал





ПОДСКАЗКА 1:
Check the order reported on your fs.readdir
ПОДСКАЗКА 2:
Now, as it´s alphabetical order, look for the next ocurrence in your list (alphabetically)
ПОДСКАЗКА 3:
Check for special characters on it´s name.
ПОДСКАЗКА 4 - ПРОВЕРЬТЕ ВОЗМОЖНОЕ РЕШЕНИЕ *
As you can see, there is a space on the name of `new dictionary.json". Remove the spaces on this name and try again.
ПОДСКАЗКА 5 - Измените свой звонок и добавьте StopOnError
Add an StopOnError option to show if it stops there and why
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.info("ok");
}
)
РЕШЕНИЕ
After dealing with this for a little of time, the problem was located: The user was executing the fs.readdir right after the execution of NCP. As NCP is asyncronous, fs.readdir was not reading the whole bunch of copied files, as they were still not copied.
Then, just a delay before fs.readdir was the solution to see all of them. Not a Spaces or special characters thing.
НАКОНЕЦ РЕАЛЬНОЕ РЕШЕНИЕ
As async programming has a first-day-of-school where everybody learns how to deal with callbacks, there is an example to deal with callbacks, and solve the question.
var ncp = require('ncp').ncp;
var fs = require('fs');
ncp.limit = 16;
var source = "dir1"
var destination = "dir2"
console.info('Starting');
console.info(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.info(err);
}
console.info('done!');
console.info(new Date().toISOString());
fs.readdir(destination, function (err, files){
console.info("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.info('Starting CopyTwo');
console.info(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.info(err);
}
console.info('done!');
console.info(new Date().toISOString());
fs.readdir(destination, function (err, files){
console.info("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]$
Вы пытались удалить место на new dictionary.json, например, переименовав его в new_dictionary.json?
нет, я не знал, потому что обычно я не знаю имена файлов в папке, я сразу после этой проблемы открываю папку и проверяю имя файлов
Здесь также говорят, что вам нужно имя файла по назначению. Может быть, это связано с пробелом в имени файла ..? stackoverflow.com/a/38639253/3617531
Я не предполагаю, что из-за того, что есть файл также sw.js, в нем нет места и он не копируется
stackoverflow.com/a/38639253/3617531 в этой теме вопроса он копирует один файл, имя которого он уже знает, но я копирую всю папку
Вы это проверили? Это важный момент. Если вы думаете, что вам это не нужно, вам не следует просить о помощи ...
сэр, вы видели этот img "i.stack.imgur.com/uWGSH.png" это список файлов, которые npc и fs не могут прочитать и скопировать, это не случай пробела в имени, это что-то еще
хорошо, и ... догадаешься, почему именно следующие после «new dictionary.json» ????
я не знаю почему, но я пробую это в Linux и fs.reddir ловит эти файлы ['.DS_Store', 'appmanifest.json', 'box2d.asm.js', 'c2runtime.js', 'data.js ',' data.json ',' game.html ',' icon.png ',' icons ',' images ',' media ',' new dictionary.json '], но файлы в изображении fs не могут прочтите почему !! я не знаю
@MahmoudNiypoo Я говорил вам: файлы ПЕРЕД файлом с пробелом в имени копируются. Файлы ПОСЛЕ файла с пробелом в имени НЕ КОПИРУЮТСЯ. Это показывает, по крайней мере, четкую связь между проблемой, о которой вы сообщаете, и этим файлом.. .. Если вы все еще думаете, что нет никакой связи ... Я не понимаю, в чем, по вашему мнению, проблема ....
Я сделал то, что вы сказали, и это работает, но все же некоторые файлы не копируются !! я не знаю, почему я проверяю все имена файлов, чтобы удалить пробел или просто, но не найдено, как вы думаете?
Позвольте нам продолжить обсуждение в чате.
спасибо большое, что вдохновили меня, я выясняю, в чем проблема, это не место, я читаю файлы, прежде чем писать их вообще, я задерживаю этап чтения, и да, я ловлю все файлы
:) Я говорил тебе!!! Это был такой экстрасенс. Работать с асинхронным кодом не так просто, как ожидалось !! :)
:( Я не обращал внимания на асинхронную причину, потому что я использовал обратный вызов из функции, поэтому я думаю, что это сделано, и я готов обработать этот обратный вызов, как я могу избежать этой ошибки, связанной с асинхронным
добавлен ответ об обработке обратного вызова !! :) Надеюсь, поможет!
Я пробовал это, но дал мне "ОК" на консоли, и та же проблема - существует какой-то файл, который не скопирован