【问题标题】:copying files using `ncp` throws: no such file or directory, mkdir使用 `ncp` 复制文件会抛出:没有这样的文件或目录,mkdir
【发布时间】:2021-05-21 15:43:17
【问题描述】:

我使用ncp复制文件如下:

import ncp from "ncp";
import { promisify } from "util";

const ncpPromise = promisify(ncp);
const copyAssets = async (exportFolderName, includeSourceMaps) => {
  const assets = glob.sync("**/", { cwd: distPath });
  const options = { clobber: true, stopOnErr: true };
  if (!includeSourceMaps) {
    options.filter = (f) => {
      return !f.endsWith(".map");
    };
  }
  return Promise.all(
    assets.map((asset) => {
      return ncpPromise(
        path.join(distPath, asset),
        path.join(exportPath, exportFolderName, asset),
        options
      );
    })
  );
};

但这有时会失败并出现以下错误:

"ENOENT: no such file or directory, mkdir '/path/to/folder'"

我该如何解决这个问题?

【问题讨论】:

标签: node.js glob fs-extra


【解决方案1】:

我猜您正在尝试复制与给定 glob 匹配的所有文件,因此您需要这样做:

const assets = glob.sync("**/*.*", { cwd: distPath }); // note the *.*

例如,您当前的 glob 将导致:

[
  'folder1/',
  'folder2/',
]

而这个答案中的 glob 将导致(这就是你想要的):

[
  'folder1/file1.txt',
  'folder1/file2.txt',
  'folder2/anotherfile.txt',
]

另一种选择:

似乎ncp 没有得到维护。所以,你可以使用fs-extra,它也可以复制文件和目录:

const glob = require("glob");
const path = require("path");
const fs = require("fs-extra");

const copyAssets = async (exportFolderName, includeSourceMaps) => {
  const assets = glob.sync("**/*.*", { cwd: distPath });

  const options = { overwrite: true };

  if (!includeSourceMaps) {
    options.filter = (f) => {
      return !f.endsWith(".map");
    };
  }

  return Promise.all(
    assets.map((asset) => {
      return fs
        .copy(
          path.join(distPath, asset),
          path.join(exportPath, exportFolderName, asset),
          options
        )
        .catch((e) => console.log(e));
    })
  );
};

【讨论】:

  • 你好,我试过了,但是错误信息变成了"ENOENT: no such file or directory, open '/path/to/file'"(注意文件上的open而不是mkdir),这里的路径在导出文件夹中,而不是我的位置'正在复制文件。
  • open 的错误表示目标目录不存在。我建议您使用此答案中所写的fs-extra
【解决方案2】:

npm qir是的,是我自己发布的)是另一种选择:

const qir = require('qir');
qir.asyncing.copy('/A/path/to/src', '/B/path/to/dest')
    .then(() => { /* OK */ }
    .catch(ex => { /* Something wrong */ }
    ;

这里,/A/path/to/src可以是文件或文件夹,/B/path/to不需要已经存在。

有一种同步方式:

const qir = require('qir');
qir.syncing.copy('/A/path/to/src', '/B/path/to/dest');

并且,如果 srcdest 位于同一目录中:

const qir = require('qir');
let q = new qir.AsyncDir('/current/working/dir');
q.copy('A/path/to/src', 'B/path/to/dest')
    .then(() => { /* OK */ }
    .catch(ex => { /* Something wrong */ }
    ;

它将/current/working/dir/A/path/to/src复制到/current/working/dir/B/path/to/dest

【讨论】:

  • 如果 gir 是您自己发表的,您应该在回答中说明您的隶属关系。
  • 没关系,我已经编辑了我的答案。顺便说一句,包的名称是 qir 而不是 gir
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2022-01-16
  • 2021-05-27
  • 2010-12-04
  • 2019-09-29
  • 1970-01-01
  • 2014-03-08
相关资源
最近更新 更多