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


289

是否有任何API可以从绝对文件路径检索文件名?

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

我知道它可以像字符串操作一样工作,fullpath.replace(/.+\//, '') 但是我想知道还有没有像file.getName()Java 这样的“正式”方法可以做到这一点。

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

Answers:


542

使用模块的basename方法path

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

是上面示例的文档。


108
如果您还想删除扩展名:path.basename(fpath, path.extname(fpath))
Waylon Flinn

33

要获取文件名的文件名部分,请使用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'


4

/问题示例所示,如果您已经知道路径分隔符是(即您正在为特定的平台/环境编写),则可以使其保持简单并通过分隔符来分割字符串:

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

这将比用正则表达式替换更快(更干净的imo)。

再次:仅在针对特定环境编写代码时才这样做,否则请使用该path模块,因为路径异常复杂。例如,Windows /在许多情况下均支持,但支持例如\\?\?用于共享网络文件夹等的样式前缀。在Windows上,以上方法注定迟早会失败。


1
Windows使用\作为文件夹分隔符
OwnageIsMagic

1
@OwnageIsMagic是的,这就是为什么我写“如果您已经知道路径分隔符是/”的原因... :)
leo

1
目前尚不清楚您对这句话的意思。这将产生依赖于平台的代码,这些代码将在其他平台上静默失败
OwnageIsMagic

@OwnageIsMagic是的,的确如此。如果不为特定平台编写,请始终使用路径模块的方法。
狮子座

Windows实际上将/和\都接受为文件夹分隔符,并且您甚至可以将其混合使用
-RozzA

3
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;

如果需要带扩展名的文件,则为您提供不带扩展名的文件名

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

0

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


1
请详细说明您的答案。
JJ for Transparency和Monica,

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();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.