Класс QSaveFile
Класс QSaveFile предоставляет интерфейс для безопасного записи в файлы. Подробнее...
| Заголовок: | #include <QSaveFile> |
| qmake: | QT += core |
| С тех пор: | Qt 5.1 |
| Наследует: | QFileDevice |
Этот класс был представлен в Qt 5.1.
Примечание: Все функции в этом классе являются реентерабельными.
Открытые функции
| QSaveFile(const QString &name, QObject *parent) | |
| QSaveFile(QObject *parent = nullptr) | |
| QSaveFile(const QString &name) | |
| virtual | ~QSaveFile() |
| void | cancelWriting() |
| bool | commit() |
| bool | directWriteFallback() const |
| void | setDirectWriteFallback(bool enabled) |
| void | setFileName(const QString &name) |
Переопределённые открытые функции
| virtual QString | fileName() const override |
| virtual bool | open(QIODevice::OpenMode mode) override |
Переопределённые защищённые функции
| virtual qint64 | writeData(const char *data, qint64 len) override |
Подробное описание
QSaveFile — это устройство ввода/вывода для записи текстовых и двоичных файлов без потери существующих данных в случае сбоя операции записи.
При записи содержимое записывается во временный файл, и если ошибок не произошло, commit() переместит его в конечный файл. Это гарантирует, что данные в конечном файле не потеряются в случае ошибки при записи, и никогда не будет присутствовать частично записанный файл в конечном расположении. Всегда используйте QSaveFile при сохранении целых документов на диск.
QSaveFile автоматически обнаруживает ошибки при записи, такие как ситуация заполненного раздела, где write() не может записать все байты. Он запомнит, что произошла ошибка, и удалит временный файл в commit().
Подобно QFile, файл открывается с помощью open(). Данные обычно читаются и записываются с помощью QDataStream или QTextStream, но вы также можете вызывать функции, унаследованные от QIODevice, read(), readLine(), readAll(), write().
В отличие от QFile, вызов close() запрещён. commit() заменяет его. Если commit() не был вызван, а экземпляр QSaveFile уничтожен, временный файл удаляется.
Для прерывания сохранения из-за ошибки приложения вызовите cancelWriting(), чтобы даже последующий вызов commit() не сохранял.
См. также QTextStream, QDataStream, QFileInfo, QDir, QFile и QTemporaryFile.
Документация по функциям-членам
QSaveFile::QSaveFile(const QString &name, QObject *parent)
Конструирует новый объект файла с заданным parent для представления файла с указанным именем name.
QSaveFile::QSaveFile(QObject *parent = nullptr)
Конструирует новый объект файла с заданным parent.
QSaveFile::QSaveFile(const QString &name)
Конструирует новый объект файла для представления файла с заданным именем name.
[virtual] QSaveFile::~QSaveFile()
Уничтожает объект файла, удаляя сохранённое содержимое, если commit() не был вызван.
void QSaveFile::cancelWriting()
Отменяет запись нового файла.
Если приложение меняет решение во время сохранения, оно может вызвать cancelWriting(), которое установит код ошибки, так что commit() удалит временный файл.
В качестве альтернативы, можно просто убедиться, что не вызывается commit().
Дополнительные операции записи возможны после вызова этого метода, но ни одна из них не будет иметь никакого эффекта, записанный файл будет удалён.
Этот метод не имеет эффекта при использовании обходного пути прямой записи. Это происходит при сохранении файла поверх существующего файла в каталоге только для чтения: временный файл не может быть создан, поэтому существующий файл перезаписывается независимо от чего, и cancelWriting() ничего не может с этим сделать, содержимое существующего файла будет потеряно.
См. также commit().
bool QSaveFile::commit()
Сохраняет изменения на диск, если все предыдущие записи были успешны.
Вызов этого метода обязателен в конце операции сохранения, в противном случае файл будет удалён.
Если во время записи произошла ошибка, удаляет временный файл и возвращает false. В противном случае переименовывает его в конечный fileName и возвращает true при успехе. Наконец, закрывает устройство.
См. также cancelWriting().
bool QSaveFile::directWriteFallback() const
Возвращает true если включено решение для сохранения файлов в каталогах только для чтения.
См. также setDirectWriteFallback().
[override virtual] QString QSaveFile::fileName() const
Переопределяет: QFileDevice::fileName() const.
Возвращает имя, установленное с помощью setFileName() или в конструкторе QSaveFile.
См. также setFileName().
[override virtual] bool QSaveFile::open(QIODevice::OpenMode mode)
Переопределяет: QIODevice::open(QIODevice::OpenMode mode).
Открывает файл с помощью флага mode, возвращая true при успехе; иначе false.
Важно: mode должен включать QIODevice::WriteOnly. Он может также содержать дополнительные флаги, такие как QIODevice::Text и QIODevice::Unbuffered.
QIODevice::ReadWrite, QIODevice::Append, QIODevice::NewOnly и QIODevice::ExistingOnly в данный момент не поддерживаются.
См. также QIODevice::OpenMode и setFileName().
void QSaveFile::setDirectWriteFallback(bool enabled)
Разрешает перезапись существующего файла при необходимости.
QSaveFile создаёт временный файл в той же директории, что и конечный файл, и атомарно переименовывает его. Однако это невозможно, если права доступа к директории не позволяют создавать новые файлы. Для сохранения гарантий атомарности open() завершается ошибкой, если не может создать временный файл.
Для того чтобы пользователи могли редактировать файлы с правами записи в каталоге с ограниченными правами, вызовите setDirectWriteFallback() с enabled, установленным в true, и последующие вызовы open() будут возвращаться к открытию существующего файла напрямую и записи в него без использования временного файла. Это не гарантирует атомарность, т.е. сбой приложения или, например, отключение питания может привести к частично записанному файлу на диске. Это также означает, что cancelWriting() не оказывает никакого эффекта в таком случае.
Как правило, для сохранения документов, отредактированных пользователем, вызовите setDirectWriteFallback(true), а для сохранения внутренних файлов приложения (файлы конфигурации, данные и т. д.) сохраните значение по умолчанию, которое гарантирует атомарность.
См. также directWriteFallback().
void QSaveFile::setFileName(const QString &name)
Устанавливает имя файла. Имя может не содержать пути, содержать относительный путь или абсолютный путь.
См. также QFile::setFileName() и fileName().
[override virtual protected] qint64 QSaveFile::writeData(const char *data, qint64 len)
Переопределяет: QFileDevice::writeData(const char *data, qint64 len).
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qsavefile.html