297

nodejs では__dirnameを使用します。Golangでこれに相当するものは何ですか?

私はグーグルで検索して、この記事http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/を見つけました。彼が以下のコードを使用する場所

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

しかし、Golangで行うのは正しい方法ですか、それとも慣用的な方法ですか?

4

14 に答える 14

369

編集: Go 1.8 (2017 年 2 月リリース) の時点で、これを行うための推奨される方法は次のos.Executableとおりです。

func Executable() (string, error)

Executable は、現在のプロセスを開始した実行可能ファイルのパス名を返します。パスがまだ正しい実行可能ファイルを指しているという保証はありません。シンボリック リンクを使用してプロセスを開始した場合、オペレーティング システムによっては、結果がシンボリック リンクまたはそれが指すパスになる場合があります。安定した結果が必要な場合は、path/filepath.EvalSymlinks が役立つ場合があります。

実行可能ファイルのディレクトリだけを取得するには、path/filepath.Dir.

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)
}

古い答え:

あなたは使用できるはずですos.Getwd

func Getwd() (pwd string, err error)

Getwd は、現在のディレクトリに対応するルート パス名を返します。(シンボリック リンクにより) 複数のパスを介して現在のディレクトリに到達できる場合、Getwd はそれらのいずれかを返す場合があります。

例えば:

package main

import (
    "fmt"
    "os"
)

func main() {
    pwd, err := os.Getwd()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(pwd)
}
于 2013-08-30T16:18:13.090 に答える
254

これはそれを行う必要があります:

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)
}
于 2013-08-30T16:44:13.457 に答える
12

os.Executable: https://tip.golang.org/pkg/os/#Executable

filepath.EvalSymlinks: https://golang.org/pkg/path/filepath/#EvalSymlinks

完全なデモ:

package main

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

func main() {
    var dirAbsPath string
    ex, err := os.Executable()
    if err == nil {
        dirAbsPath = filepath.Dir(ex)
        fmt.Println(dirAbsPath)
        return
    }

    exReal, err := filepath.EvalSymlinks(ex)
    if err != nil {
        panic(err)
    }
    dirAbsPath = filepath.Dir(exReal)
    fmt.Println(dirAbsPath)
}
于 2018-12-04T12:09:39.317 に答える
-3

Gustavo Niemeyer の答えは素晴らしいです。しかし、Windows では、ランタイム proc はほとんどの場合、次のように別のディレクトリにあります。

"C:\Users\XXX\AppData\Local\Temp"

のような相対ファイル パスを使用する場合"/config/api.yaml"、コードが存在するプロジェクト パスが使用されます。

于 2020-01-03T03:30:51.963 に答える