Necesito encontrar una manera de crear la carpeta más nueva en un directorio. Por lo general, hay de 3 a 5 carpetas diferentes dentro de una carpeta, y quiero encontrar la más nueva ya sea por nombre de carpeta (numeración de versión más reciente) o fecha y hora de creación. Generalmente, el nombre de la carpeta sería así:
version-0101xxxxxxxxxxxx
(x representando la versión más reciente)
Puede obtener directorios con ' fs ' usando ' readdirSync ', luego mirar dentro de cada directorio recursivamente.
Este fragmento de código se extrae de ( esta pregunta respondida ):
const fs = require('fs'); const path = require('path'); function flatten(lists) { return lists.reduce((a, b) => a.concat(b), []); } function getDirectories(srcpath) { return fs.readdirSync(srcpath) .map(file => path.join(srcpath, file)) .filter(path => fs.statSync(path).isDirectory()); } function getDirectoriesRecursive(srcpath) { return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; } let dirs = getDirectoriesRecursive(__dirname); console.info(path);Esto le dará una matriz con todos los directorios, luego solo necesita hacer un bucle en su matriz con la condición que necesita.
Puede usar el módulo fs incorporado de node.js para esto. En primer lugar, debe enumerar todos los archivos y carpetas en el directorio que desea buscar.
let dirs = await fs.readdir(dirName, { withFileTypes: true, });Puede usar fs.promises.readdir para esto. Asegúrese de agregar la opción "withFileTypes" porque brinda información adicional que puede usar para distinguir carpetas de archivos. A continuación, puede filtrar todos los archivos de esta manera:
dirs = dirs.filter((file) => file.isDirectory()).map((dirent) => dirent.name);Esto le da un resultado como ["primera carpeta", "segunda carpeta", etc.] Y luego puede recorrer la matriz anterior y encontrar la carpeta más nueva usando el método fs.promises.stat
let newestFolder = await fs.stat(path.join(dirName, dirs[0])); let newestFolderName = dirs[0]; for (let directory of dirs) { const stats = await fs.stat(path.join(dirName, directory)); if (stats.ctimeMs > newestFolder.ctimeMs) { newestFolder = stats; newestFolderName = directory; } }Y luego puede crear la ruta absoluta de ese directorio usando el módulo de ruta:
const absoultePath = path.resolve(path.join(dirName, newestFolderName));Así es como se ve la función usando promesas :
const fs = require("fs/promises"); const path = require("path"); async function getNewestDirectory(dirName) { let dirs = await fs.readdir(dirName, { withFileTypes: true, }); dirs = dirs.filter((file) => file.isDirectory()).map((dirent) => dirent.name); let newestFolder = await fs.stat(path.join(dirName, dirs[0])); let newestFolderName = dirs[0]; for (let directory of dirs) { const stats = await fs.stat(path.join(dirName, directory)); if (stats.ctimeMs > newestFolder.ctimeMs) { newestFolder = stats; newestFolderName = directory; } } console.log("newestFolder", newestFolder); console.log("newestFolderName", newestFolderName); return path.resolve(path.join(dirName, newestFolderName)); }y utilizando un enfoque síncrono (no recomendado):
const fs = require("fs"); let dirs = fs.readdirSync(".", { withFileTypes: true, }); dirs = dirs.filter((file) => file.isDirectory()).map((dirent) => dirent.name); let newestFolder = fs.statSync(dirs[0]); let newestFolderName = dirs[0]; for (let directory of dirs) { const stats = fs.statSync(directory); if (stats.ctimeMs > newestFolder.ctimeMs) { newestFolder = stats; newestFolderName = directory; } console.log("newestFolder", newestFolder); console.log("newestFolderName", newestFolderName); }