nodejs uzyskać nazwę pliku z bezwzględnej ścieżki?

289

Jeśli jakiś interfejs API mógłby pobrać nazwę pliku z bezwzględnej ścieżki pliku?

np. "foo.txt"z"/var/www/foo.txt"

Wiem, że działa z operacją na łańcuchach, fullpath.replace(/.+\//, '') ale chcę wiedzieć, czy istnieje bardziej „formalny” sposób, jak file.getName()w Javie, aby to zrobić.

NodeJS uzyskać nazwę pliku z bezwzględnej ścieżki?

fxp
źródło

Odpowiedzi:

542

Skorzystaj z basenamemetody pathmodułu:

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

Oto dokumentacja, z której wzięto powyższy przykład.

Victor Stanciu
źródło
108
Jeśli chcesz również usunąć rozszerzenie:path.basename(fpath, path.extname(fpath))
Waylon Flinn
33

Aby uzyskać część nazwy pliku z nazwą pliku, używana jest metoda basename:

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

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

Jeśli chcesz nazwę pliku bez rozszerzenia, możesz przekazać zmienną rozszerzenia (zawierającą nazwę rozszerzenia) do metody basename, informując Node, aby zwrócił tylko nazwę bez rozszerzenia:

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
źródło
4

Jeśli już wiesz, że separatorem ścieżek jest /(tzn. Piszesz dla konkretnej platformy / środowiska), jak sugeruje przykład w twoim pytaniu, możesz to uprościć i podzielić ciąg według separatora:

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

Byłoby to szybsze (i czystsze imo) niż zastąpienie wyrażeniem regularnym.

Ponownie: rób to tylko wtedy, gdy piszesz dla określonego środowiska, w przeciwnym razie skorzystaj z pathmodułu, ponieważ ścieżki są zaskakująco złożone. Na przykład system Windows obsługuje /w wielu przypadkach, ale nie na przykład dla \\?\?prefiksów stylów używanych dla udostępnionych folderów sieciowych i tym podobnych. W systemie Windows powyższa metoda jest skazana na niepowodzenie, prędzej czy później.

Lew
źródło
1
Windows ma \ jako separator folderów
OwnageIsMagic
1
@OwnageIsMagic Tak, dlatego piszę „Jeśli już wiesz, że separatorem ścieżki jest /” ... :)
leo
1
nie jest jasne, co miałeś na myśli z tym stwierdzeniem. W ten sposób powstaje kod zależny od platformy, który po cichu zawiedzie na innych platformach
OwnageIsMagic
@OwnageIsMagic Tak, rzeczywiście. Zawsze używaj metod modułu ścieżki, jeśli nie piszesz na konkretną platformę.
leo
Windows akceptuje zarówno / i \ jako separatory folderów i możesz je nawet pomieszać
RozzA
3
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;

Podaje nazwę pliku bez rozszerzenia, jeśli potrzebujesz nazwy z rozszerzeniem

var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.basename(filepath);
Kevin Muchwat
źródło
0

W NodeJS nazwa_pliku.split (/ \ | //). Pop () zwraca tylko nazwę pliku z bezwzględnej ścieżki do pliku na dowolnej platformie systemu operacyjnego. Po co dbać o zapamiętywanie / importowanie API, podczas gdy to podejście do wyrażenia regularnego pozwala nam również przypomnieć sobie nasze umiejętności wyrażania regularnego.

Visv M.
źródło
1
Proszę opracować swoją odpowiedź.
JJ dla Transparency and Monica
0

Nodejs ma więc domyślną zmienną globalną o nazwie '__fileName' która wstrzymuje bieżący plik. Moja rada to przekazywanie __nazwa_pliku do usługi z dowolnego pliku, aby pobieranie nazwy pliku stało się dynamiczne

Poniżej wykorzystuję ciąg fileName, a następnie podzielę go na podstawie path.sep. Uwaga path.sep pozwala uniknąć problemów z separatorami plików POSIX i separatorami plików Windows (problemy z „/” i „\”). Jest o wiele czystszy. Pobieranie podciągów i uzyskiwanie tylko ostatniej oddzielnej nazwy i odejmowanie jej o długości rzeczywistej o 3 mówi samo za siebie.

Możesz napisać taką usługę (uwaga: to maszynopis, ale bardzo dobrze możesz napisać w 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
źródło