在 python 中有內建函示 os.path.exists 、 os.path.isdir 、 os.path.isdir 可以用來檢查路徑是否存在,不過在 Golang 中沒有那麼方便,需要自己實作。
其中 os.Stat 是關鍵
func Stat(name string) (FileInfo, error)
如果檔案或目錄不存在會回傳 error ,接著可以透過 errors.Is(err, os.ErrNotExist) 來判斷此錯誤是不是因為路徑不存在引發,結果為 true 代表路徑不存在,如果為 false 代表其他錯誤。
如果只是想判斷路徑是否存在,可以寫得精簡一點
// PathExist error == nil 時,true: 路徑存在, false: 路徑不存在
func PathExist(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
// 路徑存在
return true, nil
}
if errors.Is(err, os.ErrNotExist) {
// 路徑不存在
return false, nil
}
// 發生其他錯誤
return false, err
}
os.Stat 回傳的另一個參數 FileInfo 提供了 IsDir() 方法來讓我們判斷此檔案的類型,如果為 true 代表是目錄,如果為 false 代表是檔案。
完整功能 code
// CheckPath 檢查 PATH 狀態 0: 不存在, 1: 是檔案, 2: 是目錄, -1: 其他錯誤
func CheckPath(path string) (int, error) {
if fInfo, err := os.Stat(path); err == nil {
if fInfo.IsDir() {
// 路徑存在 且為目錄
return 2, nil
}
// 路徑存在 且為檔案
return 1, nil
} else if errors.Is(err, os.ErrNotExist) {
// 路徑不存在
return 0, err
} else {
// 發生其他錯誤
return -1, err
}
}
在沒有發生其他錯誤的前提下 (回傳值 != -1)
單純判斷檔案是否存在:
檢查回傳值是否為 0
判斷是否存在外,還想判斷類型:
檢查回傳值為
0: 路徑不存在
1: 此路徑是一個檔案
2: 此路徑是一個目錄