在Golang中,要查看目錄是否可寫入的跨平台方法,可以使用`os.FileMode`來實作。首先,透過`os.Stat`函數取得目錄的檔案資訊。然後,使用`file.Mode().Perm()`方法取得檔案的權限。最後,使用`file.Mode().IsDir()`方法判斷是否為目錄。若目錄的權限為`0777`,則表示可寫入;如果權限為`0444`或`0555`,則表示唯讀;如果權限為其他值,則表示不可寫入。這種方法適用於跨平台的目錄可寫入性檢查。
我有一個程式正在嘗試使用 golang 將檔案寫入目錄。我需要它能夠在 macos、linux 和 windows(至少)中工作。
golang 提供了以下測試 - 但它似乎僅限於 linux(來自下面連結的 so 問題):
func IsWritable(path string) (isWritable bool, err error) { isWritable = false info, err := os.Stat(path) if err != nil { fmt.Println("Path doesn't exist") return } err = nil if !info.IsDir() { fmt.Println("Path isn't a directory") return } // Check if the user bit is enabled in file permission if info.Mode().Perm() & (1 << (uint(7))) == 0 { fmt.Println("Write permission bit is not set on this file for user") return } var stat syscall.Stat_t if err = syscall.Stat(path, &stat); err != nil { fmt.Println("Unable to get stat") return } err = nil if uint32(os.Geteuid()) != stat.Uid { isWritable = false fmt.Println("User doesn't have permission to write to this directory") return } isWritable = true return }
我看到了這個答案[1],但這個問題已經有 10 年了,有沒有比條件編譯更好的方法來完成這個任務?
摘要:我只想讓 go 進程了解它是否可以寫入給定目錄。
[1]如何判斷資料夾是否存在且可寫入?
這就是我在沒有條件編譯的情況下實現目標的方法,因為作業系統之間的權限和特權可能不同。
os.createtemp
在該目錄中建立一個臨時檔案。如果函數沒有傳回錯誤,則表示路徑或權限沒有問題,我們可以在該目錄中建立檔案。 這是程式碼
func IsWritable(path string) (bool, error) { tmpFile := "tmpfile" file, err := os.CreateTemp(path, tmpFile) if err != nil { return false, err } defer os.Remove(file.Name()) defer file.Close() return true, nil } func main() { path := "absolute-directory-path" isWritable, err := IsWritable(path) if err != nil { panic(err) } if isWritable { // statements } }
以上是在 Golang 中查看目錄是否可寫入的跨平台方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!