QFile修改资源文件权限失败、无法以WriteOnly模式打开如何解决
核心原因
Qt的资源(qrc)系统会将所有引入的资源文件在编译期直接嵌入到程序的二进制文件中,属于只读静态资源,运行时不支持修改,也不支持权限修改,不管原文件的权限配置是什么,嵌入后都只保留读权限,你拿到的权限输出就是全部读权限位被置位的结果,属于正常现象。
你在资源文件属性中配置的读写权限仅作用于本地的源文件,不会改变编译后嵌入程序的资源属性,因此运行时访问:/开头的资源路径时,该配置不生效,自然也无法以WriteOnly模式打开,也修改不了权限。
可行解决方案
如果需要对该文件做写入操作,不要直接操作资源路径下的文件,按以下步骤处理:
- 程序首次运行时,将资源文件拷贝到系统分配给应用的可写目录下,后续所有读写操作都针对该拷贝后的文件执行。
示例代码如下:
#include <QStandardPaths> #include <QFile> // 获取应用可写目录路径 QString appWritableDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); // 拼接目标可写文件路径 QString targetFilePath = appWritableDir + "/Matters"; // 若目标文件不存在,从资源中拷贝初始文件 if (!QFile::exists(targetFilePath)) { QFile resFile(":/text/TextInformation/Matters"); resFile.copy(targetFilePath); // 给拷贝后的文件设置你需要的读写权限 QFile::setPermissions(targetFilePath, QFile::ReadOwner | QFile::ReadOther | QFile::ReadGroup | QFile::WriteOwner | QFile::WriteOther | QFile::WriteGroup); } // 之后操作该可写路径的文件即可正常打开写入 QFile workFile(targetFilePath); if (workFile.open(QFile::WriteOnly)) { // 你的写入逻辑 workFile.close(); }
内容的提问来源于stack exchange,提问作者Shamil Mukhetdinov
相关产品推荐
相关产品推荐

