在Nodejs中如何从绝对路径获取文件名?

457

如何在Nodejs中从绝对路径获取文件名?

例如:从"/var/www/foo.txt"获取"foo.txt"

我知道可以使用字符串操作,例如fullpath.replace(/.+\//, ''),但我想知道是否有像Java中的file.getName()这样的显式方法?

9个回答

815

使用 path 模块的 basename 方法:

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

这里是上面例子所提取的文档。


176
如果您也想删除文件扩展名:path.basename(fpath, path.extname(fpath)) - Waylon Flinn

77

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

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

console.log(file); // 'python.exe'
如果你想获得没有文件扩展名的文件名,你可以将包含扩展名的变量(即 extension variable)传递给 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'

5
如果你想要不带扩展名的文件名,建议使用以下代码:path.parse(fileName).name - hong4rc

43
var path = require("path");

var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";

var name = path.parse(filepath).name;
console.log(name); //python

var base = path.parse(filepath).base;
console.log(base); //python.exe

var ext = path.parse(filepath).ext;
console.log(ext); //.exe

16

2
此外,这条评论也很有用。 - diralik

4
如果您已经知道路径分隔符是 / (即您正在为特定平台/环境编写代码),就像您问题中的示例所暗示的那样,您可以通过分隔符简单地拆分字符串:
'/foo/bar/baz/asdf/quux.html'.split('/').pop()

那比使用正则表达式替换更快(并且我认为更清洁)。再次强调:仅在编写特定环境的代码时才这样做,否则请使用“路径”模块,因为路径非常复杂。例如,在许多情况下,Windows 支持“/”,但不支持像“\\?\?”这样用于共享网络文件夹等的前缀。在 Windows 上,上述方法迟早会失败。

1
Windows使用\作为文件夹分隔符。 - OwnageIsMagic
1
@OwnageIsMagic 是的,这就是为什么我写“如果你已经知道路径分隔符是/”... :) - leo
1
这句话的意思不太清楚。这会产生平台相关的代码,在其他平台上会悄无声息地失败。 - OwnageIsMagic
@OwnageIsMagic 是的,确实如此。如果您不是为特定平台编写代码,请始终使用路径模块的方法。 - leo
Windows 实际上接受 / 和 \ 作为文件夹分隔符,甚至可以混合使用。 - RozzA
@RozzA 很抱歉,并非总是如此:https://msdn.microsoft.com/zh-cn/library/aa365247.aspx - leo

4

path 是一个 nodeJS 模块,这意味着您不必安装任何包来使用它的属性。

import path from 'path'
const dir_name = path.basename('/Users/Project_naptha/demo_path.js')
console.log(dir_name)

// returns
demo_path.js

1
在Node.js中,您可以使用path模块从绝对路径中获取文件名。具体来说,您可以使用path.basename()函数从给定的路径中提取文件名。
示例代码:
const path = require('path');

const absolutePath = '/var/www/foo.txt';
const fileName = path.basename(absolutePath);

console.log(fileName); // Output: foo.txt
path.basename() 函数会自动从给定的路径中提取文件名。

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

1
请详细阐述您的答案。 - JJJ

0

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

下面,我使用fileName字符串,然后根据path.sep进行拆分。注意,path.sep避免了posix文件分隔符和Windows文件分隔符的问题('/'和'\'的问题)。这样做更加简洁。获取子字符串并仅获取最后一个分隔名称,并将其减去实际长度3,这说明了它本身的作用。

您可以编写此类服务(请注意,此处使用TypeScript,但您完全可以使用JavaScript编写)

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接