英文:
Is there a function that returns the absolute path from a path that is relative to another?
问题
我需要根据一个文件中使用的路径来确定文件的位置。最好使用一个例子来说明:
这是目录结构:
/
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
,因为它假设.
是当前工作目录。
根据文档:
Abs返回路径的绝对表示。如果路径不是绝对路径,它将与当前工作目录连接起来,将其转换为绝对路径。
我的问题是,当.
相对于text.txt时,如何获取./bar.txt
的绝对路径。
对于这个可能有点复杂的问题,我很抱歉,但我找不到更好的方法来展示一个例子。
英文:
I need to be able to work out where a file is based on the path used in a different file. It's probably just better to use an example:
This is the directory structure:
/
foo
bar.txt
text.txt
bar
main.go
In the text.txt file, bar.txt is referenced with ./bar.txt
which works but if I try and find the absolute path of ./bar.txt
from main.go with filepath.Abs("./bar.txt")
then it will return /bar/bar.txt
because it assumes that . is the current working directory.
From the documentation:
Abs returns an absolute representation of path. If the path is not absolute it will be joined with the current working directory to turn it into an absolute path.
My question is how do I get the absolute path of ./bar.txt
when . is realtive to text.txt.
Sorry for this question being probably overcomplicated but I couldn't come up with a better way of showing an example.
答案1
得分: 0
我不确定是否有更简单的方法来使用Go标准库找到绝对路径。你可以使用以下代码来解决问题。
它从第一个文件(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)
}
}
希望对你有帮助!
英文:
I don't know exactly maybe there is an easier way to find the absolute path using go stdlib. You can use the following piece of code for the solution.
It gets the content from the first file (text.txt) then checks if the path is already absolute path and if it is absolute it does nothing but if it is not absolute path then it finds absolute path based on text.txt file.
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)
}
}
答案2
得分: 0
这个答案已经接近正确,但我成功修改它以适应我的需求。
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 是引用 bar.txt 的文件所在的目录
英文:
This answer is almost there but I managed to modify it to work for me.
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
}
This works by just adding the path to the file to the directory that the file that references it is in.
For example:
fmt.Println(getAbs("./bar.txt", "/foo")) //foo is the directory that text.txt is in which references bar.txt is in
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论