如何获取当前文件名,功能名称和行号?
我想将它用于记录/调试目的,相当于c中的__FILE__
,__LINE__
答案 0 :(得分:190)
Node.js提供了一个标准API:Path。
获取当前脚本的名称很简单:
var path = require('path');
var scriptName = path.basename(__filename);
答案 1 :(得分:41)
在模块中,您可以执行以下任一操作以获取文件名
的完整路径this.filename;
module.filename;
__filename;
如果您只想要没有路径或扩展名的实际名称,可以执行以下操作。
module.filename.slice(__filename.lastIndexOf(path.sep)+1, module.filename.length -3);
答案 2 :(得分:24)
仅获取文件名。 没有额外的模块:
// abc.js
console.log(__filename.slice(__dirname.length + 1));
// abc
console.log(__filename.slice(__dirname.length + 1, -3));
答案 3 :(得分:19)
'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函数,regular expression作为第一个参数
我们想要用于分隔符的正则表达式是[\/]
(由/
或\
拆分)但必须转义/
符号以将其与正则表达式终止符/
区分开,所以/[\\/]/
。
const scriptName = __filename.split(/[\\/]/).pop(); // Remove the last array element
console.log(scriptName);
// 'yourScript.js'
你真的应该使用path.basename
代替(documented in Node.js v0.1.25},因为它会处理你不想知道的所有角落情况,例如带有斜杠的文件名(例如文件名为&# 34; foo \ bar"在unix上)。请参阅path
answer above。
答案 4 :(得分:3)
您也可以查看console-plus。这会将文件名和亚麻布添加到任何日志记录文本中,并为.log,.info和.error提供不同的颜色。
答案 5 :(得分: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
答案 6 :(得分:0)
好吧,我想使用文件名作为记录器的标签,所以最直接的和我想要的是:
__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))
答案 7 :(得分:0)
我正在使用以下正则表达式:
([^\\/]+?)(?:\.[^\.\\/]*)?$
从字符串$
的末尾开始,有一个可选的非捕获组,用于可能的扩展名(?:\.[^\.\\/]*)?
,前面是非贪婪捕获除目录分隔符\/
以外的任何内容的组。文件名组非贪婪允许以下非捕获组丢弃可能的扩展名。
实现将引用第一个也是唯一一个捕获组[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);
});
提供
答案 8 :(得分:0)
我知道已经很长时间了,但是我所做的是__filename.split('\\').pop()
。这将获得带有文件名的完整路径,将其除以\
,然后获得最后一个索引,即您的文件名。
答案 9 :(得分:-4)
console.log(__dirname)
console.log(arguments.callee.toString())