562 votes

Node.js vérifie si le chemin est un fichier ou un répertoire

Je n'arrive pas à trouver de résultats de recherche expliquant comment procéder.

Tout ce que je veux, c'est savoir si un chemin donné est un fichier ou un répertoire (dossier).

876voto

Jason Sperske Points 12389

Ce qui suit devrait vous renseigner. De la documents :

fs.lstatSync(path_string).isDirectory() 

Les objets renvoyés par fs.stat() et fs.lstat() sont de ce type.

stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isSymbolicLink() // (only valid with fs.lstat())
stats.isFIFO()
stats.isSocket()

NOTE :

En solution ci-dessus volonté throw un Error si, par exemple, le file o directory n'existe pas.

Si vous souhaitez un true o false approche, essayez fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory(); comme le mentionne Joseph dans les commentaires ci-dessous.

20 votes

Notez que la version asynchrone est généralement préférable si vous vous souciez des performances générales de l'application.

49 votes

Gardez à l'esprit que si le répertoire ou le fichier n'existe pas, vous obtiendrez une erreur en retour.

26 votes

let isDirExists = fs.existsSync(dirPath) && fs.lstatSync(dirPath).isDirectory();

97voto

Marcos Casagrande Points 15232

Mise à jour : Node.Js >= 10

Nous pouvons utiliser le nouveau fs.promesses API

const fs = require('fs').promises;

(async() => {
    const stat = await fs.lstat('test.txt');
    console.log(stat.isFile());
})().catch(console.error)

Toute version de Node.Js

Voici comment détecter si un chemin est un fichier ou un répertoire de manière asynchrone qui est l'approche recommandée dans les nœuds. en utilisant 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()}`);
});

Remarque lors de l'utilisation de l'API synchrone :

Lors de l'utilisation de la forme synchrone, toute exception Vous pouvez utiliser try/catch pour gérer les exceptions ou les laisser remonter.

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
   }
}

34voto

lama12345 Points 169

Sérieusement, la question existe depuis cinq ans et il n'y a pas de belle façade ?

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;
    }
}

17voto

Zdenek F Points 318

Si vous en avez besoin pour itérer sur un répertoire 1

Depuis Node 10.10+, fs.readdir a withFileTypes qui lui permet de renvoyer l'entrée du répertoire fs.Dirent au lieu du seul nom de fichier. L'entrée du répertoire contient son name et des méthodes utiles telles que isDirectory o isFile Vous n'avez donc pas besoin d'appeler fs.lstat explicitement !

Vous pouvez donc l'utiliser comme suit :

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' ]

1) Parce que c'est ainsi que j'ai trouvé cette question.

15voto

cndw Points 149

En fonction de vos besoins, vous pouvez probablement vous appuyer sur les fonctions de node path module.

Il se peut que vous ne puissiez pas accéder au système de fichiers (par exemple, le fichier n'a pas encore été créé) et, à vrai dire, vous voudrez probablement éviter d'accéder au système de fichiers à moins que vous n'ayez vraiment besoin de la validation supplémentaire. Si vous pouvez supposer que ce que vous vérifiez est conforme à la norme .<extname> il suffit de regarder le nom.

Évidemment, si vous cherchez un fichier sans nom d'extension, vous devrez consulter le système de fichiers pour vous en assurer. Mais restez simple jusqu'à ce que vous ayez besoin de plus de complexité.

const path = require('path');

function isFile(pathItem) {
  return !!path.extname(pathItem);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X