我正在学习Go,我想要做的第一个项目是编写Linux find shell程序的替代品。我在不到一个小时的时间内在python中写了一个替代品。这是一个更大的挑战。
我遇到的问题是Goes filepath.Walk
遍历我的文件系统,它向屏幕吐出一堆权限被拒绝的消息。
我需要一种在filepath.Walk
触摸它们之前检查文件权限的方法。
答案 0 :(得分:4)
在go
中,文件权限在os.FileMode
中定义,其中基础类型为uint32
。来自文档:
FileMode表示文件的模式和权限位...
...
定义的文件模式位是FileMode的最高有效位。九个最低有效位是标准的Unix rwxrwxrwx权限。这些位的值应被视为公共API的一部分,并且可以用于有线协议或磁盘表示:尽管可能会添加新位,但不得更改它们。
您可以检索返回os.Stat
的FileMode
到os.LStat
或FileInfo
函数,例如
info, err := os.Stat("file/directory name")
然后可以通过调用FileMode
获取info.Mode()
。要检查权限,请对模式位执行按位操作,例如
//Check 'others' permission
m := info.Mode()
if m&(1<<2) != 0 {
//other users have read permission
} else {
//other users don't have read permission
}
如果您使用filepath.Walk
函数访问目录/文件,因为WalkFunc
(Walk
的第二个参数)被定义为
type WalkFunc func(path string, info os.FileInfo, err error) error
某些路径的FileInfo
可用作WalkFunc
的第二个参数,因此您可以直接在函数体内检查权限,而无需调用os.Stat
或os.Lstat
。
答案 1 :(得分:0)
您可以以字符串形式检索权限 e.i: r, w, x。像这样:
func printPermissions(filename string) {
info, err := os.Stat(filename)
if err != nil {
panic(err)
}
mode := info.Mode()
fmt.Print("Owner: ")
for i := 1; i < 4; i++ {
fmt.Print(string(mode.String()[i]))
}
fmt.Print("\nGroup: ")
for i := 4; i < 7; i++ {
fmt.Print(string(mode.String()[i]))
}
fmt.Print("\nOther: ")
for i := 7; i < 10; i++ {
fmt.Print(string(mode.String()[i]))
}
}