Go语言使用syscall.Chflags设置文件不可变的标志常量定义位置查询
Go语言中chflags标志常量对应定义及使用方法
常量对应关系
Go标准库的syscall包已经内置了和C语言命名完全一致的对应常量,可以直接调用:
- 用户级标志(所有用户可查看,仅文件所有者/root可修改):
syscall.UF_NODUMP:不对该文件执行dump备份操作syscall.UF_IMMUTABLE:文件不可修改、删除、重命名,也不允许创建硬链接,就是设置不可变状态需要用到的核心标志syscall.UF_APPEND:文件仅支持追加写入,不能覆盖原有内容syscall.UF_OPAQUE:目录在联合挂载(union mount)场景下视为不透明节点syscall.UF_HIDDEN:文件在GUI图形界面中默认隐藏
- 系统级标志(仅root用户可修改):
syscall.SF_ARCHIVED:标记文件已完成归档syscall.SF_IMMUTABLE:系统级不可变标志,优先级高于用户级的UF_IMMUTABLEsyscall.SF_APPEND:系统级仅追加标志syscall.SF_DATALESS:文件实体数据存储在外部介质,本地仅保留元数据
正确赋值与调用方法
flags参数支持多个标志通过按位或|组合,设置文件不可变的示例代码如下:
package main import ( "syscall" "log" ) func main() { // 单个标志:设置文件为用户级不可变 err := syscall.Chflags("目标文件路径", syscall.UF_IMMUTABLE) if err != nil { log.Fatalf("设置文件标志失败: %v", err) } // 多个标志组合:同时设置为不可变+不dump // err = syscall.Chflags("目标文件路径", syscall.UF_IMMUTABLE | syscall.UF_NODUMP) // 取消不可变状态的写法:先获取现有标志,移除对应位即可 // var stat syscall.Stat_t // err = syscall.Stat("目标文件路径", &stat) // if err != nil { // log.Fatalf("获取文件状态失败: %v", err) // } // err = syscall.Chflags("目标文件路径", stat.Flags &^ syscall.UF_IMMUTABLE) }
注意:上述常量仅在支持chflags系统调用的平台可用,包括macOS、FreeBSD等BSD系操作系统,Linux原生不支持chflags,要实现相同功能需要调用chattr相关接口。
内容的提问来源于stack exchange,提问作者user3431635
相关产品推荐
相关产品推荐

