Qt 会自动关闭文件吗?

Does Qt auto close files?

QFileQIODevice 重新实现的 open() 方法之一有一个 QFileDevice::FileHandleFlag 参数。查看它的文档,有两个选项的描述相互矛盾。

来自QFileDevice documentation:

  • QFileDevice::AutoCloseHandle – The file handle passed into open() should be closed by close(), the default behavior is that close just flushes the file and the application is responsible for closing the file handle. When opening a file by name, this flag is ignored as Qt always owns the file handle and must close it.

  • QFileDevice::DontCloseHandle – If not explicitly closed, the underlying file handle is left open when the QFile object is destroyed.

那么 Qt 是否自动关闭文件,设置这个选项是否真的改变了什么?

在查找 Qt 源代码后,我在 QFSFileEngine.cpp:378* 中找到了最终使用该标志的行。

QFile::open() 可以传递一个现有的 (stdio.h) FILE 处理程序,该处理程序不是由 Qt 创建的,不应由 Qt 自动关闭。相比之下,Qt打开的文件会被Qt自动关闭。

QFileDevice::FileHandleFlag 标志用于前一种情况,允许程序员指定 QFile 是否应自动关闭文件而忽略 Qt 未打开的事实。


* 如果行号不匹配,搜索 closeFileHandle