【问题标题】:nodejs read directory recursively, get files paths, then use paths to copy files to another directorynodejs递归读取目录,获取文件路径,然后使用路径将文件复制到另一个目录
【发布时间】:2021-11-05 08:45:31
【问题描述】:

我使用recursive-readdir 读取目录及其子目录,如下所示:

const fse = require('fs-extra')
const recursive = require('recursive-readdir');

const inputFolder = './input';

const files =  await recursive(inputFolder)

然后我像这样过滤获取的文件:

const fileteredFiles = files.filter((f) => f.includes('.gif'));

i console.log(filteredFiles) 这是输出:

[ 'input/background/black.gif',
  'input/background/grey.gif',]

现在我想将 black.gif 和 gray.gif 复制到另一个目录,我试过这个:

fse.copyFileSync(fileteredFiles, 'outputDir')

我得到这个错误:

TypeError [ERR_INVALID_ARG_TYPE]: The "src" argument must be one of type string, Buffer, or URL. Received type object
    at Object.copyFileSync (fs.js:1719:3)

所以请指点我获取filteredFiles然后复制到另一个目录的正确方法。

任何帮助将不胜感激。

【问题讨论】:

  • 在 nodejs v16 中,您可以使用 fsPromises.cp() 将文件层次结构复制到不同的目录。

标签: javascript node.js fs


【解决方案1】:

您没有以两种不同的方式正确使用fs.copyFileSync

  1. fs.copyFileSync() 的第一个参数必须是源文件路径。您正在尝试传递一组文件路径。这不是它的工作原理。您必须致电fs.copyFileSync() 获取一个单独的文件。

  2. fs.copyFileSync() 的第二个参数必须是目标文件路径,而不是目录路径。

请注意,即使您尝试使用名为 fs.copySync()fs-extra 版本,它也会这样显示:

如果src是文件,dest不能是目录

因此,要修复您对fs.copyFileSync() 的使用,您必须为要复制的每个文件调用它,并且必须构建适当的目标文件路径(而不仅仅是传递目标目录)。

注意:添加到节点 v16 的是一个实验性接口,用于将多个文件从一个位置复制到另一个位置,fs.cpSync()fs.cp()fs.promises.cp()。你也可以试试这个新界面,因为它会为你做一个递归复制,它提供了一个过滤功能,所以如果你愿意,你可以将它限制为 GIF 文件。

【讨论】:

  • @Nicholas Carey 提供了一个解决方案,您的回答有助于以正确的语法应用此解决方案..谢谢
【解决方案2】:

您是否阅读了错误信息?

TypeError [ERR_INVALID_ARG_TYPE]: The "src" argument must be one of
type string, Buffer, or URL. Received type object
at Object.copyFileSync (fs.js:1719:3)

您将字符串列表/数组传递给fse.fileCopySync(),而不是单个字符串。尝试类似:

for (const fn of filterFiles) {
  fse.copyFileSync( fn , 'outputdir' ); 
}

【讨论】:

  • 我使用了一个 for 循环来解决这个问题,因为增量器有助于用 i++ 命名文件,例如 file-1、file-2 等等...再次感谢
猜你喜欢
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2023-04-05
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多