nodejs mendapatkan nama file dari path absolut?

289

Jika ada API dapat mengambil nama file dari jalur file absolut?

misalnya "foo.txt"dari"/var/www/foo.txt"

Saya tahu ini bekerja dengan operasi string, seperti fullpath.replace(/.+\//, '') tetapi saya ingin tahu apakah ada cara yang lebih 'formal', seperti file.getName()di java, bisa melakukannya.

NodeJS mendapatkan nama file dari path absolut?

fxp
sumber

Jawaban:

542

Gunakan basenamemetode pathmodul:

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

Berikut adalah dokumentasi contoh di atas diambil.

Victor Stanciu
sumber
108
Jika Anda juga ingin menghapus ekstensi:path.basename(fpath, path.extname(fpath))
Waylon Flinn
33

Untuk mendapatkan bagian nama file dari nama file, metode basename digunakan:

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

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

Jika Anda ingin nama file tanpa ekstensi, Anda bisa meneruskan variabel ekstensi (berisi nama ekstensi) ke metode nama dasar yang memberitahu Node untuk hanya mengembalikan nama tanpa ekstensi:

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
sumber
4

Jika Anda sudah tahu bahwa pemisah path adalah /(yaitu Anda menulis untuk platform / lingkungan tertentu), seperti tersirat pada contoh dalam pertanyaan Anda, Anda bisa membuatnya tetap sederhana dan memecah string dengan pemisah:

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

Itu akan lebih cepat (dan imo bersih) daripada mengganti dengan ekspresi reguler.

Sekali lagi: Hanya lakukan ini jika Anda menulis untuk lingkungan tertentu, jika tidak gunakan pathmodul, karena jalur sangat kompleks. Windows, misalnya, mendukung /dalam banyak kasus tetapi tidak untuk misalnya \\?\?awalan gaya yang digunakan untuk folder jaringan bersama dan sejenisnya. Pada Windows metode di atas pasti gagal, cepat atau lambat.

Leo
sumber
1
Windows memiliki \ sebagai pemisah folder
OwnageIsMagic
1
@OwnageIsMagic Ya, itu sebabnya saya menulis "Jika Anda sudah tahu bahwa pemisah jalur adalah /" ... :)
leo
1
tidak jelas apa yang Anda maksud dengan pernyataan ini. Ini menghasilkan kode yang tergantung platform yang akan gagal secara diam-diam di platform lain
OwnageIsMagic
@OwnageIsMagic Ya, memang. Selalu gunakan metode modul jalur jika Anda tidak menulis untuk platform tertentu.
leo
windows benar-benar menerima keduanya / dan \ sebagai pemisah folder & Anda bahkan dapat mencampurnya
RozzA
3
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;

Memberi Anda nama file tanpa ekstensi, jika Anda perlu nama dengan penggunaan ekstensi

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

Di NodeJS, __filename.split (/ \ | //). Pop () mengembalikan hanya nama file dari jalur file absolut pada platform OS apa pun. Mengapa perlu peduli mengingat / mengimpor API sementara pendekatan regex ini juga memungkinkan kami mengingat kembali keterampilan regex kami.

Visv M
sumber
1
Tolong jelaskan jawaban Anda.
JJ untuk Transparansi dan Monica
0

Jadi Nodejs hadir dengan variabel global default yang disebut '__fileName'yang menyimpan file saat ini dieksekusi. Saran saya adalah meneruskan __fileName ke layanan dari file apa pun, sehingga pengambilan fileName menjadi dinamis

Di bawah, saya menggunakan string fileName dan kemudian membaginya berdasarkan path.sep. Catatan path.sep menghindari masalah dengan pemisah file posix dan pemisah file windows (masalah dengan '/' dan '\'). Jauh lebih bersih. Mendapatkan substring dan hanya mendapatkan nama yang terpisah terakhir dan menguranginya dengan panjang actulal sebanyak 3 berbicara untuk dirinya sendiri.

Anda dapat menulis layanan seperti ini (Catatan ini dalam bentuk naskah, tetapi Anda dapat menuliskannya dalam 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
sumber