智慧線上客服系統原始碼GOFLY開發日誌- 3. 獲取程式執行的絕對路徑

taoshihan發表於2022-02-13

為什麼要得到絕對路徑?
因為後面上傳檔案的目錄,日誌的目錄,載入模板檔案的目錄都需要這個路徑。

這裡有一點難處理的問題是,需要能同時支援go run xxx.go 執行,以及相對路徑執行./xxxx,和絕對路徑執行 /var/www/xxx

go run 執行是為了在開發的時候,能夠原始碼執行,隨時除錯
絕對路徑執行 /var/www/xxx,是為了在某些情況下,不能執行切換命令的時候,使用絕對路徑去執行檔案

這裡就不解釋獲取目錄的區別了,直接上程式碼

//判斷檔案資料夾不存在
func IsFileNotExist(path string) (bool, error) {
    _, err := os.Stat(path)
    if os.IsNotExist(err) {
        return true, nil
    }
    return false, err
}

//獲取程式執行目錄
func GetRunPath2() string {
    file, _ := exec.LookPath(os.Args[0])
    path, _ := filepath.Abs(file)
    index := strings.LastIndex(path, string(os.PathSeparator))
    ret := path[:index]
    return ret
}

//獲取程式根目錄
func GetRootPath() string {
    rootPath, _ := os.Getwd()
    if notExist, _ := IsFileNotExist(rootPath); notExist {
        rootPath = GetRunPath2()
        if notExist, _ := IsFileNotExist(rootPath); notExist {
            rootPath = "."
        }
    }
    return rootPath
}

這裡先用的第一種方式獲取,如果沒獲取到目錄,就用第二種方式

後面還遇到了哪些問題和知識點將會繼續進行總結。

演示網站:
gofly.sopans.com

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章