Класс 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).
Открывает файл с помощью OpenMode 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.13/qsavefile.html