GOOGLE ADS

lunes, 2 de mayo de 2022

NodeJs: obtenga el último archivo modificado en los subdirectorios del directorio

Tengo el siguiente código para enumerar todo foldersdentro 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 directoriesarchivo 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 modifiedobjeto. 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 Spaceindependientemente de las subcarpetas.

Y ejemplo de la salida HTML:

ingrese la descripción de la imagen aquí


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

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...