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


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

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

9 64

9 ответов:

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

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

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

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

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

вы также можете посмотреть на

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

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

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

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

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

An реализация будет ссылаться на первую и единственную группу захвата [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);
});

оценка любезно https://regex101.com

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