Подтвердить что ты не робот

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

Как получить текущее имя файла, имя функции и номер строки?

Я хочу использовать его для целей ведения журнала/отладки, эквивалентного __FILE__, __LINE__ в c

4b9b3361

Ответ 1

console.log(__dirname)
console.log(arguments.callee.toString())

Ответ 2

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

Получение названия текущего script легко:

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

Ответ 3

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

this.filename;
module.filename;
__filename;

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

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

Ответ 4

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

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

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

Ответ 5

'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' ]
 *
**/

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

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 ответа выше.

Ответ 6

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

Ответ 7

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

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

Ответ 8

Я использую следующее регулярное выражение:

([^\\/]+?)(?:\.[^\.\\/]*)?$

Работая с конца строки $, существует необязательная группа, не подлежащая захвату, для возможного расширения (?:\.[^\.\\/]*)?, которому предшествует нежелательная группа захвата для чего-либо, кроме разделителей каталогов \/. Группа имени файла является неживой, позволяя следующей группе, не содержащей захвата, отказаться от возможного расширения.

Реализация будет ссылаться на первую и единственную группу захвата [1]:

var name = __filename.match(/([^\\/]+?)(?:\.[^\.\\/]*)?$/)[1];

Группа захвата имени файла с неживым/ленивым спецификатором

([^\\/]+?)
        ^
       lazy

Необязательная группа расширения, которая должна быть отброшена привязана $ до конца строки

  (?:\.[^\.\\/]*)?$
   ^^            ^   
non-capture   optional

var regex = /([^\\/]+?)(?:\.[^\.\\/]*)?$/;
[
 ["abc.js", "abc"],
 ["/tmp/test/../lib/stuff.js", "stuff"],
 ["c:\\temp\\test\\..\\lib\\stuff.js", "stuff"],
 ["./abc/def.js", "def"],
 [".\\abc\\win.js", "win"],
 ["./lib/my-module.js", "my-module"],
 [".\\lib/my-dotless", "my-dotless"],
 ["..///lib/..\\\\.//..dots&seps..", "..dots&seps."],
 ["trailing-dots...js", "trailing-dots.."]
 ].forEach( test => {
	var name = test[0].match(regex)[1];
  var result = test[0] + " => " + test[1] + " # " + (name === test[1] ? "Passed" : "Failed");
  console.log(result);
});

Ответ 9

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

Ответ 10

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

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