Node.js comprueba si la ruta es un archivo o un directorio
Parece que no puedo obtener ningún resultado de búsqueda que explique cómo hacer esto.
Todo lo que quiero hacer es poder saber si una ruta determinada es un archivo o un directorio (carpeta).
Lo siguiente debería decírselo. De los documentos :
fs.lstatSync(path_string).isDirectory()
Los objetos devueltos por fs.stat() y fs.lstat() son de este tipo.
stats.isFile() stats.isDirectory() stats.isBlockDevice() stats.isCharacterDevice() stats.isSymbolicLink() // (only valid with fs.lstat()) stats.isFIFO() stats.isSocket()
NOTA:
La solución anterior será throw
un Error
if; por ejemplo, el file
o directory
no existe.
Si desea un enfoque true
o , intente lo mencionado por Joseph en los comentarios a continuación.false
fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();
Actualización: Node.Js >= 10
Podemos usar la nueva API fs.promises
const fs = require('fs').promises;
(async() => {
const stat = await fs.lstat('test.txt');
console.log(stat.isFile());
})().catch(console.error)
Cualquier versión de Node.Js
A continuación se explica cómo detectaría si una ruta es un archivo o un directorio de forma asincrónica , que es el enfoque recomendado en node. usando fs.lstat
const fs = require("fs");
let path = "/path/to/something";
fs.lstat(path, (err, stats) => {
if(err)
return console.log(err); //Handle error
console.log(`Is file: ${stats.isFile()}`);
console.log(`Is directory: ${stats.isDirectory()}`);
console.log(`Is symbolic link: ${stats.isSymbolicLink()}`);
console.log(`Is FIFO: ${stats.isFIFO()}`);
console.log(`Is socket: ${stats.isSocket()}`);
console.log(`Is character device: ${stats.isCharacterDevice()}`);
console.log(`Is block device: ${stats.isBlockDevice()}`);
});
Tenga en cuenta al utilizar la API sincrónica:
Cuando se utiliza el formulario sincrónico, cualquier excepción se genera inmediatamente. Puede usar try/catch para manejar excepciones o permitir que surjan.
try{
fs.lstatSync("/some/path").isDirectory()
}catch(e){
// Handle error
if(e.code == 'ENOENT'){
//no such file or directory
//do something
}else {
//do something else
}
}
En serio, ¿existe la pregunta de cinco años y ninguna fachada bonita?
function isDir(path) {
try {
var stat = fs.lstatSync(path);
return stat.isDirectory();
} catch (e) {
// lstatSync throws an error if path doesn't exist
return false;
}
}
Si necesita esto al iterar sobre un directorio (porque así es como encontré esta pregunta):
Desde Node 10.10+, fs.readdir
tiene una withFileTypes
opción que hace que devuelva una entrada de directorio fs.Dirent
en lugar de cadenas. Las entradas del directorio tienen una name
propiedad y métodos útiles como isDirectory
o isFile
, por lo que no es necesario llamarlos fs.lstat
explícitamente.
import { promises as fs } from 'fs';
// ./my-dir has two subdirectories: dir-a, and dir-b
const dirEntries = await fs.readdir('./my-dir', { withFileTypes: true });
// let's filter all directories in ./my-dir
const onlyDirs = dirEntries.filter(de => de.isDirectory()).map(de => de.name);
// onlyDirs is now [ 'dir-a', 'dir-b' ]