5

我正在编写一个需要写入已安装目录(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");

有没有人有关于如何解决这个问题的任何提示?

谢谢您的帮助,

耶克


添加清单文件是我选择解决此问题的途径。

感谢所有的帮助。

4

3 回答 3

7

您是否检查过该文件是否未在 VirtualStore 中为该用户创建?检查应用程序和服务日志 -> Microsoft -> Windows -> UacFileVirtualization -> 操作下的事件查看器。如果您看到事件 ID 为 5000 的条目,则表明发生了 FileCreateVirtualExclude 事件。

检查文件是否不是在%USERPROFILE%\AppData\Local\VirtualStore. 如果是这样,您可能需要嵌入一个请求所需权限的清单(即关闭虚拟化。)

有关更多详细信息,请参阅适用于 Windows Vista 的新 UAC 技术(向下滚动并查找虚拟化。)

于 2011-01-09T19:58:45.243 回答
2

QFile 可能会给你一个错误代码,但你没有检查它。

你应该做更多类似的事情:

if (!debugFile.open(QFile::WriteOnly)) {
    qWarning() << "Failed to open" << debugFile.fileName() << "for write:" << debugFile.errorString();
}

您已经检查了 的返回值QFile::error,但仅调用之前open- 您需要在打开尝试之后检查。

于 2011-01-09T22:45:40.333 回答
2

您需要获得足够的用户访问权限(即“以管理员身份运行”)才能在 Windows Vista+ 中写入此类文件夹。以管理员身份启动应用程序,或通过调用 WinAPI 请求管理员权限。

于 2011-01-09T18:04:32.900 回答