La réponse à cette question a évolué au fil des ans. Le site actuel est ici en haut, suivie des différentes réponses au fil des ans par ordre chronologique :
Réponse actuelle
Vous pouvez utiliser fs.existsSync()
:
const fs = require("fs"); // Or `import fs from "fs";` with ESM
if (fs.existsSync(path)) {
// Do something
}
Il a été déprécié pendant plusieurs années, mais ne l'est plus. Extrait de la documentation :
Notez que fs.exists()
est déprécié, mais fs.existsSync()
ne l'est pas. (Le paramètre paramètre de rappel de fs.exists()
accepte des paramètres qui sont incompatibles avec d'autres callbacks Node.js. fs.existsSync()
n'est pas utilise pas de callback).
Vous avez spécifiquement demandé un synchrone mais si vous pouvez utiliser un asynchrone à la place (c'est généralement mieux avec les E/S), utilisez fs.promises.access
si vous utilisez async
fonctions ou fs.access
(depuis exists
est déprécié ) sinon :
Dans un async
fonction :
try {
await fs.promises.access("somefile");
// The check succeeded
} catch (error) {
// The check failed
}
Ou avec un rappel :
fs.access("somefile", error => {
if (!error) {
// The check succeeded
} else {
// The check failed
}
});
Réponses historiques
Voici les réponses historiques par ordre chronologique :
-
Réponse originale de 2010
( stat
/ statSync
o lstat
/ lstatSync
)
-
Mise à jour de septembre 2012
( exists
/ existsSync
)
-
Mise à jour février 2015
(Notant la dépréciation imminente de exists
/ existsSync
donc nous sommes probablement de retour à stat
/ statSync
o lstat
/ lstatSync
)
-
Mise à jour de décembre 2015
(Il y a aussi fs.access(path, fs.F_OK, function(){})
/ fs.accessSync(path, fs.F_OK)
mais notez que si le fichier/répertoire n'existe pas, c'est une erreur ; la documentation pour fs.stat
recommande d'utiliser fs.access
si vous devez vérifier l'existence sans ouvrir)
-
Mise à jour de décembre 2016
fs.exists()
est toujours déprécié mais fs.existsSync()
n'est plus déprécié. Vous pouvez donc l'utiliser en toute sécurité.
Réponse originale de 2010 :
Vous pouvez utiliser statSync
o lstatSync
( lien docs ), qui vous donnent un fs.Stats
objet . En général, si une version synchrone d'une fonction est disponible, elle aura le même nom que la version asynchrone avec Sync
à la fin. Donc statSync
est la version synchrone de stat
; lstatSync
est la version synchrone de lstat
etc.
lstatSync
vous indique à la fois si quelque chose existe, et si oui, si c'est un fichier ou un répertoire (ou dans certains systèmes de fichiers, un lien symbolique, un périphérique de bloc, un périphérique de caractère, etc :
var fs = require('fs');
try {
// Query the entry
stats = fs.lstatSync('/the/path');
// Is it a directory?
if (stats.isDirectory()) {
// Yes it is
}
}
catch (e) {
// ...
}
...et de la même manière, si c'est un fichier, il y a isFile
Si c'est un dispositif de bloc, il y a isBlockDevice
etc., etc. Notez le try/catch
; il jette une erreur si l'entrée n'existe pas du tout.
Si vous ne vous souciez pas de ce que l'entrée est et vous voulez seulement savoir s'il existe, vous pouvez utiliser path.existsSync
(ou avec le dernier, fs.existsSync
) comme noté par l'utilisateur618408 :
~~var path = require('path');
if (path.existsSync("/the/path")) { // or fs.existsSync
// ...
}~~
Il ne nécessite pas de try/catch
mais ne vous donne aucune information sur ce qu'est cette chose, juste qu'elle est là. path.existsSync
a été déprécié il y a longtemps.
Note complémentaire : Vous avez expressément demandé comment vérifier de manière synchrone J'ai donc utilisé le xyzSync
des versions des fonctions ci-dessus. Mais dans la mesure du possible, avec les E/S, il est vraiment préférable d'éviter les appels synchrones. Les appels au sous-système d'E/S prennent beaucoup de temps du point de vue de l'unité centrale. Notez combien il est facile d'appeler lstat
plutôt que lstatSync
:
// Is it a directory?
lstat('/the/path', function(err, stats) {
if (!err && stats.isDirectory()) {
// Yes it is
}
});
Mais si vous avez besoin de la version synchrone, elle est là.
Mise à jour de septembre 2012
La réponse ci-dessous, qui date d'il y a quelques années, est maintenant un peu dépassée. La méthode actuelle consiste à utiliser fs.existsSync
pour faire une vérification synchrone de l'existence des fichiers/répertoires (ou bien sûr fs.exists
pour une vérification asynchrone), plutôt que la méthode path
versions ci-dessous.
Ejemplo:
var fs = require('fs');
if (fs.existsSync(path)) {
// Do something
}
// Or
fs.exists(path, function(exists) {
if (exists) {
// Do something
}
});
Mise à jour février 2015
Et nous voici en 2015 et les documents de Node disent maintenant que fs.existsSync
(et fs.exists
) "sera déprécié". (Parce que les gens de Node pensent qu'il est stupide de vérifier si quelque chose existe avant de l'ouvrir, ce qui est le cas ; mais ce n'est pas la seule raison de vérifier si quelque chose existe).
Donc nous sommes probablement de retour aux diverses stat
des méthodes... Jusqu'à ce que cela change à nouveau, bien sûr.
Mise à jour de décembre 2015
Je ne sais pas depuis combien de temps c'est là, mais il y a aussi fs.access(path, fs.F_OK, ...)
/ fs.accessSync(path, fs.F_OK)
. Et au moins à partir d'octobre 2016, le fs.stat
documentation recommande d'utiliser fs.access
pour effectuer des contrôles d'existence ( "Pour vérifier si un fichier existe sans le manipuler par la suite, fs.access()
est recommandé." ). Mais notez que l'accès n'étant pas disponible est considéré comme une erreur Il est donc préférable de procéder ainsi si vous souhaitez que le fichier soit accessible :
var fs = require('fs');
try {
fs.accessSync(path, fs.F_OK);
// Do something
} catch (e) {
// It isn't accessible
}
// Or
fs.access(path, fs.F_OK, function(err) {
if (!err) {
// Do something
} else {
// It isn't accessible
}
});
Mise à jour de décembre 2016
Vous pouvez utiliser fs.existsSync()
:
if (fs.existsSync(path)) {
// Do something
}
Il a été déprécié pendant plusieurs années, mais ne l'est plus. Extrait de la documentation :
Notez que fs.exists()
est déprécié, mais fs.existsSync()
ne l'est pas. (Le paramètre paramètre de rappel de fs.exists()
accepte des paramètres qui sont incompatibles avec d'autres callbacks Node.js. fs.existsSync()
n'utilise pas utilise pas de callback).
72 votes
Les opérations synchrones sont idéales pour effectuer des opérations ponctuelles sur des fichiers/répertoires avant de renvoyer un module. Par exemple, l'amorçage d'un fichier de configuration.
1 votes
@PaulDraper avec un cachet chaud n'est pas vrai dans tous les cas.
22 votes
Quelles que soient les performances, il arrive parfois que l'on veuille l'exécuter de manière synchronisée pour l'expérience du développeur. Par exemple, si vous utilisez Node pour un script de traitement de données qui, par conception, devrait être bloquant, dans ce cas, l'asynchronisme est nécessaire.
exists
ne fait qu'ajouter des rappels inutiles.5 votes
Définitivement +1 à la déclaration de Kunok. Dans le reste de mon code, je ne le complexifie que lorsqu'il s'agit d'un goulot d'étranglement où la vitesse compte vraiment. Pourquoi n'appliquerais-je pas ce principe à la lecture des fichiers ? Dans de nombreuses parties de nombreux programmes, la simplicité/lisibilité du code peut être plus importante que la vitesse d'exécution. S'il s'agit d'un goulot d'étranglement, j'utiliserai des méthodes asynchrones pour éviter d'interrompre l'exécution du code. Sinon... la synchro est parfaite. Ne détestez pas aveuglément la synchro.
6 votes
S'il vous plaît... pas "à noter" parce que l'utilisateur demande explicitement comment le faire de manière synchrone.