Почему fs.copySync не работает должным образом? - PullRequest
0 голосов

Я пытаюсь скопировать и вставить файлы из одного каталога в другой, и возникает ошибка Ошибка: ENOENT: такого файла или каталога нет, stat 'D: \ Transfer \ roliki \ rolikiNOW \ Реклама - ALESA04032016.mp3', хотя путь и файлысуществовать.Если я даю arg для fs.copeSync "вручную", он хорошо работает

for (let i = 0; i < arrPath.length; i++) {
      let source = arrPath[i].replace(/\\/g, "\\\\"); // change one slash to double
      let destiny = pathToCollect.replace(/\\/g, "\\\\") + "\\\\" + path.parse(arrPath[i]).base; //destination directory
      console.log(source);// e.g. D:\\transfer\\roliki\\rolikiNOW\\Реклама - ALESA04032016.mp3

      console.log(destiny);// D:\\collect\\Реклама - ALESA04032016.mp3

      try {
        fs.copySync(source, destiny);
      } catch (e) {
        console.log(e);// Error: ENOENT: no such file or directory, stat D:\transfer\roliki\rolikiNOW\Реклама - ALESA04032016.mp3
      } finally {
        console.log("success");
      }
    }


    //this work well, as expected

    fs.copySync('D:\\transfer\\roliki\\rolikiNOW\\Реклама - ALESA04032016.mp3', 'D:\\collect\\Реклама - ALESA04032016.mp3');

1 Ответ

0 голосов
/ 30 мая 2018

Вы делаете это неправильно.Это: \\\\ не имеет смысла.Имейте в виду, что то, что вы видите на stdout и то, что вы видите в своем коде, не одно и то же.

const path = 'D:\\transfer\\roliki\\rolikiNOW\\Реклама - ALESA04032016.mp3';

console.log(path);

Выводит: 'D:\transfer\roliki\rolikiNOW\Реклама - ALESA04032016.mp3', и именно так Javascript будет воспринимать это какsingle \, который является допустимым путем.Вы пытаетесь достичь \\ (то, что вы видите в своем коде) с помощью \\\\, но Windows не требует двойной обратной косой черты, ей нужен только один.

Вы пытались эмулировать: 'D:\\transfer\\roliki\\rolikiNOW\Реклама - ALESA04032016.mp3'печатая: 'D:\\\\transfer\\\\roliki\\\\rolikiNOW\Реклама - ALESA04032016.mp3'

Итак, у меня нет всего контекста, но эти две строки:

let source = arrPath[i].replace(/\\/g, "\\\\"); // change one slash to double
let destiny = pathToCollect.replace(/\\/g, "\\\\") + "\\\\" + path.parse(arrPath[i]).base; //destination directory
//                                                    ^^ this is wrong, very wrong, use path.join

Должны быть (Предполагая, arrPath[i] & pathToCollect)допустимые пути.

const basename = path.parse(arrPath[i]).base;
const source = arrPath[i]; // I need to see what `arrPath` is
const destiny = path.join(pathToCollect, basename); //destination directory

Вы должны всегда использовать path.join вместо использования конкатенации строк.

ОБНОВЛЕНИЕ:

Ваш arrPath массив неверен.

Если эти пути жестко запрограммированы, вы должны избегать обратной косой черты, в противном случае, \t - это вкладка, \r - возврат каретки.

const arrPath = [
    "D:\transfer\roliki\rolikiNOW\Реклама - ALESA04032016.mp3", 
    "D:\transfer\roliki\rolikiNOW\Реклама - MnogoMebeli.mp3", 
    "D:\transfer\roliki\rolikiNOW\Реклама - ВИ.mp3"
];

должно быть:

const arrPath = [
    "D:\\transfer\\roliki\\rolikiNOW\\Реклама - ALESA04032016.mp3", 
    "D:\\transfer\\roliki\\rolikiNOW\\Реклама - MnogoMebeli.mp3", 
    "D:\\transfer\\roliki\\rolikiNOW\\Реклама - ВИ.mp3"
];

const wrongPaths = [
    "D:\transfer\roliki\rolikiNOW\Реклама - ALESA04032016.mp3", 
    "D:\transfer\roliki\rolikiNOW\Реклама - MnogoMebeli.mp3", 
    "D:\transfer\roliki\rolikiNOW\Реклама - ВИ.mp3"
];

const correctPaths = [
    "D:\\transfer\\roliki\\rolikiNOW\\Реклама - ALESA04032016.mp3", 
    "D:\\transfer\\roliki\\rolikiNOW\\Реклама - MnogoMebeli.mp3", 
    "D:\\transfer\\roliki\\rolikiNOW\\Реклама - ВИ.mp3"
];

console.log('Bad:')
for(const path of wrongPaths)
  console.log(path);

console.log('Ok:')
for(const path of correctPaths)
  console.log(path);
...