Tengo el siguiente código para enumerar todo folders
dentro de un directory
, y asigna el nombre y la fecha de creación de cada carpeta. Estoy luchando por obtener el último archivo modificado dentro del sub directories
archivo folders
.
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;
}
})
)
}
})
}
Mi problema es con el siguiente fragmento:
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]: ''
})
Estoy luchando por obtener un valor de retorno para establecer el modified
objeto. Si lo hago console.log(res)
puedo ver que obtengo el resultado esperado
Estoy enumerando todas las carpetas en HTML con el nombre, las propiedades creadas y modificadas.
Un ejemplo de los directorios:
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
Necesito obtener el último archivo modificado de cada archivo dentro de cada uno, Work Space
independientemente de las subcarpetas.
Y ejemplo de la salida HTML:
Solución del problema
intente con la función recursiva, agregue las estadísticas que necesita, luego puede ordenar los resultados.
verifique el código (la ruta del directorio está incluida para que pueda calcular la jerarquía si es necesario (créditos para leer la solución de archivos: la respuesta de Smally )):
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]);
No hay comentarios:
Publicar un comentario