Nodejs中怎么获取一个目录下所有的文件包括子目录中的文件和文件的大小?

Nodejs中怎么获取一个目录下所有的文件包括子目录中的文件和文件的大小?

怎么用nodejs获取一个目录下所有的文件包括子目录中的文件和文件的大小,请各位大神指教下

4 回复

当然可以。在 Node.js 中,你可以使用内置的 fs 模块来遍历目录并获取其中的所有文件及其大小。以下是一个简单的示例代码,展示了如何实现这一功能:

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

function getFilesWithSize(dirPath) {
    return new Promise((resolve, reject) => {
        fs.readdir(dirPath, { withFileTypes: true }, (err, files) => {
            if (err) {
                return reject(err);
            }

            const filePromises = files.map(file => {
                const filePath = path.join(dirPath, file.name);

                if (file.isDirectory()) {
                    // 如果是目录,则递归调用自身
                    return getFilesWithSize(filePath).then(subFiles => subFiles);
                } else {
                    // 获取文件大小
                    return fs.promises.stat(filePath).then(stats => ({
                        name: file.name,
                        size: stats.size
                    }));
                }
            });

            // 等待所有文件处理完成
            Promise.all(filePromises).then(files => {
                resolve(files.flat());
            });
        });
    });
}

// 使用示例
getFilesWithSize('./your-directory-path')
    .then(files => {
        console.log('All files and their sizes:', files);
    })
    .catch(error => {
        console.error('Error:', error);
    });

解释

  1. 引入模块:

    • fs: 用于与文件系统交互。
    • path: 用于处理和转换文件路径。
  2. 定义函数 getFilesWithSize:

    • 接收一个目录路径作为参数。
    • 使用 fs.readdir 方法读取该目录下的所有文件和子目录。{ withFileTypes: true } 参数使得返回的 Dirent 对象包含文件类型信息。
    • 遍历每个文件/目录,如果是目录,则递归调用 getFilesWithSize 函数;如果是文件,则使用 fs.promises.stat 获取文件大小,并构建一个包含文件名和大小的对象。
  3. 处理异步操作:

    • 使用 Promise.all 等待所有文件处理完成。
    • 将结果展平为一维数组。
  4. 使用示例:

    • 调用 getFilesWithSize 函数,并传入目标目录路径。
    • 处理结果或错误。

通过这种方式,你可以轻松地获取指定目录下所有文件及其大小,包括子目录中的文件。


这个主要是DFS深度优先遍历+ 先序。 先拿到Path,readdir foreach检测isDirectory,如果是,继续,不是,callback, 这里返回文件的大小

要在Node.js中获取一个目录下所有的文件(包括子目录中的文件)及其大小,可以使用fs模块和path模块。具体来说,可以递归地遍历目录,并使用fs.stat()方法来获取每个文件的详细信息,包括文件大小。

以下是实现这一功能的示例代码:

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

function listFiles(dir) {
    return new Promise((resolve, reject) => {
        fs.readdir(dir, { withFileTypes: true }, (err, files) => {
            if (err) {
                return reject(err);
            }

            const promises = files.map(file => {
                const fullPath = path.join(dir, file.name);
                if (file.isDirectory()) {
                    return listFiles(fullPath); // 递归调用
                } else {
                    return fs.promises.stat(fullPath).then(stats => {
                        return { name: fullPath, size: stats.size };
                    });
                }
            });

            Promise.all(promises)
                .then(results => {
                    resolve(results.flat());
                })
                .catch(reject);
        });
    });
}

// 使用示例
listFiles('./your-directory')
    .then(files => {
        console.log("文件及文件大小列表:");
        files.forEach(file => {
            console.log(`${file.name} - ${file.size} bytes`);
        });
    })
    .catch(error => {
        console.error("发生错误:", error);
    });

解释

  1. 引入模块

    • fs 模块用于与文件系统交互。
    • path 模块用于处理和转换文件路径。
  2. 定义 listFiles 函数

    • 这个函数接收一个目录路径作为参数。
    • 使用 fs.readdir 方法读取目录中的所有文件和子目录,并设置 withFileTypes: true 以便区分文件和目录。
    • 对于每一个文件或子目录,使用 fs.promises.stat 方法来获取其统计信息。
    • 如果遇到的是子目录,则递归调用 listFiles 函数。
    • 如果是普通文件,则直接返回文件名和文件大小。
  3. 使用示例

    • 调用 listFiles 函数并传入你想要遍历的目录路径。
    • 输出结果为文件路径及其对应的文件大小。

这段代码可以有效地列出指定目录下的所有文件(包括子目录中的文件),并打印出文件名和文件大小。

回到顶部