从目录中异步获取与特定扩展名匹配的所有文件

编程入门 行业动态 更新时间:2024-10-08 02:18:07

从目录中异步获取与特定<a href=https://www.elefans.com/category/jswz/34/1770404.html style=扩展名匹配的所有文件"/>

从目录中异步获取与特定扩展名匹配的所有文件

我有一个函数,其作用是将目录中的所有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"

我可以做些什么来使它按预期工作吗?
回答如下:您可以将withFileTypesfsp.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); });

列出或匹配的内容有很多选项,包括名称或扩展名上的正则表达式,递归,回调,不区分大小写的匹配,是否包含目录等...

更多推荐

从目录中异步获取与特定扩展名匹配的所有文件

本文发布于:2024-05-07 20:43:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1757163.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:扩展名   文件   目录中

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!