Qt 无法创建/写入 C:\
Posted
技术标签:
【中文标题】Qt 无法创建/写入 C:\\【英文标题】:Qt cannot cannot create/write to C:\Qt 无法创建/写入 C:\ 【发布时间】:2011-01-09 17:53:33 【问题描述】:我正在编写一个需要写入已安装目录 (C:\Program Files...) 的 Qt 程序(Windows 7 最初为 4.7)。当我尝试写入将被“保护”的位置(程序文件、C:\ 等)时,没有创建任何文件。但是,QFile 没有给我任何错误代码(error() 返回 0,这意味着它工作正常)。
这是我正在使用的代码片段,但它不起作用。我将在程序的后面关闭文件。
QApplication a(argc, argv);
// Setting plugin paths.
QStringList paths = QCoreApplication::libraryPaths();
paths.append(QCoreApplication::applicationDirPath());
QCoreApplication::setLibraryPaths(paths);
// Debug file.
QString path = QCoreApplication::applicationDirPath() + "/debug.dat";
//QFile debugFile(QCoreApplication::applicationDirPath() + "/debug.dat");
QFile debugFile("C:/debug.txt");
qDebug() << debugFile.error();
debugFile.setPermissions(QFile::WriteUser | QFile::WriteGroup | QFile::WriteOwner | QFile::WriteOther);
debugFile.open(QFile::WriteOnly);
QTextStream debugStream(&debugFile);
// Processing the arguments.
debugStream << QString("Processing Arguments\n");
有人对如何解决这个问题有任何提示吗?
感谢您的帮助,
杰克
添加清单文件是我解决此问题的途径。
感谢大家的帮助。
【问题讨论】:
“但是,QFile 没有给我任何错误代码”:您应该检查 debugFile.open() 的返回值。 【参考方案1】:您是否检查过该文件是否未在 VirtualStore 中为该用户创建?检查应用程序和服务日志 -> Microsoft -> Windows -> UacFileVirtualization -> 操作下的事件查看器。如果您看到事件 ID 为 5000 的条目,则表明发生了 FileCreateVirtualExclude 事件。
检查文件是否不是在%USERPROFILE%\AppData\Local\VirtualStore
下创建的。如果是这样,您可能需要嵌入一个请求所需权限的清单(即关闭虚拟化)。
有关详细信息,请参阅New UAC Technologies for Windows Vista(向下滚动并查找虚拟化。)
【讨论】:
你完全正确。我的文件被存储在虚拟商店中(无论如何,大部分都是。我有一个子文件夹由于某种原因没有被虚拟存储)。我添加了清单,所以我的程序现在可以虚拟运行。谢谢。【参考方案2】:您需要获得足够的用户访问权限(即“以管理员身份运行”)才能在 Windows Vista+ 中写入此类文件夹。以管理员身份启动应用程序,或通过调用 WinAPI 请求管理员权限。
【讨论】:
AFAIK 你不能为已经运行的进程请求管理员权限,但必须启动另一个进程来执行需要这些权限的操作。【参考方案3】:QFile 可能会给你一个错误代码,但你没有检查它。
你应该做更多类似的事情:
if (!debugFile.open(QFile::WriteOnly))
qWarning() << "Failed to open" << debugFile.fileName() << "for write:" << debugFile.errorString();
您已经检查了QFile::error
的返回值,但仅在调用open
之前 - 您需要在打开尝试之后检查。
【讨论】:
哇,你是对的。我在打开文件之前检查了错误代码。好吧,这就是我熬夜编码时会发生的事情:)。谢谢。以上是关于Qt 无法创建/写入 C:\的主要内容,如果未能解决你的问题,请参考以下文章
无法写入文件 pri:无法在 QT mac os 中创建父目录
C/C++ 在Linux系统中,解决无法往U盘创建文件和写入数据的问题