Go语言 有没有一个函数可以从相对路径返回绝对路径?

z0qdvdin  于 2023-01-10  发布在  Go
关注(0)|答案(2)|浏览(201)

我需要能够根据不同文件中使用的路径找出文件的位置。使用以下示例可能更好:
以下是目录结构:

/
  foo
    bar.txt
    text.txt
  bar
    main.go

在text.txt文件中,bar.txt是用./bar.txt引用的,这是有效的,但是如果我尝试从main.go用filepath.Abs("./bar.txt")查找./bar.txt的绝对路径,那么它将返回/bar/bar.txt,因为它假定.是当前工作目录。
来自文档:返回路径的绝对表示形式。如果路径不是绝对的,则将其与当前工作目录连接以将其转换为绝对路径。
我的问题是,当.相对于text.txt时,如何获得./bar.txt的绝对路径。
抱歉,这个问题可能过于复杂,但我想不出一个更好的方式来展示一个例子。

0dxa2lsx

0dxa2lsx1#

我不知道确切的路径,也许有一个更简单的方法可以用go stdlib来找到绝对路径,你可以用下面的代码来解决这个问题。
它从第一个文件(text.txt)中获取内容,然后检查路径是否已经是绝对路径,如果是绝对路径,则不执行任何操作,但如果不是绝对路径,则根据text.txt文件查找绝对路径。

package main

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

func main() {
    var new_abs_path string
    var text_file = "./foo/text.txt"

    b, err := os.ReadFile(text_file)
    check(err)

    new_file_path := string(b)

    if filepath.IsAbs(new_file_path) {
        new_abs_path = new_file_path
    } else {
        text_abs, err := filepath.Abs(text_file)
        check(err)
        
        new_abs_path, err = filepath.Abs(path.Join(path.Dir(text_abs), new_file_path))
        check(err)
    }
    fmt.Println(new_abs_path)
}

func check(err error) {
    if err != nil {
        panic(err)
    }
}
kzmpq1sx

kzmpq1sx2#

This答案几乎是存在的,但我设法修改它为我工作。

func getAbs(path string, locationPath string) string {
    new_file_path := path
    new_abs_path := path
    if filepath.IsAbs(new_file_path) {
        new_abs_path = new_file_path
    } else {
        new_abs_path, _ = filepath.Abs(filepath.Join(locationPath, path))
        fmt.Println(new_abs_path, locationPath)
    }
    return new_abs_path
}

这只需将文件的路径添加到引用该文件的文件所在的目录即可。
例如:

fmt.Println(getAbs("./bar.txt", "/foo")) //foo is the directory that text.txt is in which references bar.txt is in

相关问题