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
:
fs.copyFileSync()
的第一个参数必须是源文件路径。您正在尝试传递一组文件路径。这不是它的工作原理。您必须为一个单独的文件调用 fs.copyFileSync()
。
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 文件。
我使用 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
:
fs.copyFileSync()
的第一个参数必须是源文件路径。您正在尝试传递一组文件路径。这不是它的工作原理。您必须为一个单独的文件调用fs.copyFileSync()
。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 文件。