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).
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).
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()
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.
Notez que la version asynchrone est généralement préférable si vous vous souciez des performances générales de l'application.
Gardez à l'esprit que si le répertoire ou le fichier n'existe pas, vous obtiendrez une erreur en retour.
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)
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
}
}
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.
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 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.