gpt4 book ai didi

go - 如何判断文件夹是否存在且可写?

转载 作者:IT王子 更新时间:2023-10-29 01:12:09 32 4
gpt4 key购买 nike

我想要 func FolderExists(path string) bool 来判断文件夹是否存在且可写。我已经到了这里:

func FolderExists(path string) bool {
info, err := os.Stat(path)
return os.IsExist(err) && info.Mode().IsDir() && info.Mode().???
}

如何判断这个文件夹是否可写?我不能简单地检查文件模式权限(例如 0200 用于用户写入权限),因为那样我就必须检查文件的所有者。在 Go 中是否有直接的方法来执行此操作?

对于那些有 UNIX 背景的人来说,寻找非常简单的等价物:

if [ -d "$n" && -w "$n" ] ; then ... fi

最佳答案

如果您正在为 Unix-y 操作系统编写代码,您可以使用 unix.Access(path string, mode uint32) error使用常量 unix.W_OK 作为 mode

(感谢用户 fxxn 在添加 unix 包时进行标记,如果您想知道如何为 Windows 编写替代代码,请参阅 Gautham 的回答。)

虽然这回答了问题,但您仍然需要在实际访问目录时检查是否成功,也许这就是您想要做的全部。正如 kostix 指出的那样,权限可能会在您进行访问检查后发生变化,或者可能出现不相关的错误。 Ricky Zhang 在评论中说 unix.Access 在使用 NFS 的特定情况下可能会返回完全错误的结果。如果您检查实际操作是否成功,您还可以避免为 unix 包中的特定于平台的函数而大惊小怪。

只有当 future 的操作预计会失败时及早退出特别有帮助时,才可能需要进行显式访问检查。

无论如何,这里是检查是否存在和访问的代码,可以让我在 Linux 上获得预期的结果:

package main

import (
"fmt"
"golang.org/x/sys/unix"
)

func writable(path string) bool {
return unix.Access(path, unix.W_OK) == nil
}

func main() {
fmt.Println("/etc writable?", writable("/etc"))
fmt.Println("/tmp writable?", writable("/tmp"))
}

关于go - 如何判断文件夹是否存在且可写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20026320/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com