Как получить текущее имя файла, имя функции и номер строки?
Я хочу использовать его для целей ведения журнала/отладки, эквивалентного __FILE__
, __LINE__
в c
Как получить текущее имя файла, имя функции и номер строки?
Я хочу использовать его для целей ведения журнала/отладки, эквивалентного __FILE__
, __LINE__
в c
console.log(__dirname)
console.log(arguments.callee.toString())
Node.js предоставляет стандартный API для этого: Path.
Получение названия текущего script легко:
var path = require('path');
var scriptName = path.basename(__filename);
внутри модуля вы можете выполнить любое из следующих действий, чтобы получить полный путь с именем файла
this.filename;
module.filename;
__filename;
Если вы просто хотите, чтобы фактическое имя без пути или расширения, вы можете сделать что-то вроде этого.
module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);
Чтобы получить только имя файла. Нет дополнительного модуля просто:
// abc.js
console.log(__filename.slice(__dirname.length + 1));
// abc
console.log(__filename.slice(__dirname.length + 1, -3));
'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
ответа выше.
Вы также можете посмотреть console-plus. Это добавляет имя файла и linenumber к любому протоколированию текста и имеет разные цвета для .log,.info и .error.
Ну, я хотел использовать имя файла в качестве тега для регистратора, поэтому самое прямое и то, что мне нужно, это следующее:
__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))
Я использую следующее регулярное выражение:
([^\\/]+?)(?:\.[^\.\\/]*)?$
Работая с конца строки $
, существует необязательная группа, не подлежащая захвату, для возможного расширения (?:\.[^\.\\/]*)?
, которому предшествует нежелательная группа захвата для чего-либо, кроме разделителей каталогов \/
. Группа имени файла является неживой, позволяя следующей группе, не содержащей захвата, отказаться от возможного расширения.
Реализация будет ссылаться на первую и единственную группу захвата [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);
});
Я знаю, что это было уже давно, но я сделал __filename.split('\\').pop()
. Это позволит получить полный путь к имени файла, разделить его на \
затем получить последний индекс, который будет вашим именем файла.
Вы можете использовать эту функцию, чтобы получить имя файла:
/**
* @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(/^.*[\\\/]/, '');
}