【问题标题】:Get file name from absolute path in Nodejs?nodejs从绝对路径获取文件名?
【发布时间】:2013-11-17 15:47:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: node.js path fs


    【解决方案1】:

    使用path模块的basename方法:

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

    Here 是上述示例的文档。

    【讨论】:

    • 如果您还想删除扩展名:path.basename(fpath, path.extname(fpath))
    【解决方案2】:

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

    【讨论】:

    • 如果你想要不带扩展名的文件名,我推荐使用:path.parse(fileName).name
    【解决方案3】:
    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'
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      【解决方案5】:

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

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

      这将是faster(并且更清洁 imo)而不是用正则表达式替换。

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

      【讨论】:

      • Windows 使用 \ 作为文件夹分隔符
      • @OwnageIsMagic 是的,这就是为什么我写“如果你已经知道路径分隔符是 /”... :)
      • 不清楚您对这句话的意思。这会生成依赖于平台的代码,这些代码将在其他平台上静默失败
      • @OwnageIsMagic 是的,确实如此。如果您不是为特定平台编写代码,请始终使用 path 模块的方法。
      • windows 实际上接受 / 和 \ 作为文件夹分隔符,您甚至可以混合使用
      【解决方案6】:

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

      【讨论】:

      • 请详细说明你的答案。
      【解决方案7】:

      所以 Nodejs 带有一个名为 '__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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 2020-04-10
        • 2016-07-23
        • 2010-09-18
        相关资源
        最近更新 更多