388

如果有任何 API 可以从绝对文件路径中检索文件名?

例如"foo.txt""/var/www/foo.txt"

我知道它适用于字符串操作,fullpath.replace(/.+\//, '') 但我想知道是否有更“正式”的方式,比如file.getName()在 java 中,可以做到这一点。

NodeJS从绝对路径获取文件名?

4

7 回答 7

716

使用模块的basename方法path

path.basename('/foo/bar/baz/asdf/quux.html')
// returns
'quux.html'

是上面示例的文档。

于 2013-11-06T11:59:15.650 回答
62

要获取文件名的文件名部分,使用 basename 方法:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var file = path.basename(fileName);

console.log(file); // 'python.exe'

如果您想要不带扩展名的文件名,可以将扩展变量(包含扩展名)传递给 basename 方法,告诉 Node 只返回不带扩展名的名称:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var extension = path.extname(fileName);
var file = path.basename(fileName,extension);

console.log(file); // 'python'
于 2018-05-24T06:24:05.310 回答
19
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;
// returns
'python'

以上代码返回不带扩展名的文件名,如果需要带扩展名的文件名使用

var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.basename(filepath);
// returns
'python.exe'
于 2019-03-23T05:54:33.837 回答
14

对于那些有兴趣从文件名中删除扩展名的人,您可以使用 https://nodejs.org/api/path.html#path_path_basename_path_ext

path.basename('/foo/bar/baz/asdf/quux.html', '.html');
于 2018-07-11T17:58:25.010 回答
4

如果您已经知道路径分隔符是/(即您正在为特定平台/环境编写),正如您问题中的示例所暗示的那样,您可以保持简单并按分隔符拆分字符串:

'/foo/bar/baz/asdf/quux.html'.split('/').pop()

这将比用正则表达式替换更快(并且更清洁 imo)。

再说一遍:只有在为特定环境编写时才这样做,否则使用path模块,因为路径非常复杂。例如,Windows/在许多情况下支持但支持用于共享网络文件夹等的\\?\?样式前缀。在 Windows 上,上述方法迟早注定要失败。

于 2017-12-07T21:24:14.753 回答
0

在 NodeJS 中,__filename.split(/\|//).pop() 仅返回来自任何 OS 平台上的绝对文件路径的文件名。为什么需要关心记住/导入 API,而这种正则表达式方法也让我们回忆起我们的正则表达式技能。

于 2019-04-19T00:22:59.717 回答
0

所以 Nodejs 带有一个名为的默认全局变量 '__fileName',它保存正在执行的当前文件 我的建议是将 __fileName 从任何文件传递给服务,以便对 fileName 的检索进行动态

下面,我使用 fileName 字符串,然后根据path.sep. 注意 path.sep 避免了 posix 文件分隔符和 windows 文件分隔符的问题('/' 和 '\' 的问题)。它更干净。获取子字符串并仅获取最后一个分隔名称并将其与实际长度相减 3 本身就说明了问题。

您可以编写这样的服务(注意这是在 typescript 中,但您可以很好地用 js 编写)

export class AppLoggingConstants {

    constructor(){

    }
      // Here make sure the fileName param is actually '__fileName'
    getDefaultMedata(fileName: string, methodName: string) {
        const appName = APP_NAME;
        const actualFileName = fileName.substring(fileName.lastIndexOf(path.sep)+1, fileName.length - 3);
        //const actualFileName = fileName;
     return appName+ ' -- '+actualFileName;
    }


}

export const AppLoggingConstantsInstance = new AppLoggingConstants();
于 2019-06-18T10:16:16.287 回答