Node.js – 获取当前文件名
如何获取当前的文件名,函数名和行号?
我想用它来logging/debugging目的,相当于__FILE__
, __FILE__
__LINE__
在c
console.log(__dirname) console.log(arguments.callee.toString())
Node.js提供了一个标准的API来做到这一点: Path 。
获取当前脚本的名称非常简单:
var path = require('path'); var scriptName = path.basename(__filename);
在一个模块中,您可以执行以下任何操作来获取具有文件名的完整path
this.filename; module.filename; __filename;
如果你只是想要没有path或扩展的实际名称,你可以做这样的事情。
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' ] * **/
这里我们使用正则expression式的 分割函数作为第一个参数。
我们想要分隔符的正则expression式是[\/]
(由/
或\
拆分),但是/
符号必须被转义以区别于正则expression式终结符/
,所以/[\\/]/
。
const scriptName = __filename.split(/[\\/]/).pop(); // Remove the last array element console.log(scriptName); // 'yourScript.js'
不要使用这个
你真的应该使用path.basename
来代替(首先在Node.js v0.1.25中logging ),因为它处理所有你不想知道的angular落情况像内部的斜线文件名(例如文件名为“foo \ bar”上UNIX)。 参见上面的 path
答案。
你也可以看看主机加 。 这增加了文件名和linenumber到任何日志文本,并且对.log,.info和.error具有不同的颜色。
那么,我想使用文件名作为logging器的标签,所以最直接的,我想要的是这样的:
__filename.substring(__dirname.length + 1, __filename.lastIndexOf("."))
我正在使用以下正则expression式:
([^\\/]+?)(?:\.[^\.\\/]*)?$
在string$
的末尾工作,有一个可选的非捕获组,用于可能的扩展名(?:\.[^\.\\/]*)?
在非目录分隔符之外的非贪婪捕获组之前是\/
。 文件名组是非贪婪的,允许下面的非捕获组放弃可能的扩展名。
一个实现将引用第一个也是唯一的捕获组[1]
:
var name = __filename.match(/([^\\/]+?)(?:\.[^\.\\/]*)?$/)[1];
带有非贪婪/懒惰说明符的文件名捕获组
([^\\/]+?) ^ lazy
要抛弃的可选扩展组锚定$
到string的末尾
(?:\.[^\.\\/]*)?$ ^^ ^ 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); });