go - visit - zimbra slack




Come ottenere la directory del file attualmente in esecuzione? (4)

In nodejs uso __dirname . Qual è l'equivalente di questo in Golang?

Ho cercato su Google e ho trovato questo articolo http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ . Dove usa il codice sottostante

_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))

Ma è il modo giusto o il modo idiomatico di fare in Golang?


EDIT: A partire da Go 1.8 (rilasciato a febbraio 2017) il modo consigliato per farlo è con os.Executable :

func Executable() (string, error)

Eseguibile restituisce il nome del percorso per l'eseguibile che ha avviato il processo corrente. Non è garantito che il percorso continui a puntare all'eseguibile corretto. Se è stato utilizzato un collegamento simbolico per avviare il processo, a seconda del sistema operativo, il risultato potrebbe essere il collegamento simbolico o il percorso a cui punta. Se è necessario un risultato stabile, path / filepath.EvalSymlinks potrebbe aiutare.

Per ottenere solo la directory dell'eseguibile puoi usare path/filepath.Dir .

Example :

package main

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

func main() {
    ex, err := os.Executable()
    if err != nil {
        panic(err)
    }
    exPath := filepath.Dir(ex)
    fmt.Println(exPath)
}

VECCHIA RISPOSTA:

Dovresti essere in grado di usare os.Getwd

func Getwd() (pwd string, err error)

Getwd restituisce un nome di percorso rootato corrispondente alla directory corrente. Se la directory corrente può essere raggiunta tramite percorsi multipli (a causa di collegamenti simbolici), Getwd può restituire uno di essi.

Per esempio:

package main

import (
    "fmt"
    "os"
)

func main() {
    pwd, err := os.Getwd()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(pwd)
}

Questo dovrebbe farlo:

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

func main() {
    dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
    if err != nil {
            log.Fatal(err)
    }
    fmt.Println(dir)
}

Usa il pacchetto osext

Fornisce la funzione ExecutableFolder() che restituisce un percorso assoluto alla cartella in cui risiede l'eseguibile del programma attualmente in esecuzione (utile per i lavori cron). È multipiattaforma.

Documentazione online

package main

import (
    "github.com/kardianos/osext"
    "fmt"
    "log"
)

func main() {
    folderPath, err := osext.ExecutableFolder()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(folderPath)
}

filepath.Abs("./")

Abs restituisce una rappresentazione assoluta del percorso. Se il percorso non è assoluto, verrà unito alla directory di lavoro corrente per trasformarlo in un percorso assoluto.

Come indicato nel commento, restituisce la directory attualmente attiva.





go