NodeJs - 在目录的子目录中获取最后修改的文件

NodeJs - Get last modified file in sub directories of directory

我有以下代码列出 directory 中的所有 folders,它映射每个文件夹的名称和创建日期。我正在努力在 folders.

sub directories 中获取最后修改的文件
const fs = require('fs')
const glob = require("glob")

const getDirectories = (source, callback) => {

    const getDirectories = function (src, callback) {
        glob(src + '/*/*/*', callback)
    }

    fs.readdir(source, { withFileTypes: true }, (err, files) => {
        if (err) {
            callback(err)
        } 
        else {
            callback(
                files
                .filter(dirent => dirent.isDirectory())
                .map(name => ({
                    name: name.name,
                    created: fs.statSync(`${source}\${name.name}`).birthtime.toLocaleString(navigator.language, {
                            day: '2-digit',
                            month: 'short',
                            year: '2-digit',
                            hour: '2-digit',
                            minute: '2-digit'
                        }
                    ),
                    modified: getDirectories(`${source}\${name.name}`, function (err, res) {
                        res = res.map(file => ({ file, mtime: fs.lstatSync(file).mtime }))
                        .sort((a, b) => b.mtime - a.mtime)
                        return res.length ? res[0] : ''
                    })
                }))
                .sort(function (a, b) {
                    if ($sort == 1) {
                        if (a.name < b.name) return -1;
                        if (a.name > b.name) return 1; 
                        return 0;
                    }
                    else if ($sort == 2) {
                        if (a.name > b.name) return -1;
                        if (a.name < b.name) return 1; 
                        return 0;
                    }
                    else if ($sort == 3) {
                        if (a.created < b.created) return -1;
                        if (a.created > b.created) return 1; 
                        return 0;
                    }
                    else if ($sort == 4) {
                        if (a.created > b.created) return -1;
                        if (a.created < b.created) return 1; 
                        return 0;
                    }
                    else if ($sort == 5) {
                        if (a.modified < b.modified) return -1;
                        if (a.modified > b.modified) return 1; 
                        return 0;
                    }
                    else if ($sort == 6) {
                        if (a.modified > b.modified) return -1;
                        if (a.modified < b.modified) return 1; 
                        return 0;
                    }
                })
            )
        }
    })
}

我的问题在于以下代码段:

modified: getDirectories(`${source}\${name.name}`, function (err, res) {
                    res = res.map(file => ({ file, mtime: fs.lstatSync(file).mtime }))
                    .sort((a, b) => b.mtime - a.mtime)
                    return res.length ? res[0] : ''
                })

我正在努力获取 return 值来设置 modified 对象。 如果我这样做 console.log(res) 我可以看到我得到了预期的结果

我列出了 HTML 中的所有文件夹及其名称、创建和修改的属性。

目录示例:

Working Dir
├──Work Space1
   └──Category1
      └──Location_a
         └── *.file_a1
         └── *.file_a2
         └── *.file_a3
      └──Location_b
         └── *.file_b1
         └── *.file_b2
         └── *.file_b3
   └──Category2
      └──Location_a
         └── *.file_a1
         └── *.file_a2
         └── *.file_a3
      └──Location_b
         └── *.file_b1
         └── *.file_b2
         └── *.file_b3
├──Work Space2
   └──Category1
      └──Location_a
         └── *.file_a1
         └── *.file_a2
         └── *.file_a3
      └──Location_b
         └── *.file_b1
         └── *.file_b2
         └── *.file_b3
   └──Category2
      └──Location_a
         └── *.file_a1
         └── *.file_a2
         └── *.file_a3
      └──Location_b
         └── *.file_b1
         └── *.file_b2
         └── *.file_b3

我需要获取每个 Work Space 中每个文件的最后修改文件,而不考虑子文件夹

HTML 输出示例:

尝试使用递归函数,添加您需要的统计信息,然后您可以对结果进行排序。

检查代码(包含目录路径,因此您可以在需要时制定层次结构(阅读文件解决方案的学分:)):

const getDirectories = (source) => {

    const files = [];

    function getFiles(dir) {

        fs.readdirSync(dir).map(file => {

            const absolutePath = path.join(dir, file);

            const stats = fs.statSync(absolutePath);

            if (fs.statSync(absolutePath).isDirectory()) {

                return getFiles(absolutePath);

            } else {
                const modified = {
                    name: file,
                    dir: dir,
                    created: stats.birthtime.toLocaleString(navigator.language),
                    modified: stats.mtime
                };
                return files.push(modified);
            }
        });
    }

    getFiles(source);
    return files;
}


const files = getDirectories(somePath);

console.log('\ngot files:', files.length);

// sort...
const lastModified = files.sort((a, b) => b.modified - a.modified);

console.log('\nlast modified:\n', lastModified[0]);

感谢 traynor 的 我让它工作了。必须进行一些更改才能使其适用于我的用例。

完整代码:

const getDirectories = (source, callback) => {

    const getAllFiles = (dir) => {
        let files = [];

        const getFiles = (dir) => {
            fs.readdirSync(dir).map(file => {
                const absolutePath = path.join(dir, file)
                const stats = fs.statSync(absolutePath)
                
                if (fs.statSync(absolutePath).isDirectory()) {
                    return getFiles(absolutePath)
                }
                else {
                    let modified = stats.mtime
                    
                    return files.push(modified)
                }
            })
        }

        getFiles(dir)
        return files.slice(1)
    }

    const getLastModified = (dir) => {
        let files = getAllFiles(dir)

        files = files.sort((a, b) => b - a)
        return files[0]
    }

    fs.readdir(source, { withFileTypes: true }, (err, files) => {
        if (err) {
            callback(err)
        } 
        else {
            callback(
                files
                .filter(dirent => dirent.isDirectory())
                .map(name => ({
                    name: name.name,
                    created: fs.statSync(`${source}\${name.name}`).birthtime.toLocaleString(navigator.language, {
                            day: '2-digit',
                            month: 'short',
                            year: '2-digit',
                            hour: '2-digit',
                            minute: '2-digit'
                        }
                    ),
                    modified: getLastModified(`${source}\${name.name}`).toLocaleString(navigator.language, {
                            day: '2-digit',
                            month: 'short',
                            year: '2-digit',
                            hour: '2-digit',
                            minute: '2-digit'
                        }
                    )
                }))
                .sort(function (a, b) {
                    if ($sort == 1) {
                        if (a.name < b.name) return -1;
                        if (a.name > b.name) return 1; 
                        return 0;
                    }
                    else if ($sort == 2) {
                        if (a.name > b.name) return -1;
                        if (a.name < b.name) return 1; 
                        return 0;
                    }
                    else if ($sort == 3) {
                        if (a.created < b.created) return -1;
                        if (a.created > b.created) return 1; 
                        return 0;
                    }
                    else if ($sort == 4) {
                        if (a.created > b.created) return -1;
                        if (a.created < b.created) return 1; 
                        return 0;
                    }
                    else if ($sort == 5) {
                        if (a.modified < b.modified) return -1;
                        if (a.modified > b.modified) return 1; 
                        return 0;
                    }
                    else if ($sort == 6) {
                        if (a.modified > b.modified) return -1;
                        if (a.modified < b.modified) return 1; 
                        return 0;
                    }
                })
            )
        }
    })
}

调用它:

let workSpaces

getDirectories(workSpaceDir, (dirs) => {
   workSpaces = dirs
})

这将 return 一个包含对象 namecreatedmodified 的数组。

整块

.sort(function (a, b) {
    if ($sort == 1) {
       if (a.name < b.name) return -1;
       if (a.name > b.name) return 1; 
       return 0;
    }...
})

...我有一个 <select/> 设置 $sort ( 是一个小型商店)所选选项的 ID。这将相应地对 workSpaces 数组进行排序。