调用 std::filesystem::status(path) 获取 file_status 后用 .permissions() 提取权限,须先检查路径存在;对符号链接返回链接自身权限,目标权限需用 symlink_status();Windows 仅支持 owner 权限位;权限判断必须用按位与比较,不可直接隐式转换;file_type::unknown 时应放弃权限检查而改用实际 I/O 操作验证。
怎么用
获取文件权限
直接调用
得到
,再用
成员函数提取权限位。注意:不能对不存在的路径调用,否则抛
异常。
必须先检查路径是否存在(
或
),否则会崩溃或异常
检查的是路径本身的元信息,对符号链接会返回链接文件的权限(不是目标文件);若要获取目标文件权限,用
Windows 下仅支持部分权限位(如
、
),
和
相关位始终为 false
枚举值和按位判断的实际写法
是 bitset 风格枚举,所有权限位都是 2 的幂,必须用按位与(
)判断,不能用
。
是 0,
是读+写+执行三位组合,不是“全部权限”的语义全集
不要写
就完事——它返回非零整数,但 C++ 不保证非零即 true 的
隐式转换
在所有上下文安全;显式比较更稳妥
Windows 下
始终为 false,即使文件是 .exe;执行权限需靠后缀或系统 API 判断
为什么
有时返回
常见于 NFS、某些容器挂载卷、FUSE 文件系统,或权限被严格限制的目录(如
下的条目)。此时
返回值不可信,且可能为
。
Trae win
Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。
下载
遇到
时,应放弃权限判断,转为尝试 open/read 等实际操作并捕获
(如
)
不要假设
总能成功——它底层调用
或
,失败时抛异常而非静默返回无效值
跨平台代码中,建议把权限检查当作“快速预判”,关键逻辑仍以运行时 I/O 错误为准
替代方案:不依赖
的轻量检查
如果项目未启用 C++17 或需兼容旧编译器,可用 POSIX
(Linux/
mac
OS)或 Windows API
。
立即学习
“
C++免费学习笔记(深入)
”;
POSIX 的
等宏与
位定义不一致,不可混用
Windows 上
只能区分“只读”标志(对应
),无法区分用户/组/其他权限
这类方案失去跨平台抽象,但启动快、无异常开销,适合嵌入式或性能敏感场景
权限判断真正棘手的从来不是语法,而是“文件存在但无法访问”和“文件系统不报告权限”这两类情况——它们不会触发
编译错误
,却会让
值看起来正常,实际 I/O 却失败。
std::filesystem::status()std::filesystem::status(path)std::filesystem::file_status.permissions()std::filesystem::filesystem_errorexists(status())exists(path)status()symlink_status()owner_readowner_writegroupotherspermsstd::filesystem::perms&==auto p = fs::status("config.txt").permissions();
if ((p & fs::perms::owner_read) == fs::perms::owner_read) {
// 有 owner 读权限
}
if ((p & (fs::perms::owner_read | fs::perms::owner_write)) != fs::perms::none) {
// owner 至少有读或写之一
}fs::perms::nonefs::perms::owner_allp & fs::perms::owner_readfs::perms::owner_execfs::status()fs::file_type::unknown/proc.permissions()fs::perms::unknownfile_type::unknownerrnoEACCESfs::status()stat()GetFileInformationByHandleExstat()GetFileAttributesEx()// Linux 示例
#include
struct stat sb;
if (stat("data.bin", &sb) == 0) {
bool readable = (sb.st_mode & S_IRUSR) != 0;
bool writable = (sb.st_mode & S_IWUSR) != 0;
} S_IRUSRstd::filesystem::permsGetFileAttributesEx()FILE_ATTRIBUTE_READONLYperms