nodejs Dateinamen vom absoluten Pfad erhalten?


289

Wenn es eine API gibt, die den Dateinamen von einem absoluten Dateipfad abrufen kann?

zB "foo.txt"aus"/var/www/foo.txt"

Ich weiß, dass es mit String-Operationen funktioniert, fullpath.replace(/.+\//, '') aber ich möchte wissen , ob es einen "formaleren" Weg gibt, wie es file.getName()in Java möglich ist.

NodeJS Dateinamen vom absoluten Pfad erhalten?

Antworten:


542

Verwenden Sie die basenameMethode des pathModuls:

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

Hier ist die Dokumentation, aus der das obige Beispiel stammt.


108
Wenn Sie auch die Erweiterung entfernen möchten:path.basename(fpath, path.extname(fpath))
Waylon Flinn

33

Um den Dateinamen-Teil des Dateinamens abzurufen, wird die Basename-Methode verwendet:

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

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

Wenn Sie den Dateinamen ohne die Erweiterung möchten, können Sie die Erweiterungsvariable (die den Erweiterungsnamen enthält) an die Basisnamenmethode übergeben und Node anweisen, nur den Namen ohne die Erweiterung zurückzugeben:

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'


4

Wenn Sie bereits wissen, dass das Pfadtrennzeichen ist /(dh Sie schreiben für eine bestimmte Plattform / Umgebung), wie im Beispiel in Ihrer Frage impliziert, können Sie es einfach halten und die Zeichenfolge nach Trennzeichen aufteilen:

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

Das wäre schneller (und sauberer imo) als durch regulären Ausdruck zu ersetzen.

Nochmals: Tun Sie dies nur, wenn Sie für eine bestimmte Umgebung schreiben, andernfalls verwenden Sie das pathModul, da die Pfade überraschend komplex sind. Windows unterstützt beispielsweise /in vielen Fällen, jedoch nicht beispielsweise die \\?\?für freigegebene Netzwerkordner und dergleichen verwendeten Stilpräfixe. Unter Windows ist die oben beschriebene Methode früher oder später zum Scheitern verurteilt.


1
Windows haben \ als
Ordnertrennzeichen

1
@OwnageIsMagic Ja, deshalb schreibe ich "Wenn Sie bereits wissen, dass das Pfadtrennzeichen / ist" ... :)
Leo

1
Es ist nicht klar, was Sie mit dieser Aussage gemeint haben. Dies erzeugt plattformabhängigen Code, der auf anderen Plattformen stillschweigend fehlschlägt
OwnageIsMagic

@OwnageIsMagic Ja, das tut es tatsächlich. Verwenden Sie immer die Methoden des Pfadmoduls, wenn Sie nicht für eine bestimmte Plattform schreiben.
Leo

Windows akzeptiert tatsächlich sowohl / als auch \ als Ordnertrenner und Sie können es sogar verwechseln
RozzA

3
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;

Gibt Ihnen den Namen der Datei ohne Erweiterung, wenn Sie den Namen mit Erweiterungsgebrauch benötigen

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

0

In NodeJS gibt __filename.split (/ \ | //). Pop () nur den Dateinamen aus dem absoluten Dateipfad auf jeder Betriebssystemplattform zurück. Warum sollten Sie sich um das Erinnern / Importieren einer API kümmern, während dieser Regex-Ansatz es uns auch ermöglicht, unsere Regex-Fähigkeiten zu sammeln?


1
Bitte erläutern Sie Ihre Antwort.
JJ für Transparenz und Monica

0

Daher wird Nodejs mit der globalen Standardvariablen geliefert '__fileName', die die aktuell ausgeführte Datei enthält. Mein Rat ist, den __fileName aus einer beliebigen Datei an einen Dienst zu übergeben, damit das Abrufen des Dateinamens dynamisch wird

Im Folgenden verwende ich die Dateinamenzeichenfolge und teile sie dann basierend auf der path.sep. Hinweis path.sep vermeidet Probleme mit Posix-Dateiseparatoren und Windows-Dateiseparatoren (Probleme mit '/' und '\'). Es ist viel sauberer. Es spricht für sich, den Teilstring zu erhalten und nur den letzten getrennten Namen zu erhalten und ihn mit der tatsächlichen Länge um 3 zu subtrahieren.

Sie können einen Dienst wie diesen schreiben (Beachten Sie, dass dies in Typoskript ist, aber Sie können es sehr gut in js schreiben)

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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.