Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I resolve a relative path to absolute path in golang?

Tags:

Is there a api like 'path.resolve' in node? Or something can do the same?

For Example (nodejs code): path.resolve("~/sample.sh") Should got: /home/currentuser/sample.sh

like image 683
Andrew Cui Avatar asked Nov 13 '17 10:11

Andrew Cui


People also ask

How do you convert relative path to absolute path?

The absolutePath function works by beginning at the starting folder and moving up one level for each "../" in the relative path. Then it concatenates the changed starting folder with the relative path to produce the equivalent absolute path.

Can an absolute path be a relative path?

In simple words, an absolute path refers to the same location in a file system relative to the root directory, whereas a relative path points to a specific location in a file system relative to the current directory you are working on.

How do you use absolute and relative paths?

An absolute path is defined as specifying the location of a file or directory from the root directory(/). In other words,we can say that an absolute path is a complete path from start of actual file system from / directory. Relative path is defined as the path related to the present working directly(pwd).


1 Answers

Resolving ~ (denoting the user home) is a different story, and usually it's the shell that resolves this. For details see Expand tilde to home directory.

If you want to do it from Go code, you may use the user.Current() function to get details about the current user, including its home folder which will be User.HomeDir. But still, you'll have to handle replacing this yourself.

Original answer follows.


You may use path.Join() or filepath.Join().

For example:

base := "/home/bob" fmt.Println(path.Join(base, "work/go", "src/github.com")) 

Output:

/home/bob/work/go/src/github.com 

You may use path.Clean() and filepath.Clean() to "remove" dots . and double dots .. from your path.

You may use filepath.Abs() to resolve relative paths and get an absolute (prepending the working directory if it's not absolute). filepath.Abs() also calls Clean() on the result.

For example:

fmt.Println(filepath.Abs("/home/bob/../alice")) 

Outputs:

/home/alice <nil> 

Try the examples on the Go Playground.

See related question: Resolving absolute path from relative path

like image 115
icza Avatar answered Oct 18 '22 02:10

icza