Go 操作文件权限在 linux 下很简单,使用 os.Chown() 方法就可以实现,但是 windows 下面却不能这样使用。
用于在 Windows 上操作 ACL 的 Go 库
https://github.com/hectane/go-acl
这个库使用也很简单,比如更改目录下全部文件权限为当前用户
var (Username string)
func init() {u, err := user.Current()
if err != nil {fmt.Println("获取当前用户失败!")
os.Exit(2)
}
Username = u.Username
}
func WindowsAclFile(file_path string) error {
if err := acl.Apply(
file_path,
false,
false,
acl.GrantName(windows.GENERIC_ALL, Username),
); err != nil {fmt.Println("文件权限失败!")
return err
}
return nil
}
// 获取目录下所有文件
func FixAllFile() {
filepath.Walk(basedir,
func(filepath string, info os.FileInfo, err error) error {
if err != nil {return err}
if !info.IsDir() {if err := WindowsAclFile(filepath); err != nil {fmt.Println(filepath + "修复失败")
}else{fmt.Println(filepath + "修复成功")
}
}
return nil
})
}
授予 ddn 读权限,授予 test 拒绝权限
if err := acl.Apply(
"C:\\path\\to\\file.txt",
false,
false,
acl.GrantName(windows.GENERIC_READ, "ddn"),
acl.DenyName(windows.GENERIC_WRITE, "test"),
); err != nil {panic(err)
}
Windows 相关权限
DELETE
READ_CONTROL
WRITE_DAC
WRITE_OWNER
SYNCHRONIZE
STANDARD_RIGHTS_REQUIRED
STANDARD_RIGHTS_READ
STANDARD_RIGHTS_WRITE
STANDARD_RIGHTS_EXECUTE
STANDARD_RIGHTS_ALL
SPECIFIC_RIGHTS_ALL
ACCESS_SYSTEM_SECURITY
MAXIMUM_ALLOWED
GENERIC_READ
GENERIC_WRITE
GENERIC_EXECUTE
GENERIC_ALL