Golang中如何获取应用程序的父目录

Golang中如何获取应用程序的父目录 我需要获取应用程序当前目录及其父目录,当前目录的获取并不困难,我按照以下方式实现:

	wd,err := os.Getwd()
	if err != nil {
	    panic(err)
	}

	fmt.Println(filepath.Dir(wd))

如何获取父目录?例如:

应用程序目录为: /home/ubuntu/sigasat-go/calampgateway

我需要获取: /home/ubuntu/sigasat-go

我已经在谷歌上搜索了很多次,但没有找到解决方案。感谢任何帮助。

5 回复

我指的是可执行文件夹。

更多关于Golang中如何获取应用程序的父目录的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我在项目中使用了这段代码:

path, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
	log.Fatal(err)
}

这使我能够从任何位置执行我的程序。同时我使用 filepath.Join(path, filename) 来安全访问应用程序子文件夹中的其他文件。 sunglasses

补充说明:我认为使用相对路径不是个好主意。考虑到从crontab运行应用程序时绝对路径的重要性。

有内置的方法可以找到它。

你可以使用 os.Args[0] 来检查它是否是绝对路径、相对路径或仅仅是可执行文件的名称。如果是绝对路径,直接使用即可;如果是相对路径,则使用 filepath.Rel(os.Getwd(), os.Args[0]);如果只是名称,那么你需要搜索 PATH 环境变量中的所有条目,看是否存在从 os.Args[0] 获取到的名称对应的可执行文件。

但为什么你实际上需要这个路径呢?一个良好的可执行文件不应该关心它所在的位置。

使用 filepath.Rel()

package main

import (
	"fmt"
	"path/filepath"
)

func main() {
	base := "/home/user/project"
	target := "/home/user/project/subdir/file.txt"
	rel, err := filepath.Rel(base, target)
	if err != nil {
		panic(err)
	}
	fmt.Println(rel)
}

请注意,/ 目录没有父级目录,如果不事先检查会导致程序崩溃(如在线演示所示)。

附注:您所说的"应用程序目录"是指包含可执行文件的文件夹,还是当前所在的工作目录?

要获取应用程序的父目录,您可以使用filepath.Dir()函数对当前工作目录的结果再次调用。以下是示例代码:

package main

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

func main() {
	wd, err := os.Getwd()
	if err != nil {
		panic(err)
	}

	// 获取当前目录的父目录
	parentDir := filepath.Dir(wd)
	fmt.Println("父目录:", parentDir)
}

如果您的当前目录是/home/ubuntu/sigasat-go/calampgateway,运行此代码将输出:

父目录: /home/ubuntu/sigasat-go

filepath.Dir()函数会返回路径的目录部分,对于已经是目录的路径,它会返回其父目录。这就是为什么对当前工作目录调用一次filepath.Dir()就能得到父目录的原因。

回到顶部