Qt 会自动关闭文件吗?

Posted

技术标签:

【中文标题】Qt 会自动关闭文件吗?【英文标题】:Does Qt auto close files? 【发布时间】:2016-07-02 20:20:22 【问题描述】:

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

来自QFileDevicedocumentation:

QFileDevice::AutoCloseHandle – 传递给 open() 的文件句柄应该由 close() 关闭,默认行为是 close 只是刷新文件,应用程序负责关闭文件句柄。当按名称打开文件时,此标志将被忽略,因为 Qt 始终拥有文件句柄并且必须关闭它。

QFileDevice::DontCloseHandle – 如果没有显式关闭,当 QFile 对象被销毁时,底层文件句柄保持打开状态。

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

【问题讨论】:

DontCloseHandle 用于当应用程序提供一个先前打开的句柄并在其上搭载 Qt 时。在这种情况下,应用程序(不是 Qt)可能希望保留终身所有权。将此与“按名称打开文件时,此标志将被忽略,因为Qt 始终拥有文件句柄,并且必须关闭它。” 【参考方案1】:

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

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

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


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

【讨论】:

以上是关于Qt 会自动关闭文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

java 的输入输出流 如果在程序中没有close掉 那么关闭程序之后 流会自动关闭吗?

Laravel 会自动关闭数据库连接吗?

这个 try-catch-with-resourcers 会自动关闭吗? [复制]

java 数据流关闭后 对应的Socket也会自动关闭吗? 请问有啥方法能不关闭Socket!

Qt窗口及控件-窗口Close()自动释放

java 数据流关闭后 对应的Socket也会自动关闭吗? 请问有啥方法能不关闭Socket!