由于在Windows系统中无法检查用户是否创建了文件夹,因此没有平台独立的方法来实现此操作。所以,我们将为Windows和非Windows系统分别实现它,并使用Golang的构建约束根据操作系统有条件地编译文件。
按下面所示在file-perm目录下创建3个.go文件 -
file-perm /
file-perm.go
is-writable.go
is-writable_windows.go
File : file-perm.go
package main
import (
"fmt"
)
func main() {
path := "/tmp/xyz"
fmt.Println(IsWritable(path))
}
文件:is-writable.go
在除 Windows 外的所有平台上都可以构建,因为 Windows 上没有 syscall.Stat_t。请注意,在构建约束 // +build !windows 后需要有一个空行。
package main
import (
"fmt"
"os"
"syscall"
)
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
}
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
}
文件名:is-writable_windows.go
这个文件只能在Windows系统上构建,因为文件名中包含了_windows.go后缀。更多信息请参考https://golang.org/pkg/go/build/
package main
import (
"fmt"
"os"
)
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
}
if info.Mode().Perm()&(1<<(uint(7))) == 0 {
fmt.Println("Write permission bit is not set on this file for user")
return
}
isWritable = true
return
}
现在,您必须在文件权限目录中使用go build,然后运行可执行文件。请注意,它不能与go run一起使用。