nodejs obtient le nom du fichier à partir du chemin absolu?

289

Si une API pouvait récupérer le nom de fichier à partir d'un chemin de fichier absolu?

par exemple "foo.txt"de"/var/www/foo.txt"

Je sais que cela fonctionne avec une opération de chaîne, fullpath.replace(/.+\//, '') mais je veux savoir s'il existe une manière plus «formelle», comme file.getName()en Java, de le faire.

NodeJS obtenir le nom de fichier à partir du chemin absolu?

fxp
la source

Réponses:

542

Utilisez la basenameméthode du pathmodule:

path.basename('/foo/bar/baz/asdf/quux.html')
// returns
'quux.html'

Voici la documentation dont l'exemple ci-dessus est tiré.

Victor Stanciu
la source
108
Si vous souhaitez également supprimer l'extension:path.basename(fpath, path.extname(fpath))
Waylon Flinn
33

Pour obtenir la partie nom de fichier du nom de fichier, la méthode de nom de base est utilisée:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var file = path.basename(fileName);

console.log(file); // 'python.exe'

Si vous voulez le nom de fichier sans l'extension, vous pouvez passer la variable d'extension (contenant le nom de l'extension) à la méthode de nom de base en disant à Node de renvoyer uniquement le nom sans l'extension:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var extension = path.extname(fileName);
var file = path.basename(fileName,extension);

console.log(file); // 'python'
Rubin bhandari
la source
4

Si vous savez déjà que le séparateur de chemin est /(c'est-à-dire que vous écrivez pour une plate-forme / un environnement spécifique), comme l'indique l'exemple de votre question, vous pouvez rester simple et diviser la chaîne par séparateur:

'/foo/bar/baz/asdf/quux.html'.split('/').pop()

Ce serait plus rapide (et plus propre imo) que de le remplacer par une expression régulière.

Encore une fois: ne faites cela que si vous écrivez pour un environnement spécifique, sinon utilisez le pathmodule, car les chemins sont étonnamment complexes. Windows, par exemple, prend /en charge dans de nombreux cas, mais pas pour, par exemple, les \\?\?préfixes de style utilisés pour les dossiers réseau partagés et similaires. Sous Windows, la méthode ci-dessus est vouée à l'échec, tôt ou tard.

Leo
la source
1
Windows a \ comme séparateur de dossier
OwnageIsMagic
1
@OwnageIsMagic Oui, c'est pourquoi j'écris «Si vous savez déjà que le séparateur de chemin est /» ... :)
leo
1
ce que vous vouliez dire avec cette déclaration n'est pas clair. Cela produit du code dépendant de la plate-forme qui échouera silencieusement sur d'autres plates
OwnageIsMagic
@OwnageIsMagic Oui, c'est vrai. Utilisez toujours les méthodes du module de chemin si vous n'écrivez pas pour une plate-forme spécifique.
leo
Windows accepte en fait les deux / et \ comme séparateurs de dossiers et vous pouvez même les mélanger
RozzA
3
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;

Vous donne le nom du fichier sans extension, si vous avez besoin du nom avec extension

var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.basename(filepath);
Kevin Muchwat
la source
0

Dans NodeJS, __filename.split (/ \ | //). Pop () renvoie uniquement le nom de fichier du chemin de fichier absolu sur n'importe quelle plate-forme de système d'exploitation. Pourquoi avoir besoin de se soucier de se souvenir / d'importer une API alors que cette approche regex nous permet également de nous souvenir de nos compétences regex.

Visv M
la source
1
Veuillez élaborer votre réponse.
JJ for Transparency et Monica
0

Nodejs est donc livré avec la variable globale par défaut appelée '__fileName' qui contient le fichier en cours d'exécution. Mon conseil est de passer le __fileName à un service à partir de n'importe quel fichier, afin que la récupération du fileName soit rendue dynamique

Ci-dessous, j'utilise la chaîne fileName, puis je la divise en fonction de la path.sep. Remarque path.sep évite les problèmes avec les séparateurs de fichiers posix et les séparateurs de fichiers Windows (problèmes avec '/' et '\'). C'est beaucoup plus propre. Obtenir la sous-chaîne et obtenir uniquement le dernier nom séparé et le soustraire avec la longueur actulale par 3 parle de lui-même.

Vous pouvez écrire un service comme celui-ci (notez que c'est en dactylographie, mais vous pouvez très bien l'écrire en js)

export class AppLoggingConstants {

    constructor(){

    }
      // Here make sure the fileName param is actually '__fileName'
    getDefaultMedata(fileName: string, methodName: string) {
        const appName = APP_NAME;
        const actualFileName = fileName.substring(fileName.lastIndexOf(path.sep)+1, fileName.length - 3);
        //const actualFileName = fileName;
     return appName+ ' -- '+actualFileName;
    }


}

export const AppLoggingConstantsInstance = new AppLoggingConstants();
Joey587
la source