nodejs ottiene il nome del file dal percorso assoluto?


289

Se ci fosse qualche API in grado di recuperare il nome del file da un percorso di file assoluto?

es. "foo.txt"da"/var/www/foo.txt"

So che funziona con l'operazione stringa, come, fullpath.replace(/.+\//, '') ma voglio sapere c'è un modo più 'formale', come file.getName()in Java, potrebbe farlo.

NodeJS ottiene il nome del file dal percorso assoluto?

Risposte:


542

Utilizzare il basenamemetodo del pathmodulo:

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

Ecco la documentazione da cui è tratto l'esempio sopra.


108
Se vuoi rimuovere anche l'estensione:path.basename(fpath, path.extname(fpath))
Waylon Flinn

33

Per ottenere la parte del nome file del nome file, viene utilizzato il metodo basename:

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

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

Se si desidera il nome del file senza l'estensione, è possibile passare la variabile di estensione (contenente il nome dell'estensione) al metodo basename dicendo a Node di restituire solo il nome senza l'estensione:

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

Se sai già che il separatore di percorso è /(cioè stai scrivendo per una piattaforma / ambiente specifici), come implica l'esempio nella tua domanda, potresti mantenerlo semplice e dividere la stringa per separatore:

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

Sarebbe più veloce (e più pulito imo) rispetto alla sostituzione con espressione regolare.

Di nuovo: fallo solo se stai scrivendo per un ambiente specifico, altrimenti usa il pathmodulo, poiché i percorsi sono sorprendentemente complessi. Windows, ad esempio, supporta /in molti casi ma non ad esempio i \\?\?prefissi di stile utilizzati per cartelle di rete condivise e simili. Su Windows, il metodo sopra è destinato a fallire, prima o poi.


1
Windows ha \ come separatore di cartelle
OwnageIsMagic

1
@OwnageIsMagic Sì, è per questo che scrivo "Se sai già che il separatore di percorso è /" ... :)
Leo

1
non è chiaro cosa intendevi con questa affermazione. Questo produce codice dipendente dalla piattaforma che fallirà silenziosamente su altre piattaforme
OwnageIsMagic

@OwnageIsMagic Sì, lo fa davvero. Utilizzare sempre i metodi del modulo path se non si sta scrivendo per una piattaforma specifica.
leo

windows in realtà accetta sia / sia \ come separatori di cartelle e puoi persino confonderlo
RozzA

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

Ti dà il nome del file senza estensione, se hai bisogno del nome con estensione usa

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

0

In NodeJS, __filename.split (/ \ | //). Pop () restituisce solo il nome del file dal percorso del file assoluto su qualsiasi piattaforma del sistema operativo. Perché è necessario preoccuparsi di ricordare / importare un'API mentre questo approccio regex ci consente anche di ricordare le nostre abilità regex.


1
Per favore, elabora la tua risposta.
JJ per Transparency e Monica,

0

Quindi Nodejs viene fornito con la variabile globale predefinita chiamata '__fileName'che contiene il file corrente in esecuzione. Il mio consiglio è di passare __fileName a un servizio da qualsiasi file, in modo da rendere dinamico il recupero del fileName

Di seguito, utilizzo la stringa fileName e quindi la divido in base a path.sep. Nota path.sep evita problemi con separatori di file posix e separatori di file di Windows (problemi con '/' e '\'). È molto più pulito. Ottenere la sottostringa e ottenere solo l'ultimo nome separato e sottrarlo con la lunghezza attulale di 3 parla da sé.

Puoi scrivere un servizio come questo (Nota che è in dattiloscritto, ma puoi benissimo scriverlo in 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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.