0

0

C++怎么实现文件的属性修改_C++设置文件只读权限【方案】

冰火之心

冰火之心

发布时间:2026-03-16 19:59:31

|

478人浏览过

|

来源于php中文网

原创

最可靠的方法是使用 C++17 起标准库提供的 std::filesystem::permissions(),它跨平台、无需调用系统 API、避免权限模型差异问题,但需注意符号链接默认操作链接本身而非目标,应结合 fs::is_symlink() 和 fs::canonical() 显式处理目标文件。

c++怎么实现文件的属性修改_c++设置文件只读权限【方案】

std::filesystem::permissions() 修改文件属性最可靠

标准库从 C++17 开始提供跨平台的 std::filesystem::permissions(),它能直接设置只读、可执行等权限,不用调系统 API,也避开了 Windows 和 Linux 权限模型差异带来的坑。

常见错误是试图用 fopen()ofstream “写失败”来反向判断只读——这只能检测当前进程是否有写权限,不能设属性;还有人用 _chmod()(Windows)或 chmod()(Linux),但得自己处理路径编码、错误码映射、符号链接行为不一致等问题。

  • 必须开启 C++17 或更高标准(编译时加 -std=c++17 或对应选项)
  • Windows 下只读位对应 std::filesystem::perms::owner_read | std::filesystem::perms::group_read | std::filesystem::perms::others_read,但更常用的是先清除写位:perms::owner_write | perms::group_write | perms::others_write
  • Linux/macOS 下 permissions() 会真实修改 umask 意义下的权限位;Windows 则仅操作「只读」文件属性(即 Explorer 里勾选的那个复选框),不影响 ACL
#include <filesystem>
namespace fs = std::filesystem;

fs::permissions("config.txt", fs::perms::owner_read | fs::perms::group_read | fs::perms::others_read, fs::perm_options::replace);
// 或更稳妥:先读当前权限,再移除写位
fs::permissions("config.txt", fs::status("config.txt").permissions() & ~fs::perms::owner_write, fs::perm_options::replace);

Windows 下误用 _chmod() 会静默失败

_chmod() 看起来简单,但实际行为和文档描述有偏差:它只对普通文件生效,对目录无效;且在 NTFS 卷上,若文件有 ACL 控制,_chmod() 可能不报错但根本不改属性。

典型现象是调用后检查 GetFileAttributes(),发现 FILE_ATTRIBUTE_READONLY 位没变;或者在资源管理器里右键属性,「只读」复选框仍是未勾选状态。

立即学习C++免费学习笔记(深入)”;

  • 必须传入绝对路径或确保当前工作目录正确,相对路径在多线程下容易出错
  • 返回值为 0 表示“可能成功”,但不保证属性已更新;需额外调用 GetFileAttributes() 验证
  • 不能用于符号链接目标,只会修改链接本身(而链接本身没有只读属性概念)

Linux/macOS 下 chmod() 的权限掩码易写错

直接调 chmod() 不难,但新手常把八进制掩码写成十进制,比如写 chmod("log.txt", 444) —— 这其实是十进制 444(八进制 674),不是只读的 0444。结果文件变成可写,甚至可执行。

‎ Gemini Storybook
‎ Gemini Storybook

Google Gemini推出的AI绘本生成工具

下载

另一个坑是忽略 umask:即使传了 0444,如果进程 umask 是 0022,最终权限会是 0444 & ~0022 = 0444(没问题);但若 umask 是 0002,就会变成 0444 & ~0002 = 0444(仍 OK);可一旦你传的是 0644 想设为可读写,umask 就会干扰。

  • 务必在数字前加 0 写成八进制,如 04440600
  • 若需精确控制,先 umask(0) 临时清空(注意线程安全),改完再恢复
  • 对目录设权限要小心:0444 会让目录不可进入(缺少执行位),应至少用 0555

跨平台封装时别忽略符号链接的处理逻辑

绝大多数场景下,你要改的是链接指向的目标文件,而不是链接本身。但 std::filesystem::permissions() 默认操作符号链接本身(C++ 标准规定),这和 chmod -h 类似,不是你想要的。

Linux 下可用 stat() + chmod() 绕过;Windows 下符号链接极少带权限,通常只需 CreateFile() 打开目标再设属性。但统一逻辑很难写干净。

  • fs::is_symlink(p) 先判断,再决定是否调 fs::canonical(p) 获取真实路径
  • 注意 fs::canonical() 在目标不存在时抛异常,需捕获 fs::filesystem_error
  • 某些 NFS 或网络文件系统不支持 canonical(),此时退回到平台特化逻辑更稳

真正麻烦的从来不是“怎么设只读”,而是“设给谁”——是文件本身?链接?还是链接链末端那个真实文件?这个决策点一旦错,后续所有操作都白忙。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

379

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

31

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

107

2026.02.06

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

7

2026.03.16

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1538

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1172

2023.07.27

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号