为什么fs.copySync没有按预期工作?

时间:2018-05-29 21:16:51

标签: node.js windows electron fs

我尝试将文件从一个目录复制并粘贴到另一个目录,并且出现错误错误:ENOENT:没有这样的文件或目录,stat'D:\ transfer \ roliki \ rolikiNOW \Реклама - ALESA04032016.mp3',虽然路径和文件存在。如果我“手动”向fs.copeSync提供arg,那么它可以正常工作

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 :(得分:2)

你做错了。这个:\\\\毫无意义。请记住,您在stdout上看到的内容以及您在代码中看到的内容并不相同。

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

console.log(path);

将输出:'D:\transfer\roliki\rolikiNOW\Реклама - ALESA04032016.mp3',这就是Javascript将如何对待它,作为单个\,这是一个有效的路径。您正尝试使用\\来实现\\\\(您在代码中看到的内容),但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]&amp; 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);