扩展名匹配的所有文件"/>
从目录中异步获取与特定扩展名匹配的所有文件
我有一个函数,其作用是将目录中的所有mp3文件(忽略子目录)作为数组返回。用户给了我完整的目录路径。由于某种原因,它似乎包含目录中的每个文件。我将其范围缩小为以下事实:尽管它是异步的并且已被await
过滤,但我的过滤器方法似乎仍在执行,但是我不确定如何修复它,以便它返回给我[.mp3
结尾?
/mnt/d/Music/S/Square Enix/2020 - Final Fantasy VII Remake Mini Soundtrack [v0]/
├── 01 - The Prelude.mp3
├── 02 - Tifa's Theme.mp3
├── 03 - Shinra's Theme.mp3
├── 04 - Scorpion Sentinel.mp3
├── 05 - On Our Way.mp3
├── 06 - The Turks' Theme.mp3
├── 07 - Let The Battles Begin!.mp3
├── 08 - Flowers Blooming in the Church.mp3
├── 09 - Hurry!.mp3
├── 10 - Main Theme of FINAL FANTASY VII.mp3
├── 11 - Lay Down Some Rubber.mp3
├── 12 - Stand Up.mp3
└── Folder.jpg3
结果应包括每个文件除外
Folder.jpg
-但当我运行此代码时: async getAllFiles (directory, extension) {
let files = await fs.readdir(directory)
files = await Promise.all(files.filter(async file => {
const filePath = join(directory, file)
const stats = await fs.stat(filePath)
return stats.isFile() && extname(filePath) === extension
}))
return files
}
我返回的数组如下:
0:"01 - The Prelude.mp3" 1:"02 - Tifa's Theme.mp3" 2:"03 - Shinra's Theme.mp3" 3:"04 - Scorpion Sentinel.mp3" 4:"05 - On Our Way.mp3" 5:"06 - The Turks' Theme.mp3" 6:"07 - Let The Battles Begin!.mp3" 7:"08 - Flowers Blooming in the Church.mp3" 8:"09 - Hurry!.mp3" 9:"10 - Main Theme of FINAL FANTASY VII.mp3" 10:"11 - Lay Down Some Rubber.mp3" 11:"12 - Stand Up.mp3" 12:"Folder.jpg"
我可以做些什么来使它按预期工作吗?回答如下:您可以将
withFileTypes
的fsp.readdir()
选项使用,并使其变得更加容易:const fsp = require('fs').promises;
const path = require('path');
async getAllFiles (directory, extension) {
let files = await fsp.readdir(directory, {withFileTypes: true});
return files
.filter(f => f.isFile() && path.extname(f.name) === extension)
.map(f => f.name);
}
或者,如果您想返回完整的路径名:
const fsp = require('fs').promises; const path = require('path'); async getAllFiles (directory, extension) { let files = await fsp.readdir(directory, {withFileTypes: true}); return files .filter(f => f.isFile() && path.extname(f.name) === extension) .map(f => path.join(directory, f.name)); }
您当前的代码将不起作用,因为.filter()
希望您将其返回为布尔值,但是您正在返回一个promise,因此它将永远不会被过滤掉。注意:在我的代码中,我从不将
fs.promises
命名为fs
,因为它会使读代码的人感到困惑。我个人使用fsp
表示fs.promises
,但如果不是fs
的任何内容都会在读者中暗示这不是正常的顶级fs
。还请确保
extension
包含前导.
,因为path.extname()
将使句点保持打开状态。
FYI,有关在目录中列出文件的一项很好的功能,请参见https://github/jfriend00/fs-common/blob/master/fslist.js(尚未在NPM中,您只需复制它)。导入后,您只需执行以下操作:
listDirectory(directory, {matchWhat: "ext", match: "mp3"}).then(files => { console.log(files); });
列出或匹配的内容有很多选项,包括名称或扩展名上的正则表达式,递归,回调,不区分大小写的匹配,是否包含目录等...
更多推荐
从目录中异步获取与特定扩展名匹配的所有文件
发布评论