Node.js - pobieranie aktualnej nazwy pliku


Odpowiedzi:


231

Node.js udostępnia do tego standardowy interfejs API: Path .

Uzyskanie nazwy bieżącego skryptu jest wtedy łatwe:

var path = require('path');
var scriptName = path.basename(__filename);

Czy to nie otrzymuje nazwy basenowej, a nie rzeczywistej nazwy pliku?
— Phil

10
dla skryptu o nazwie script.js, otrzymasz script.js. Jeśli chcesz mieć tylko nazwę bez rozszerzenia, tak jak mówimy tutaj o jsskrypcie, możesz użyć var scriptName = path.basename(__filename, '.js');lubvar scriptName = path.basename(__filename, path.extname(__filename))
— herve

6
inny sposób na rezygnację z rozszerzenia:path.parse(__filename).name
— RH Becker

__filenamenie jest zdefiniowany w module ES6.
— Cullub

1
@Cullub, wypakuj z dokumentacji nodejs : Te CommonJSzmienne nie są dostępne w modułach ES. Odpowiedniki __filenamei __dirnamemożna tworzyć w każdym pliku za pośrednictwem import.meta.url.
— herve

47

w module możesz wykonać dowolną z następujących czynności, aby uzyskać pełną ścieżkę z nazwą pliku

this.filename;
module.filename;
__filename;

Jeśli potrzebujesz tylko rzeczywistej nazwy bez ścieżki ani rozszerzenia, możesz zrobić coś takiego.

module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);

4
Prawdopodobnie chcesz użyć path.sep, aby uczynić go międzyplatformowym. Oto, co zrobiłem __filename.slice (__ filename.lastIndexOf (path.sep) +1);
— Ryan

2
Dla tych, którzy po prostu chcą, aby skopiować i wkleić ten bardzo poręczna jedno-liner, nie zapomnij albo var path = require('path');wcześniej lub zmienić gomodule.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
— forrestranger

17
-3 zakłada długość przedłużenia, coś takiego może działać lepiejpath.basename(module.filename, path.extname(module.filename))
— dre

32

Aby uzyskać tylko nazwę pliku. Brak dodatkowego modułu po prostu:

// abc.js
console.log(__filename.slice(__dirname.length + 1));

 // abc
console.log(__filename.slice(__dirname.length + 1, -3));

Po to tu przyjechałem. Dzięki!
— leviathanbadger

1
To powinna być akceptowana odpowiedź. Działa w trybie ścisłym. Bardzo proste. Dziękuję Ci!
— Matthew

3
Chyba że twoje rozszerzenie nie jest długości 2 znaków, co jest całkowicie możliwe, ponieważ możesz powiązać interpretację skryptu z dowolnym rozszerzeniem pliku ... więc może to nie być dobre uniwersalne rozwiązanie.
— ErikE

24
'use strict';

const scriptName = __filename.split(/[\\/]/).pop();

Wyjaśnienie

console.log(__filename);
// 'F:\__Storage__\Workspace\StackOverflow\yourScript.js'
const parts = __filename.split(/[\\/]/);
console.log(parts);
/*
 * [ 'F:',
 *   '__Storage__',
 *   'Workspace',
 *   'StackOverflow',
 *   'yourScript.js' ]
 *
**/

Tutaj używamy funkcji split z wyrażeniem regularnym jako pierwszym parametrem.
Wyrażenie regularne, którego chcemy jako separator, to [\/](podzielone przez /lub \), ale /symbol musi zostać zmieniony, aby odróżnić go od terminatora wyrażenia regularnego /, więc /[\\/]/.

const scriptName = __filename.split(/[\\/]/).pop(); // Remove the last array element
console.log(scriptName);
// 'yourScript.js'

Nie używaj tego

Naprawdę powinieneś użyć path.basenamezamiast tego (po raz pierwszy udokumentowano w Node.js v0.1.25 ), ponieważ obsługuje on wszystkie narożne przypadki, o których nie chcesz wiedzieć, jak nazwy plików ze ukośnikami w środku (np. Plik o nazwie "foo \ bar" na unixie). Zobacz pathodpowiedź powyżej .


Proszę dodać wyjaśnienie
— Daniel Cheung

@DanielCheung Tutaj jesteś! Ale tak naprawdę wszystko to można przeszukiwać w Internecie, po prostu wygoogluj javascript spliti zacznij działać.
— ilyaigpetrov

3
Pomagałem ci ... -_- Twoja odpowiedź była głosowana za usunięciem. Odpowiedź niewystarczająco wyjaśniająca lub zawierająca tylko kod zostanie usunięta.
— Daniel Cheung

3

Możesz również spojrzeć na console-plus . To dodaje nazwę pliku i numer linii do dowolnego tekstu logowania i ma różne kolory dla .log, .info i .error.


Całkiem fajne. Zainstaluj za pomocą „npm install --save console-plus” lub jeśli używasz yarn: „yarn add console-plus”
— Andrew Faulkner,

1

Cóż, chciałem użyć nazwy pliku jako tagu dla loggera, więc najbardziej prosty i chciałem to:

__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))

1

Wiem, że minęło już dużo czasu, ale to co zrobiłem __filename.split('\\').pop(). Spowoduje to uzyskanie pełnej ścieżki z nazwą pliku, podziel go, \a następnie otrzyma ostatni indeks, który będzie nazwą pliku.


1
W systemie macOS__filename.split('/').pop()
— Reece Daniels

1

możesz użyć tej funkcji, aby uzyskać nazwę pliku:

/**
 * @description 
 * get file name from path
 * @param {string} path path to get file name
 * @returns {string} file name
 * @example 
 * getFileName('getFileName/index.js') // => index.js
 */
export default function getFileName(path) {
    return path.replace(/^.*[\\\/]/, '');
}

jeśli używasz nodejs, możesz zainstalować pakiet zawierający tę funkcję https://www.npmjs.com/package/jotils

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.