fs.readdirSync目录优先

时间:2018-08-16 09:39:32

标签: javascript node.js sorting

我想从我的系统中读取目录。目录结构为

dir

我用此代码读取目录

const directoryLevelInfo = fs.readdirSync('data', 'utf8')
                        .map(item => {
                            const path = `data/${item}`;

                            const isDir = fs.lstatSync(path)
                                             .isDirectory();

                            return {
                                name: item,
                                path: path,
                                isDir: isDir
                            };
                        });

我得到的结果是

[ { name: 'FileOne.md', path: 'data/FileOne.md', isDir: false },
  { name: 'FolderOne', path: 'data/FolderOne', isDir: true },
  { name: 'FolderTwo', path: 'data/FolderTwo', isDir: true } ]

如您所见,文件首先出现,然后我得到了文件夹。正确的顺序是先订购,最后是文件。

我丢失了某些东西还是必须使用

Array.sort()

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

要正确订购此结构?以及如何订购它,因为必须检查当前项目是文件还是目录,并且如果比较两个相同类型的项目,也必须按字母顺序对其进行排序。


编辑:

我的排序功能应该是

                        .sort((a, b) => {
                            if (!a.isDir && b.isDir) {
                                return 1;
                            }

                            if (a.isDir && !b.isDir) {
                                return -1;
                            }

                            if (a.isDir && b.isDir || !a.isDir && !b.isDir) {
                                return 0;
                            }
                        });

也许对此有一些改进。

2 个答案:

答案 0 :(得分:1)

Node.js fs.readdirfs.readdirSync函数在排序方面表现为inconsistently,在Windows和* nix上它们也有所不同。如果您需要持久的行为,那么最好的选择就是映射后进行排序。

假设您要按字母顺序对目录和文件进行排序,则可以使用以下代码。

const directoryLevelInfo = fs
  .readdirSync("documentation", "utf8")
  .map(item => {
    const path = `documentation/${item}`;

    const isDir = fs.lstatSync(path).isDirectory();

    return {
      name: item,
      path: path,
      isDir: isDir
    };
  })
  .sort((a, b) => b.isDir - a.isDir || a.name > b.name ? 1 : -1);

答案 1 :(得分:0)

function compareFiles(a,b) {
    return b.isDirectory() - a.isDirectory() || a.name > b.name ? 1 : -1
  }

我改编了@dereli的答案,因为我使用fs.readdir的方式有所不同:我添加了选项{withFileTypes:true},以便fs.readdir返回的文件为fs.dirent。 https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback 并且他们已经有了isDirectory()方法

fs.readdir(currentDir, { withFileTypes: true }, function (err, items) {
    items.sort(compareFiles);
    for (var i = 0; i < items.length; i++) {
        if (!items[i].name.startsWith(".")) {
            if (items[i].isFile()) {
               //append file name somewhere
            } else {
               //append directory name somewhere
            }
        }
    }
});

有一天可能对某人有帮助...