首頁 > 後端開發 > Golang > 在 Golang 中查看目錄是否可寫入的跨平台方法?

在 Golang 中查看目錄是否可寫入的跨平台方法?

WBOY
發布: 2024-02-10 12:51:18
轉載
664 人瀏覽過

在 Golang 中查看目录是否可写的跨平台方法?

在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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板