NodeJS 20使用fs模块将文件显示为目录

41zrol4v  于 2023-11-17  发布在  Node.js
关注(0)|答案(1)|浏览(135)

我有一个NextJS 14.0.2应用程序,目前运行NodeJS v20.9.0。我试图递归地读取目录中的所有文件和文件夹,并获取每个文件的元数据。我目前的代码是-

const foldersArr = [];
const filesArr = [];
const fileDetails = fs.lstatSync(path); //for a specified path
//here, list item is a metadata object
if(fileDetails.isDirectory()) {
    foldersArr.push(listItem);
} else {
    filesArr.push(listItem);
}

字符串
问题是,fileDetails.isDirectory()对所有文件夹文件返回true,而对文件返回false。我的代码的存储库-https://github.com/rohithandique/next-file-system我不确定问题是什么,如果需要更多信息,请告诉我。任何帮助都将非常感谢,谢谢。

mlmc2os5

mlmc2os51#

在你的代码中,你是这样做的:

const fileDetails = fs.lstatSync(path);

字符串
但是,path是你列出的目录,而不是你要迭代的文件。所以,既然你把目录作为path参数传递给你的函数,那么当然是这样的:

const fileDetails = fs.lstatSync(path);
console.log(fileDetails.isDirectory());


将始终记录true,因为path是您调用fs.promises.readdir(path)的父目录,而不是该目录中的单个文件。
注意,如果你将withFileTypes参数传递给fs.promises.readdir(path, {withFileTypes: true}),那么你将在第一次迭代中得到fs.DirEnt
这里有一个简单的JavaScript版本,你可以直接在nodejs中执行(只需将变量testPath设置为你想要删除的任何目录):

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

const testPath = "somefullpath";

const getDirectoryData = async (pathToList) => {
    const items = await fs.promises.readdir(pathToList, {withFileTypes: true});
    const foldersArr = [];
    const filesArr = [];
    for (const item of items) {
        const listItem = {};
        listItem.name = item.name;
        const fullPath = path.join(pathToList, item.name);
        const stats = await fs.promises.lstat(fullPath);
        listItem.size = stats.size;
        listItem.user = stats.uid === 0 ? "root" : stats.uid;
        if (item.isDirectory()) {
            foldersArr.push(listItem);
        } else {
            filesArr.push(listItem);
        }
    }
    return {folders: foldersArr, files: filesArr};
}

getDirectoryData(testPath).then(result => {
    console.log(result);
}).catch(err => {
    console.log(err);
});

相关问题