Класс QSaveFile
Класс QSaveFile предоставляет интерфейс для безопасного записи в файлы. Подробнее...
| Заголовок: | #include <QSaveFile> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| С момента: | Qt 5.1 |
| Наследуется от: | QFileDevice |
Примечание: Все функции в этом классе являются многопоточными.
Открытые функции
| 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(QIODeviceBase::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(QIODeviceBase::OpenMode mode)
Переопределяет: QIODevice::open(QIODeviceBase::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-6.2/qsavefile.html