Node.js comprueba si la ruta es un archivo o un directorio

Resuelto ThomasReggi asked hace 11 años • 8 respuestas

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).

ThomasReggi avatar Mar 26 '13 13:03 ThomasReggi
Aceptado

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á throwun Errorif; por ejemplo, el fileo directoryno existe.

Si desea un enfoque trueo , intente lo mencionado por Joseph en los comentarios a continuación.falsefs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();

Jason Sperske avatar Mar 26 '2013 06:03 Jason Sperske

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
   }
}
Marcos Casagrande avatar Apr 30 '2017 00:04 Marcos Casagrande

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;
    }
}
kungfooman avatar Nov 29 '2018 00:11 kungfooman

Si necesita esto al iterar sobre un directorio (porque así es como encontré esta pregunta):

Desde Node 10.10+, fs.readdirtiene una withFileTypesopción que hace que devuelva una entrada de directorio fs.Direnten lugar de cadenas. Las entradas del directorio tienen una namepropiedad y métodos útiles como isDirectoryo isFile, por lo que no es necesario llamarlos fs.lstatexplí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' ]
Zdenek F avatar Dec 12 '2021 22:12 Zdenek F