1109 votes

Comment obtenir le chemin vers le script actuel avec Node.js ?

Comment puis-je obtenir le chemin vers le script dans Node.js ?

Je sais qu'il y a process.cwd mais cela ne fait référence qu'au répertoire où le script a été appelé, pas au script lui-même. Par exemple, disons que je suis dans /home/kyle/ et je lance la commande suivante :

node /home/kyle/some/dir/file.js

Si j'appelle process.cwd() j'obtiens /home/kyle/ pas /home/kyle/some/dir/ . Y a-t-il un moyen d'obtenir ce répertoire ?

6 votes

nodejs.org/docs/latest/api/globals.html le lien de documentation de la réponse acceptée.

1530voto

Kyle Slattery Points 4136

Je l'ai trouvé après avoir relu la documentation. Ce que je cherchais, c'était les __filename y __dirname des variables au niveau du module.

  • __filename est le nom du fichier du module actuel. C'est le chemin absolu résolu du fichier du module actuel. (ex : /home/kyle/some/dir/file.js )
  • __dirname est le nom du répertoire du module actuel. (ex : /home/kyle/some/dir )

3 votes

Si vous ne voulez que le nom du répertoire et non le chemin complet, vous pouvez faire quelque chose comme ceci : function getCurrentDirectoryName() { var fullPath = __dirname ; var path = fullPath.split('/') ; var cwd = path[path.length-1] ; return cwd ; }

64 votes

@AnthonyMartin __dirname.split("/").pop()

6 votes

Pour ceux qui essaient la solution @apx (comme je l'ai fait :), cette solution ne fonctionne pas sous Windows.

273voto

Marc Points 1492

Donc, en gros, vous pouvez faire ça :

fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);

Utilisez resolve() au lieu de concaténer avec '/' ou '\', sinon vous rencontrerez des problèmes de multiplateforme.

Note : __dirname est le chemin local du module ou du script inclus. Si vous écrivez un plugin qui a besoin de connaître le chemin du script principal, c'est :

require.main.filename

ou, pour obtenir simplement le nom du dossier :

require('path').dirname(require.main.filename)

16 votes

Si votre but est simplement d'analyser et d'interagir avec le fichier json, vous pouvez souvent le faire plus facilement via var settings = require('./settings.json') . Bien sûr, il s'agit d'une entrée-sortie synchrone, donc ne le faites pas au moment de l'exécution, mais au moment du démarrage, c'est bon, et une fois chargé, il sera mis en cache.

2 votes

@Marc Merci ! Depuis un certain temps, je me débrouillais pour contourner le fait que __dirname est local à chaque module. J'ai une structure imbriquée dans ma bibliothèque et j'ai besoin de connaître à plusieurs endroits la racine de mon application. Je suis content de savoir comment faire maintenant :D

0 votes

Node V8 : path.dirname(process.mainModule.filename)

154voto

Azarus Points 940

Utilisez __dirname !!

__dirname

Le nom du répertoire du module actuel. C'est la même chose que la fonction path.dirname() de la fonction __filename .

Exemple : exécution de node example.js depuis /Users/mjr

console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr

https://nodejs.org/api/modules.html#modules_dirname

Pour les ESModules, il faut utiliser : import.meta.url

1 votes

Cela survit également aux liens symboliques. Ainsi, si vous créez un bin et que vous avez besoin de trouver un fichier, par exemple path.join(__dirname, "../example.json") ; cela fonctionnera toujours lorsque votre binaire sera lié dans node_modules/.bin.

3 votes

Non seulement cette réponse a été donnée des années auparavant, mais aussi ne fonctionne plus avec les modules ES .

140voto

Masoud Siahkali Points 2883

Cette commande renvoie le répertoire courant :

var currentPath = process.cwd();

Par exemple, pour utiliser le chemin d'accès pour lire le fichier :

var fs = require('fs');
fs.readFile(process.cwd() + "\\text.txt", function(err, data)
{
    if(err)
        console.log(err)
    else
        console.log(data.toString());
});

0 votes

Pour ceux qui n'ont pas compris Asynchrone y Synchrone voir ce lien... stackoverflow.com/a/748235/5287072

23 votes

C'est exactement ce que le PO ne veut pas... la demande est pour le chemin de l'exécutable script !

5 votes

Le répertoire actuel est une chose très différente. Si vous exécutez quelque chose comme cd /foo; node bar/test.js Le répertoire actuel serait /foo mais le script se trouve à l'adresse suivante /foo/bar/test.js .

85voto

GOTO 0 Points 3049

Node.js 10 prend en charge Modules ECMAScript__dirname y __filename ne sont plus disponibles .

Ensuite, pour obtenir le chemin vers le module ES actuel qu'il faut utiliser :

import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);

Et pour le répertoire contenant le module courant :

import { dirname } from 'path';
import { fileURLToPath } from 'url';

const __dirname = dirname(fileURLToPath(import.meta.url));

0 votes

Comment puis-je savoir si j'écris un module ES ou non ? Est-ce que cela dépend simplement de la version de Node que j'utilise, ou si j'utilise des mots-clés d'import/export ?

2 votes

Modules ES disponibles uniquement avec --experimental-modules drapeau.

5 votes

--experimental-modules n'est nécessaire que si vous utilisez une version de node < 13.2. nommez simplement le fichier .mjs plutôt que .js.

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