2016-07-02 2 views
5

Один из QIODevice переопределенных методов open() в QFile имеет аргумент QFileDevice::FileHandleFlag. Взглянув на документацию на него, есть два варианта с противоречивыми описаниями.Поддерживает ли Qt автоматическое закрытие файлов?

От QFileDevicedocumentation:

  • QFileDevice::AutoCloseHandle - дескриптор файла передается в открытое() должны быть закрыты близко(), поведение по умолчанию, что близко только очищает файл и приложение ответственный за закрытие дескриптора файла. При открытии файла по имени этот флаг игнорируется, так как Qt всегда владеет дескриптором файла и должен закрыть его.

  • QFileDevice::DontCloseHandle - Если явным образом не закрыто, основной дескриптор файла остается открытым, когда объект QFile уничтожается.

Так что делает Qt авто закрыть файлы или нет и не установка этого параметра на самом деле изменить что-нибудь?

+3

DontCloseHandle предназначен для тех случаев, когда приложение поставляет * ранее открытую рукоятку и покрова на Qt. В этом случае приложение (а не Qt) может захотеть сохранить пожизненное владение. Сравните это с «* При открытии файла по имени * этот флаг игнорируется, поскольку * Qt всегда владеет файлом * и должен закрыть его». – user2864740

ответ

5

После поиска источника Qt я нашел строку в QFSFileEngine.cpp:378*, которая в конечном счете использует флаг.

QFile::open() можно передать существующий (stdio.h) FILE обработчик, который не был создан Qt и не должно быть автоматически закрыто Qt. В отличие от файлов, открытых Qt, автоматически закрываются Qt.

Флаг QFileDevice::FileHandleFlag предназначен для первого случая и позволяет программисту указать, должен ли QFile автоматически закрыть файл, игнорируя тот факт, что он не был открыт Qt.


* Поиск closeFileHandle если номер строки не совпадает.