Windows下Qt写文件失败报Unknown error问题排查与解决
Qt CSV文件写入失效问题排查
问题现象
我是Qt与C++开发新手,此前文件写入功能可正常运行,在未修改任何文件写入相关代码的前提下,所有文件写入相关函数均无法正常工作,以下为其中一个简化版写入函数的实现代码:
#include <QStringList> #include <QDir> #include <QFile> #include <QString> #include <QTextStream> void HandleCSV::writeToPIDCSV(UserAccount newUser) { // 存储到userPID数据库 QString filePath = returnCSVFilePath("dbPID"); qDebug() << "File path passsed to writeToPIDCSV is " << filePath; // 打开从对应dbName获取到的CSV文件路径 QFile file(filePath); if (!file.open(QIODevice::ReadWrite | QIODevice::Append)) { qDebug() << file.isOpen() << "error " << file.errorString(); qDebug() << "File exists? " << file.exists(); qDebug() << "Error message: " << file.error(); qDebug() << "Permissions err: " << file.PermissionsError; qDebug() << "Read error: " << file.ReadError; qDebug() << "Permissions before: " << file.permissions(); // 我尝试过设置权限排查问题,但没有任何效果 file.setPermissions(QFile::WriteOther); qDebug() << "Permissions after: " << file.permissions(); } else { qDebug() << "Is the file open?" << file.isOpen(); // 将信息写入流存入数据库 QTextStream stream(&file); stream << newUser.getUID() << "," << newUser.getEmail() << "," << newUser.getPassword() << "\n"; } file.close(); }
运行程序后得到如下调试输出:
File path passsed to writeToPIDCSV is ":/database/dummyPID.csv" false error "Unknown error" File exists? true Error message: 5 Permissions err: 13 Read error: 1 Permissions before: QFlags(0x4|0x40|0x400|0x4000) Permissions after: QFlags(0x4|0x40|0x400|0x4000)
从输出可见目标文件确实存在且可被程序检测到,但file.isOpen()返回false,权限查询结果显示当前用户对该文件仅有读权限、无写权限,调用setPermissions方法尝试修改权限也未生效,文件打开失败报错为"Unknown error",错误码为5。
问题更新
感谢@chehrlic和@drescherjm的提示,我此前未意识到Qt资源文件仅支持读取、不支持写入操作。
使用QStandardPaths类获取AppDataLocation可写路径后即可实现正常文件写入,以下为适配后的参考代码,供遇到同类问题的开发者参考:
#include <QStringList> #include <QDir> #include <QFile> #include <QString> #include <QTextStream> #include <QStandardPaths> void HandleCSV::writeToPIDCSV(UserAccount newUser) { auto path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); if (path.isEmpty()) qFatal("Cannot determine settings storage location"); QDir d{path}; QString filepath = returnCSVFilePath("dbPID"); if (d.mkpath(d.absolutePath()) && QDir::setCurrent(d.absolutePath())) { qDebug() << "settings in" << QDir::currentPath(); QFile f{filepath}; if (f.open(QIODevice::ReadWrite | QIODevice::Append)) { QTextStream stream(&f); stream << newUser.getUserFirstName() << "," << newUser.getUserIDNumber() << "\n"; } } }
目前我正在调试适配对应的文件读取功能,同时咨询是否存在可行方案,能够实现向Qt程序自身所在目录(或构建目录)写入文件的需求。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

