正在释放Qt中的文件锁定

Releasing file lock in Qt

本文关键字:文件 文件锁 锁定 释放 Qt      更新时间:2023-10-16

我有一个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部分。