Node.js - получение текущего имени файла


Ответы:


233

Node.js предоставляет для этого стандартный API: Путь .

Тогда легко получить имя текущего скрипта:

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

Разве это не получает базовое имя, а не фактическое имя файла?
— Фил

10
для сценария с именем script.jsвы получите script.js. Если вы хотите, чтобы имя было только без расширения, как мы говорим здесь о jsскрипте, вы можете использовать var scriptName = path.basename(__filename, '.js');orvar scriptName = path.basename(__filename, path.extname(__filename))
— herve

6
другой способ отказаться от расширения:path.parse(__filename).name
— RH Becker

__filenameне определен в модуле ES6.
— Cullub,

1
@Cullub, выдержка из документации nodejs : эти CommonJSпеременные недоступны в модулях ES. Эквиваленты __filenameи __dirnameмогут быть созданы внутри каждого файла с помощью import.meta.url.
— Herve

47

внутри модуля вы можете выполнить любое из следующих действий, чтобы получить полный путь с именем файла

this.filename;
module.filename;
__filename;

Если вам просто нужно настоящее имя без пути или расширения, вы можете сделать что-то вроде этого.

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

4
Вероятно, вы захотите использовать path.sep, чтобы сделать его кроссплатформенным. Вот что я сделал __filename.slice (__ filename.lastIndexOf (path.sep) +1);
— Ryan

2
Для тех, кто просто хочет скопировать и вставить этот супер-удобный однострочный var path = require('path');module.filename.slice(__filename.lastIndexOf(require('path').sep)+1, module.filename.length -3);
— текст

18
-3 предполагает длину расширения, что-то вроде этого может сработать лучшеpath.basename(module.filename, path.extname(module.filename))
— dre

32

Чтобы получить только имя файла. Никаких дополнительных модулей просто:

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

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

Вот для чего я сюда приехал. Спасибо!
— leviathanbadger

1
Это должен быть принятый ответ. Работает в строгом режиме. Очень просто. Спасибо!
— Мэтью

4
Если ваше расширение не состоит из двух символов, что вполне возможно, потому что вы можете привязать интерпретацию сценария к любому желаемому расширению файла ... так что это может быть не очень хорошим универсальным решением.
— ErikE

24
'use strict';

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

объяснение

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

Здесь мы используем функцию разделения с регулярным выражением в качестве первого параметра.
Регулярное выражение, которое мы хотим использовать в качестве разделителя, - это [\/](разделить на /или \), но /символ должен быть экранирован, чтобы отличать его от терминатора регулярного выражения /, поэтому /[\\/]/.

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

Не используйте это

Вы действительно должны использовать path.basenameвместо этого (впервые задокументировано в Node.js v0.1.25 ), потому что он обрабатывает все угловые случаи, о которых вы не хотите знать, например, имена файлов с косой чертой внутри (например, файл с именем "foo \ bar" в unix). См. pathОтвет выше .


Пожалуйста, добавьте объяснение
— Даниэль Чунг

@DanielCheung Вот ты где! Но на самом деле все это доступно для поиска в Интернете, просто погуглите javascript splitи приступайте.
— ilyaigpetrov 01

3
Я помогал вам ... -_- Ваш ответ был удален. Ответ, содержащий недостаточно пояснений или просто содержащий код, будет удален.
— Даниэль Чунг

3

Вы также можете посмотреть console-plus . Это добавляет имя файла и номер записи к любому тексту журнала и имеет разные цвета для .log, .info и .error.


Довольно круто. Установите с помощью «npm install --save console-plus» или, если вы используете yarn: «yarn add console-plus»
— Эндрю Фолкнер,

1

Ну, я хотел использовать имя файла в качестве тега для регистратора, поэтому самое простое и то, что я хотел, это следующее:

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

1

Я знаю, что прошло уже много времени, но я сделал то, что сделал __filename.split('\\').pop(). Это получит полный путь с именем файла, разделит его, а \затем получит последний индекс, который будет вашим именем файла.


1
На macOS__filename.split('/').pop()
— Рис Дэниелс

1

вы можете использовать эту функцию для получения имени файла:

/**
 * @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(/^.*[\\\/]/, '');
}

если вы используете nodejs, вы можете установить пакет, который включает эту функцию https://www.npmjs.com/package/jotils

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.