我有一个Qt程序,它可以在Linux上运行,但不能在Windows上运行。它逐渐从互联网上下载一些东西,将其写入文件,然后尝试使用QDesktopServices::openUrl打开该文件。这在Linux(Fedora)下运行得很好,但当我在Windows下运行时,什么都不会发生——文件永远不会打开,但也不会报告错误。
但是,如果我尝试在Windows上手动打开下载的文件,我会找到原因。我得到错误Another program is currently using this file
,这意味着Qt没有释放它对文件的锁定。但是我已经调用了file->close()
如何确保QFile上的所有锁都已释放
以下是在文件写入后运行的代码片段:
QString filename = file->fileName();
if (!file->flush())
emit error("Could not finish writing file") // Not emitted
file->close();
QDesktopServices::openUrl(QUrl::fromLocalFile(filename));
我不认为这是Qt问题。我以前在Windows系统上看到过类似的行为(有和没有Qt),可能是CRT或操作系统还没有完成对文件的处理。您可能会尝试在操作系统中禁用磁盘写缓存,看看是否如预期那样工作。我必须在Windows嵌入式RT环境中这样做才能获得确定性行为。
BTW:即使在调用QFile::close()之后,您也可以评估QFile::error(),这样您就可以完全跳过flush部分。