You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:01:06