Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get the directory name (not a path) of a given file path in Golang

By using the path/filepath package with the following example, you can get the full directory path from a file path.

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    // Output: /path/to/dir
    fmt.Println(filepath.Dir("/path//to/dir/file.ext"))
}

But is there a Parent function to get the dir from the path? (which is the name of the directory of the file):

// The `Parent` is what I want,
// and this is a pseudo-code example, this won't actually work.
//
// Output: dir
fmt.Println(filepath.Parent("/path//to/dir/file.ext"))

If it can't be done with the functions, how do I get the parent's name with RegExp?

like image 287
Yami Odymel Avatar asked Dec 17 '17 17:12

Yami Odymel


People also ask

How do I remove a filename from a path?

The method fileCompinent() is used to remove the path information from a filename and return only its file component. This method requires a single parameter i.e. the file name and it returns the file component only of the file name.

What is path in Filepath?

A path is a string of characters used to uniquely identify a location in a directory structure. It is composed by following the directory tree hierarchy in which components, separated by a delimiting character, represent each directory.

How do I get the absolute path of a file in Golang?

In the Go programming language, to get the absolute path from a relative path – we use the Abs() function of path/filepath package. The Abs() function returns an absolute representation of the path. If the given path is not absolute it will be joined with the current working directory to turn it into an absolute path.


1 Answers

You can use filepath.Base to get the last element of the directory. For example:

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    paths := []string{
        "/home/arnie/amelia.jpg",
        "/mnt/photos/",
        "rabbit.jpg",
        "/usr/local//go",
    }
    for _, p := range paths {
        dir := filepath.Dir(p)
        parent := filepath.Base(dir)
        fmt.Printf("input: %q\n\tdir: %q\n\tparent: %q\n", p, dir, parent)
    }
}

Returns:

input: "/home/arnie/amelia.jpg"
    dir: "/home/arnie"
    parent: "arnie"
input: "/mnt/photos/"
    dir: "/mnt/photos"
    parent: "photos"
input: "rabbit.jpg"
    dir: "."
    parent: "."
input: "/usr/local//go"
    dir: "/usr/local"
    parent: "local"

(example adapted from the filepath examples)

like image 175
Marc Avatar answered Oct 16 '22 09:10

Marc