You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_IMMUTABLE
    • syscall.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:36:05