【问题标题】:Why fs.copySync didn't work as expected?为什么 fs.copySync 没有按预期工作?
【发布时间】:2018-11-08 14:58:26
【问题描述】:

我尝试将文件从一个目录复制并粘贴到另一个目录,但出现错误 Error: ENOENT: no such file or directory, 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');

【问题讨论】:

  • 你的意思是fs.copyFileSync()?我猜你有一个反斜杠问题。在 Javascript 中正确使用 Windows 路径反斜杠真的很痛苦。
  • 能不能显示一下arrPath的内容?
  • arrPath 是字符串数组:["D:\transfer\roliki\rolikiNOW\Реклама - ALESA04032016.mp3", "D:\transfer\roliki\rolikiNOW\Реклама - MnogoMebeli.mp3", " D:\transfer\roliki\rolikiNOW\Реклама - ВИ.mp3", end etc

标签: node.js windows electron fs


【解决方案1】:

你做错了。这:\\\\ 毫无意义。请记住,您在 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] & 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);

【讨论】:

  • /*我像下面这样重新编写了代码,但还是有同样的问题,无论如何感谢推荐*/ let pathToCollect = path.normalize("D:/collect");让 source = path.normalize(arrPath[i]);让命运 = path.join(pathToCollect, path.basename(source))
  • 现在我有实际数据了,我回家再试试。
  • @КогодеевАлександр 检查更新的答案,您的arrPath 数组错误。
猜你喜欢
  • 2014-08-04
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2021-03-20
相关资源
最近更新 更多