nodejs递归读取目录,获取文件路径,然后使用路径将文件复制到另一个目录

nodejs read directory recursively, get files paths, then use paths to copy files to another directory

我使用 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 和 grey.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 然后复制到另一个目录的正确方法。

如有任何帮助,我们将不胜感激。

您是否阅读了错误消息?

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)

您将 list/array 个字符串传递给 fse.fileCopySync(),而不是单个字符串。尝试类似的东西:

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

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

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

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

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

if src is a file, dest cannot be a directory

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

注意:添加到节点 v16 的是一个实验性界面,用于使用 fs.cpSync(), fs.cp() or fs.promises.cp() 将多个文件从一个位置复制到另一个位置。您也可以尝试这个新界面,因为它会为您执行递归复制,并且它提供了过滤功能,因此您可以根据需要将其限制为仅 GIF 文件。