如何使用node.js获取特定文件扩展名的文件列表?

45
节点fs包有以下列出目录的方法:

fs.readdir(path, [callback]) 异步readdir(3)。读取目录的内容。回调函数接收两个参数(err, files),其中files是目录中文件名(不包括 '.' 和 '..' 目录)的数组。

fs.readdirSync(path) 同步readdir(3)。返回一个不包括 '.' 和 '..' 的文件名数组。

但是我如何获取与文件规范匹配的文件列表,例如*.txt


1
你将在回调参数中获得目录中所有文件的列表。你可以进行筛选。 - abhishekkannojia
5个回答

64

您可以使用扩展名提取函数对文件数组进行过滤。如果您不想编写自己的字符串操作逻辑或正则表达式,path 模块提供了这样的函数。

const path = require('path');

const EXTENSION = '.txt';

const targetFiles = files.filter(file => {
    return path.extname(file).toLowerCase() === EXTENSION;
});

编辑 根据 @arboreal84 的建议,您可能需要考虑一些情况,例如myfile.TXT,这种情况并不罕见。我刚刚测试了一下,path.extname不会自动将文件名转换为小写。


3
几乎正确。您需要将扩展名转换为小写,因为某些文件可能使用大写,例如:.TXT - arboreal84
1
对于那些只是复制粘贴答案的人来说,Lazyexpert 的答案缺少实际读取目录的部分。 - Typo

32

基本上,你需要像这样做:

const path = require('path')
const fs = require('fs')

const dirpath = path.join(__dirname, '/path')

fs.readdir(dirpath, function(err, files) {
  const txtFiles = files.filter(el => path.extname(el) === '.txt')
  // do something with your files, by the way they are just filenames...
})

5
不要使用正则表达式解析文件名,应该使用path.extname - arboreal84
2
我同意,在某些复杂情况下这是完全正确的。但是这个,说真的:/\.txt$/,需要时间来阅读和理解吗? - Lazyexpert
1
我想知道,你花了多少时间来阅读和理解那个正则表达式?多少毫秒?我重申,在大多数情况下 - 我完全同意。但最简单的...我们到底在谈论什么...? - Lazyexpert
1
这是无用的。这个正则表达式的复杂度为0。到目前为止,你的方法有一个阴暗面,新手开发人员不知道什么是正则表达式,如何使用它,如何阅读等等...如果连简单的正则表达式都不给他们展示,就更不用说了。 - Lazyexpert
2
你可以写1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1,这等于10。每个人都会加对吧?这没有任何复杂度吧?但是对于读者来说,这是一种浪费时间。直接写10就好了。 在脑海中计算这个总和会分散读者的注意力,让他们无法理解10如何与代码的其余部分相互关联。 - arboreal84
显示剩余9条评论

8

fs 不支持过滤功能,但如果您不想自己过滤,则可以使用 glob

var glob = require('glob');

// options is optional
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames.
  // If the `nonull` option is set, and nothing
  // was found, then files is ["**/*.js"]
  // er is an error object or null.
})

7
我使用以下代码,它运行良好:
var fs = require('fs');
var path = require('path');
var dirPath = path.resolve(__dirname); // path to your directory goes here
var filesList;
fs.readdir(dirPath, function(err, files){
  filesList = files.filter(function(e){
    return path.extname(e).toLowerCase() === '.txt'
  });
  console.log(filesList);
});

1
文本文件扩展名也可以大写(例如:.TXT)。 - arboreal84
是的,你说得对。感谢指出可能存在的问题 :) - Abdul Samad

1
const fs = require('fs');
const path = require('path');
    
// Path to the directory(folder) to look into
const dirPath = path.resolve(`${__dirname}../../../../../tests_output`);
        
// Read all files with .txt extension in the specified folder above
const filesList = fs.readdirSync(dirPath, (err, files) => files.filter((e) => path.extname(e).toLowerCase() === '.txt'));
        
// Read the content of the first file with .txt extension in the folder
const data = fs.readFileSync(path.resolve(`${__dirname}../../../../../tests_output/${filesList[0]}`), 'utf8');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接