优先使用C++17的std::filesystem::permissions()实现跨平台文件权限设置,它自动适配Linux/macOS的chmod()和Windows的属性+ACL简化版,支持perms枚举组合与perm_options操作模式。
chmod()设置文件权限在类Unix系统上,C++本身不提供跨平台的权限设置接口,得调用系统API。chmod()是最直接的方式,头文件是<sys/stat.h>,参数是路径和权限掩码(如0644)。注意:它只改权限,不处理所有权;调用失败会返回-1,errno设为对应错误码(比如ENOENT表示文件不存在)。
0755对应rwxr-xr-x,不要写成十进制755
chdir()导致失败setuid位(04000),除非是root或有CAP_FOWNER能力if (chmod("/tmp/myfile.txt", 0600) == -1) { perror("chmod failed");}
chmod()等价物,但能模拟读写属性Windows不支持POSIX权限模型,chmod()在MSVC或MinGW里只是简单映射到只读属性(FILE_ATTRIBUTE_READONLY)。设0644或0755都没用——它只认0400(读)和0200(写)两个位,且仅影响“只读”标记。真正控制访问需用ACL(SetSecurityInfo()),但那是另一套复杂API。
_wchmod()(宽字符版)或_chmod()(窄字符)时,传_S_IREAD | _S_IWRITE表示可读写,传_S_IREAD表示只读_S_IWRITE,NTFS ACL仍可能拒绝写入,_chmod()不检查ACL,只改基础属性chmod()行为接近Linux,但依赖msys2 runtime,部署时要注意运行时依赖std::filesystem::permissions()(C++17)如果你能用C++17及以上,std::filesystem::permissions()是目前最稳妥的跨平台选择。它把POSIX权限抽象成perms枚举,底层自动适配各系统语义(Linux/macOS走chmod(),Windows走属性+ACL简化版)。
owner_read、group_exec等枚举组合,不是裸八进制数:fs::permissions(path, fs::perms::owner_read | fs::perms::owner_write)
perm_options,常用fs::perm_options::replace(完全替换)或fs::perm_options::add(叠加)std::filesystem::filesystem_error
-lstdc++fs(GCC)或启用/std:c++17(MSVC)权限改了但程序还是打不开/写不了,别急着怀疑代码——90%是环境或理解偏差。
立即学习“C++免费学习笔记(深入)”;
chmod()成功但后续open()失败chmod()默认改目标文件权限,不是链接本身;要改链接属性得用lchmod()(Linux/macOS,非POSIX标准)noexec或nosuid,或以只读方式挂载父目录,此时chmod()返回EROFS
权限这事从来不是“设完就完”,得结合具体路径、运行上下文、目标系统特性一起看。特别是混合部署(比如Linux构建、Windows运行)时,std::filesystem::permissions()的退化行为很容易被忽略。