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 一个包含对象 name
、created
和 modified
的数组。
整块
.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
数组进行排序。
我有以下代码列出 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 一个包含对象 name
、created
和 modified
的数组。
整块
.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
数组进行排序。