当前位置: 首页 > 知识库问答 >
问题:

golang如何获取这种文件的绝对路径?

孔志强
2024-09-07

go代码

package main

import "fmt"

func main() {
    fmt.Println("9527")
}

我把这个go编译为/usr/bin/demo

Apple.java

#!/usr/bin/demo
其他java代码

我直接执行Apple.java,里面的go代码会被执行的,我想go获取这个Apple.java的绝对路径。

我遍历了os.Args,如果java文件是相对路径执行的,得到的就是./Apple.java,如果是绝对路径执行的,能获取到。

共有2个答案

微生城
2024-09-07
package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    // 获取当前可执行文件的路径
    execPath, err := os.Executable()
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    // 获取当前执行的脚本的路径(通过 os.Args[0])
    scriptPath := os.Args[0]

    // 将路径转换为绝对路径
    absPath, err := filepath.Abs(scriptPath)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    // 打印绝对路径
    fmt.Println("Absolute path:", absPath)
}
徐安康
2024-09-07

在Go语言中,当你通过某种方式(如通过shell脚本或直接在命令行中)执行一个编译后的Go程序(如你的/usr/bin/demo),并且这个Go程序需要知道其被哪个脚本或文件调用(在这个例子中是Apple.java),Go程序本身并不能直接获取到调用它的脚本或文件的路径。这是因为操作系统和shell环境并不直接传递这种信息给被执行的程序。

不过,有几种方法可以尝试间接获取这个信息,但每种方法都有其局限性:

  1. 通过环境变量:你可以在调用/usr/bin/demo之前,设置一个环境变量来包含Apple.java的路径,然后在Go程序中读取这个环境变量。

    #!/bin/bash
    export APPLE_JAVA_PATH=$(realpath "$0")
    /usr/bin/demo

然后在Go程序中:

package main

import (
    "fmt"
    "os"
)

func main() {
    appleJavaPath := os.Getenv("APPLE_JAVA_PATH")
    if appleJavaPath == "" {
        fmt.Println("APPLE_JAVA_PATH is not set")
    } else {
        fmt.Println("Apple.java path:", appleJavaPath)
    }
}
  1. 修改shell脚本:如果你控制调用Go程序的shell脚本,你可以在脚本中解析$0(通常是脚本自身的路径),然后将其作为参数传递给Go程序。

    #!/bin/bash
    /usr/bin/demo "$(realpath "$0")"

然后在Go程序中,你可以通过os.Args来获取这个路径:

package main

import (
    "fmt"
    "os"
)

func main() {
    if len(os.Args) > 1 {
        fmt.Println("Called by script path:", os.Args[1])
    } else {
        fmt.Println("No script path provided")
    }
}
  1. 使用符号链接:如果可能,你可以创建一个指向Apple.java的符号链接,并在Go程序中解析这个链接指向的实际文件路径。但这种方法需要额外的步骤来创建和管理符号链接,并且不适用于直接执行Apple.java(因为Apple.java本身不是可执行文件)。

注意,Apple.java文件本身不是可执行文件,你提到的#!/usr/bin/demo行是shebang行,它通常用于脚本文件(如bash脚本或Python脚本),而不是Java文件。如果你的意图是让Apple.java通过某种方式触发Go程序的执行,你可能需要编写一个包装脚本(如bash脚本),该脚本首先执行必要的操作(如编译Java代码,尽管这看起来与你的问题不直接相关),然后调用Go程序,并传递必要的参数(如Apple.java的路径)。

 类似资料:
  • 我正试图在我的Android应用程序中导入sky.csv文件。 请帮我做这个。我试过这么多方法。然而,我没有得到任何适当的解决办法。

  • 问题内容: 给定路径,例如,我如何找到相对于Python中当前工作目录的文件的绝对路径?例如在Windows上,我可能会得到以下结果: 问题答案: 如果已经是绝对路径,也可以使用:

  • 本文向大家介绍获取Java中文件的绝对路径,包括了获取Java中文件的绝对路径的使用技巧和注意事项,需要的朋友参考一下 方法java.io.File.getAbsolutePath()用于获取字符串形式的文件的绝对路径。此方法不需要任何参数。 演示此的程序如下所示- 示例 上面程序的输出如下- 输出结果 现在让我们了解上面的程序。 使用方法java.io.File.getAbsolutePath(

  • 假设标准maven设置。 在Java中,我如何获得文件的绝对路径?

  • 本文向大家介绍JAVA获取文件绝对路径的方法,包括了JAVA获取文件绝对路径的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JAVA获取文件绝对路径的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Java程序设计有所帮助。

  • 问题内容: 嗨,我需要使用FileInputStream读取文件,但是我没有获得正确的路径。我的文件位于C:\ Users \ tester \ Documents \ Java Project \ Samples \ ProjectOne \ src \ pdfReader中。但是,当我使用以下代码时,我得到的错误路径是“ / C:/ Users / tester / Documents / J

  • 问题内容: 是否有任何API可以从绝对文件路径检索文件名? 例如来自 我知道它可以像字符串操作一样工作, 但是我想知道还有没有像Java 这样的“正式”方式可以做到这一点。 NodeJS从绝对路径获取文件名? 问题答案: 使用模块的方法: 这是上面示例的文档。