Node.js - obtention du nom de fichier actuel


Réponses:


231

Node.js fournit une API standard pour ce faire: Path .

Obtenir le nom du script courant est alors facile:

var path = require('path');
var scriptName = path.basename(__filename);

Cela n'obtient-il pas le nom de base plutôt que le nom de fichier réel?
— Phil

10
pour un script nommé script.js, vous obtiendrez script.js. Si vous voulez avoir le nom uniquement sans extension, comme nous parlons ici d'un jsscript, vous pouvez utiliser var scriptName = path.basename(__filename, '.js');ouvar scriptName = path.basename(__filename, path.extname(__filename))
— herve

6
une autre façon de supprimer l'extension:path.parse(__filename).name
— RH Becker

__filenamen'est pas défini dans un module ES6.
— Cullub le

1
@Cullub, extrait de la documentation nodejs : Ces CommonJSvariables ne sont pas disponibles dans les modules ES. Des équivalents de __filenameet __dirnamepeuvent être créés à l'intérieur de chaque fichier via import.meta.url.
— herve le

46

dans un module, vous pouvez effectuer l'une des opérations suivantes pour obtenir le chemin complet avec le nom de fichier

this.filename;
module.filename;
__filename;

Si vous voulez juste le nom réel sans chemin ni extension, vous pouvez faire quelque chose comme ça.

module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);

4
Vous voudrez probablement utiliser path.sep pour le rendre multiplateforme. Voici ce que j'ai fait __filename.slice (__ filename.lastIndexOf (path.sep) +1);
— Ryan

2
Pour ceux qui veulent juste copier et coller ce one-liner super pratique, n'oubliez pas de le var path = require('path');changer à l' avance ou de le changer enmodule.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
— forrestranger

17
le -3 suppose une longueur d'extension, quelque chose comme ça pourrait mieux fonctionnerpath.basename(module.filename, path.extname(module.filename))
— dre

32

Pour obtenir uniquement le nom du fichier. Pas de module supplémentaire simplement:

// abc.js
console.log(__filename.slice(__dirname.length + 1));

 // abc
console.log(__filename.slice(__dirname.length + 1, -3));

C'est pour ça que je suis venu ici. Merci!
— leviathanbadger

1
Cela devrait être la réponse acceptée. Fonctionne en mode strict. Très simple. Je vous remercie!
— Matthieu

3
À moins que votre extension ne soit pas longue de 2 caractères, ce qui est tout à fait possible car vous pouvez lier l'interprétation de script à n'importe quelle extension de fichier de votre choix ... donc ce n'est peut-être pas une bonne solution complète.
— ErikE

24
'use strict';

const scriptName = __filename.split(/[\\/]/).pop();

Explication

console.log(__filename);
// 'F:\__Storage__\Workspace\StackOverflow\yourScript.js'
const parts = __filename.split(/[\\/]/);
console.log(parts);
/*
 * [ 'F:',
 *   '__Storage__',
 *   'Workspace',
 *   'StackOverflow',
 *   'yourScript.js' ]
 *
**/

Ici, nous utilisons la fonction de fractionnement avec une expression régulière comme premier paramètre.
L'expression régulière que nous voulons pour séparateur est [\/](divisée par /ou \) mais le /symbole doit être échappé pour le distinguer du terminateur d' expression régulière /, donc /[\\/]/.

const scriptName = __filename.split(/[\\/]/).pop(); // Remove the last array element
console.log(scriptName);
// 'yourScript.js'

Ne l'utilisez pas

Vous devriez vraiment utiliser à la path.basenameplace ( documenté pour la première fois dans Node.js v0.1.25 ), car il gère tous les cas d'angle que vous ne voulez pas connaître comme les noms de fichiers avec des barres obliques à l'intérieur (par exemple le fichier nommé "foo \ bar" sous unix). Voir la pathréponse ci-dessus .


S'il vous plaît ajouter une explication
— Daniel Cheung

@DanielCheung Vous y êtes! Mais vraiment tout cela est consultable sur Internet, il suffit de google javascript splitet de commencer.
— ilyaigpetrov

3
Je vous aidais ... -_- Votre réponse était votée pour la suppression. Une réponse qui n'explique pas suffisamment ou ne contient que du code sera supprimée.
— Daniel Cheung

3

Vous pouvez également regarder console-plus . Cela ajoute un nom de fichier et un numéro de lin à tout texte de journalisation et a des couleurs différentes pour .log, .info et .error.


Plutôt cool. Installez avec "npm install --save console-plus", ou si vous utilisez yarn: "yarn add console-plus"
— Andrew Faulkner

1

Eh bien, je voulais utiliser le nom du fichier comme étiquette pour l'enregistreur, donc le plus simple et ce que je voulais est le suivant:

__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))

1

Je sais que ça fait déjà longtemps, mais ce que j'ai fait l'est __filename.split('\\').pop(). Cela obtiendra le chemin complet avec le nom du fichier, le divisera \puis le dernier index qui sera votre nom de fichier.


1
Sur macOS__filename.split('/').pop()
— Reece Daniels

1

vous pouvez utiliser cette fonction pour obtenir le nom du fichier:

/**
 * @description 
 * get file name from path
 * @param {string} path path to get file name
 * @returns {string} file name
 * @example 
 * getFileName('getFileName/index.js') // => index.js
 */
export default function getFileName(path) {
    return path.replace(/^.*[\\\/]/, '');
}

si vous utilisez nodejs, vous pouvez installer le package qui inclut cette fonction https://www.npmjs.com/package/jotils

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.