Qfile как открыть файл

Обновлено: 21.11.2024

В этой части руководства по программированию Qt5 C++ мы работаем с файлами и каталогами.

QFile , QDir и QFileInfo — это основные классы для работы с файлами в Qt5. QFile предоставляет интерфейс для чтения и записи файлов. QDir обеспечивает доступ к структурам каталогов и их содержимому. QFileInfo предоставляет независимую от системы информацию о файле, включая имя файла и положение в файловой системе, время доступа и время модификации, разрешения или владельца файла.

Размер файла Qt5

В следующем примере мы определяем размер файла.

Размер файла определяется методом размера QFileInfo.

Имя файла передается программе в качестве аргумента.

Существование файла проверяется с помощью метода exists класса QFile. Если он не существует, мы выдаем предупреждение и завершаем программу.

Создается экземпляр QFileInfo.

Размер файла определяется методом size. qint64 — это тип, гарантированно являющийся 64-разрядным на всех платформах, поддерживаемых Qt.

Результат выводится на консоль.

Чтение файла Qt5

Чтобы прочитать содержимое файла, мы должны сначала открыть файл для чтения. Затем создается входной файловый поток; из этого потока считываются данные.

У нас есть образец текстового файла.

В этом примере данные считываются из файла words.txt.

Создается экземпляр объекта QFile. QFile автоматически закрывает файл, когда он выходит за пределы области видимости.

Метод open QFile открывает файл в режиме только для чтения. Если метод не работает, мы выдаем предупреждение и завершаем программу.

Создается входной поток. QTextStream получает дескриптор файла. Данные будут считаны из этого потока.

В цикле while мы читаем файл построчно до конца файла. Метод atEnd возвращает значение true, если больше нет данных для чтения из потока. Метод readLine считывает одну строку из потока.

Qt5 запись в файл

Для записи в файл мы открываем файл в режиме записи, создаем выходной поток, направленный на файл, и используем оператор записи для записи в этот поток.

В этом примере имена пяти дистрибутивов Linux записываются в файл с именем distrost.txt .

Объект QFile создается с указанным именем файла.

С помощью метода open мы открываем файл только для записи.

Эта строка создает QTextStream, который работает с дескриптором файла. Другими словами, поток записываемых данных направляется в файл.

Данные записываются методом QFile::copy.

Программа принимает два параметра; если они не указаны, заканчивается предупреждающим сообщением.

Из аргументов командной строки программы мы получаем имя исходного файла.

Мы проверяем существование исходного файла с помощью метода exists в QFile. Если он не существует, мы завершаем программу с предупреждающим сообщением.

Мы получаем имя файла назначения.

Исходный файл копируется методом QFile::copy. Первый параметр — это имя исходного файла, второй параметр — это имя файла назначения.

Владелец и группа файла Qt5

У каждого файла есть пользователь, который является его владельцем. Файл также принадлежит группе пользователей для лучшего управления файлами и их защиты.

В этом примере выводится владелец и основная группа данного файла.

Создается экземпляр класса QFileInfo. Его параметром является имя файла, указанное в качестве аргумента командной строки.

Первичная группа файла определяется методом группы QFileInfo.

Владелец файла определяется с помощью метода владельца QFileInfo.

Последнее чтение Qt5, последнее изменение

Файлы хранят информацию о том, когда они последний раз читались или изменялись. Чтобы получить эту информацию, мы используем класс QFileInfo.

В этом примере выводятся данные о последнем прочтении и последнем изменении 6 января 2022 г.

Объект QFileInfo создан.

Метод lastRead возвращает дату и время последнего чтения (доступа) к файлу.

Метод lastModified возвращает дату и время последнего изменения файла.

Qt5 работает с каталогами

У класса QDir есть методы для работы с каталогами.

В примере мы представляем четыре метода работы с каталогами.

Метод mkdir создает каталог. Возвращает true, если каталог был успешно создан.

Exist проверяет наличие каталога. Метод rename переименовывает каталог.

mkpath создает новый каталог и все необходимые родительские каталоги за один раз.

Специальные пути Qt5

В файловой системе есть несколько специальных путей; например домашний каталог или корневой каталог. Класс QDir используется для получения специальных путей в системе.

В примере выводятся четыре специальных пути.

Текущий рабочий каталог извлекается методом QDir::currentPath.

Домашний каталог возвращается методом QDir::homePath.

Временный каталог извлекается с помощью метода QDir::tempPath.

Корневой каталог возвращается методом QDir::rootPath.

Путь к файлу Qt5

Файл идентифицируется по имени и пути; путь состоит из имени файла, базового имени и суффикса.

В этом примере мы используем несколько методов для печати пути к файлу и его частей заданного имени файла.

Путь к файлу определяется с помощью класса QFileInfo.

Метод absoluteFilePath возвращает абсолютный путь, включая имя файла.

Метод baseName возвращает базовое имя — имя файла без пути.

Метод completeBaseName возвращает полное базовое имя — все символы в файле до (но не включая) последнего символа точки.

Метод fileName возвращает имя файла, которое представляет собой базовое имя и расширение.

Метод suffix возвращает окончание файла, состоящее из всех символов в файле после (но не включая) последнего символа точки.

Окончание файла может состоять из нескольких частей; метод completeSuffix возвращает все символы в файле после (но не включая) первого символа точки.

Разрешения файла Qt5

Файлы в файловой системе имеют систему защиты. Файлам присваиваются флаги, которые определяют, кто может получить к ним доступ и изменить их. Метод QFile::permissions возвращает перечисление флагов ИЛИ для рассматриваемого файла.

В этом примере создается список разрешений для данного файла в стиле Unix. Существует три типа возможных пользователей: владелец, группа, к которой принадлежит файл, и остальные пользователи, именуемые другими. Первые три позиции принадлежат владельцу файла, следующие три позиции — группе файла, а последние три символа — остальным. Существует четыре типа прав: чтение (r), запись или изменение (w), выполнение (x) и отсутствие прав (-).

С помощью метода QFile::permissions мы получаем перечисление флагов разрешений.

Эта строка создается динамически на основе заданных разрешений.

Мы используем оператор &, чтобы определить, состоит ли возвращаемое перечисление из флага QFile::ReadOwner.

Владелец и группа пользователей, которым принадлежит файл, имеют право читать файл и изменять его. Другие пользователи имеют право на чтение файла. Поскольку файл не является исполняемым, права на его выполнение отсутствуют.

Содержимое каталога списка Qt5

В следующем примере мы отображаем содержимое данного каталога.

Чтобы получить список содержимого каталога, мы используем класс QDir и его метод entryInfoList. Список файлов обратно отсортирован по размеру и аккуратно выстроен. Есть две колонки; первый столбец содержит имена файлов, а второй столбец — размеры файлов.

Создается объект QDir с заданным именем каталога.

Метод setFilter указывает тип файлов, которые должны быть возвращены методом entryInfoList.

Метод setSorting указывает порядок сортировки, используемый методом entryInfoList.

Метод entryInfoList возвращает список объектов QFileInfo для всех файлов и каталогов в каталоге, отфильтрованных и упорядоченных методами фильтрации и упорядочения. QFileInfoList является синонимом QList .

Проходим по списку и определяем максимальный размер имени файла. Эта информация необходима для аккуратной организации вывода.

Мы добавляем два дополнительных пробела к длине столбца.

Здесь мы печатаем имена столбцов. Метод leftJustified возвращает строку заданного размера, выровненную по левому краю и дополненную символом заполнения (по умолчанию пробелом) справа от нее.

Проходим по списку файлов и печатаем их имена и размеры. Первый столбец выравнивается по левому краю и при необходимости дополняется пробелами; ко второму столбцу просто добавляется конец строки.

У меня есть программа, которую я украл с веб-сайта Qt, чтобы попытаться открыть файл. Программа отказывается открывать что-либо, я не понимаю, почему. Я просмотрел много документации, но ничего не нашел, не могли бы вы объяснить, почему это не работает.

Он чрезвычайно прост в использовании. Самый простой способ — сохранить возвращаемое значение QFile::error() в переменную, затем запустить код в отладчике и посмотреть, что это за возвращаемое значение. Затем найдите в документации Qt, что означает этот код ошибки.

А вы действительно уверены, что файл C:\n.txt существует? Вы уверены, что это не, например, C:\n.txt.txt?

спасибо вам soosososososогромное, у меня было так много приступов паники из-за этого, я так переживаю, оказывается, это был n.txt.txt, я такой тупой, спасибо

2 ответа 2

Перед открытием файла всегда можно проверить наличие:

Если файл существует, но не открывается, вы можете получить состояние ошибки и сообщение:

И всегда: если файл был открытым, то не забудьте его закрыть. В вашем примере вы этого не сделали:

FileError QFile::error () const Возвращает статус ошибки файла. Состояние устройства ввода-вывода возвращает код ошибки. Например, если open() возвращает false или операция чтения/записи возвращает -1, эту функцию можно вызвать, чтобы выяснить причину сбоя операции. См. также unsetError().

Опубликуйте код ошибки. Разве это не должен быть файл QFile("C:\n.txt"); \ нет / в окнах?

Тогда это должен быть файл QFile("C:\\n.txt"); потому что обратную косую черту нужно экранировать. Но / отлично работает в Windows, поэтому его не нужно менять.

Действительно, если поддерживается, использование / является определенно предпочтительным разделителем пути в строках внутри приложения. Нет причин усложнять перенос и нет причин использовать char, который требует экранирования внутри строк (с возможностью забыть, а в случае неудачи просто молча получить неправильный char).

Примечание. Все функции этого класса являются реентерабельными.

Общедоступные типы

Общие функции

< td >moveToTrash() < td >remove() < tr>
QFile(const QString &name, QObject *parent)
QFile( QObject *parent)
QFile(const QString &name)
QFile()
виртуальный ~QFile()
bool copy(const QString &newName)
bool exists() const
bool link(const QString &linkName)
bool
bool open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
bool open(int fd, QIODevice::OpenMode режим, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
bool
bool rename(const QString &newName)
void setFileName(const QString &имя)
QString symLinkTarget() const

Повторно реализованы общедоступные функции

< td >setPermissions(QFileDevice::Permissions permissions) override

Статические общедоступные члены

virtual QString fileName() const override
virtual bool open(QIODevice: :OpenMode режим) переопределить
виртуальный QFileDevice::Permissions permissions() const переопределить
virtual bool resize(qint64 sz) override
virtual bool
virtual qint64 size() const override
bool copy(const QString &fileName, const QString &newName)
QString decodeName(const QByteArray &localFileName)
QString decodeName(const char *localFileName)
QByteArray encodeName(const QString &fileName )
bool exists(const QString &fileName)
bool link(const QString &fileName, const QString &linkName)
bool moveToTrash(const QString &fileName, QString *pathInTrash = nullptr)
QFileDevice: :Permissions permissions(const QString &fileName)
bool remove(const QString & fileName)
bool rename(const QString &oldName, const QString &newName)
bool resize(const QString &fileName, qint64 sz)
bool setPermissions(const QString &fileName, QFileDevice ::Разрешения разрешения)
QString symLinkTarget(const QString &fileName)

Подробное описание

QFile — это устройство ввода-вывода для чтения и записи текстовых и двоичных файлов и ресурсов. QFile может использоваться сам по себе или, что более удобно, с QTextStream или QDataStream.

Имя файла обычно передается в конструкторе, но его можно задать в любое время с помощью setFileName(). QFile ожидает, что разделителем файлов будет '/' независимо от операционной системы. Использование других разделителей (например, '\') не поддерживается.

Вы можете проверить существование файла с помощью exists() и удалить файл с помощью remove(). (Более сложные операции, связанные с файловой системой, обеспечивают QFileInfo и QDir.)

Файл открывается с помощью open(), закрывается с помощью close() и очищается с помощью flush().Данные обычно считываются и записываются с использованием QDataStream или QTextStream, но вы также можете вызывать унаследованные от QIODevice функции read(), readLine(), readAll(), write(). QFile также наследует методы getChar(), putChar() и ungetChar(), которые работают с одним символом за раз.

Размер файла возвращается функцией size(). Вы можете получить текущую позицию в файле с помощью pos() или перейти к новой позиции в файле с помощью seek(). Если вы достигли конца файла, atEnd() возвращает true .

Чтение файлов напрямую

В следующем примере текстовый файл считывается построчно:

Флаг QIODevice::Text, переданный в open(), указывает Qt преобразовать разделители строк в стиле Windows ("\r\n") в символы конца строки в стиле C++ ("\n"). По умолчанию QFile предполагает двоичный формат, т. е. не выполняет никакого преобразования байтов, хранящихся в файле.

Использование потоков для чтения файлов

В следующем примере QTextStream используется для чтения текстового файла построчно:

Чтобы написать текст, мы можем использовать оператор >(), чтобы прочитать его обратно. Подробнее см. в документации по классу.

В Unix существуют специальные системные файлы (например, в /proc ), для которых функция size() всегда возвращает 0, однако вы все же можете прочитать больше данных из такого файла; данные генерируются в прямом ответе на ваш вызов read(). Однако в этом случае вы не можете использовать atEnd(), чтобы определить, есть ли еще данные для чтения (поскольку atEnd() вернет true для файла, размер которого, как утверждается, равен 0). Вместо этого вы должны либо вызывать readAll(), либо вызывать read() или readLine() несколько раз, пока не перестанут считываться данные. В следующем примере QTextStream используется для чтения /proc/modules построчно:

Сигналы

В отличие от других реализаций QIODevice, таких как QTcpSocket, QFile не выдает сигналы aboutToClose(), bytesWritten() или readyRead(). Эта деталь реализации означает, что QFile не подходит для чтения и записи файлов определенных типов, таких как файлы устройств на платформах Unix.

Проблемы, связанные с платформой

Разрешения на доступ к файлам обрабатываются по-разному в Unix-подобных системах и Windows. В недоступном для записи каталоге в Unix-подобных системах файлы не могут быть созданы. Это не всегда так в Windows, где, например, каталог «Мои документы» обычно недоступен для записи, но в нем все же можно создавать файлы.

Понимание Qt прав доступа к файлам ограничено, что особенно влияет на функцию QFile::setPermissions(). В Windows Qt установит только устаревший флаг только для чтения и только в том случае, если не передан ни один из флагов Write*. Qt не манипулирует списками управления доступом (ACL), что делает эту функцию практически бесполезной для томов NTFS. Это все еще может быть полезно для USB-накопителей, использующих файловые системы VFAT. Списки управления доступом POSIX также не изменяются.

Документация по типу участника

typedef QFile:: DecoderFn

Примечание. Все функции в этом классе являются реентерабельными, за исключением setEncodingFunction() и setDecodingFunction(), которые не являются реентерабельными.

Общедоступные типы

< tr>
typedef DecoderFn
typedef EncoderFn
enum FileError
enum FileHandleFlag
flags FileHandleFlags
enum MemoryMapFlags
enum Разрешение
typedef PermissionSpec
флаги Разрешения

Общие функции

< /tr>
QFile (const QString & name)
QFile (QObject * parent)
QFile (const QString & name, QObject * parent)
~QFile ()
bool copy ( const QString & newName )
FileError error () const
bool exists () const
QString fileName() const
bool flush()
int handle () const
bool link ( const QString & < i>linkName )
uchar * map ( qint64 смещение, qint64 размер, MemoryMapFlags flags = NoOptions )
bool open ( FILE * fh, OpenMode режим )
bool open ( FILE * fh, OpenMode режим , FileHandleFlags handleFlags )
bool open ( i nt fd, OpenMode mode )
bool open ( int fd< /i>, OpenMode режим, FileHandleFlags handleFlags )
bool open ( const RFile & f, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle )
Разрешения permissions() const
bool remove()
bool rename ( const QString & newName )
bool resize ( qint64 sz )
void setFileName ( const QString & name )
bool setPermissions ( Разрешения разрешения )
QString symLinkTarget () const< /td>
bool unmap ( uchar * адрес )
void< /td> unsetError()

Повторно реализованы общедоступные функции

Статические общедоступные члены

Повторно реализованы защищенные функции

  • 5 защищенных функций, унаследованных от QIODevice
  • 8 защищенных функций, унаследованных от QObject

Дополнительные унаследованные члены

  • 1 свойство, унаследованное от QObject
  • 1 общедоступный слот, унаследованный от QObject
  • 4 сигнала, унаследованные от QIODevice
  • 1 сигнал унаследован от QObject
  • 5 защищенных функций, унаследованных от QIODevice
  • 8 защищенных функций, унаследованных от QObject

Подробное описание

Класс QFile предоставляет интерфейс для чтения и записи файлов.

QFile — это устройство ввода-вывода для чтения и записи текстовых и двоичных файлов и ресурсов. QFile может использоваться сам по себе или, что более удобно, с QTextStream или QDataStream.

Имя файла обычно передается в конструкторе, но его можно задать в любое время с помощью setFileName(). QFile ожидает, что разделителем файлов будет '/' независимо от операционной системы. Использование других разделителей (например, '\') не поддерживается.

Вы можете проверить существование файла с помощью exists() и удалить файл с помощью remove(). (Более сложные операции, связанные с файловой системой, обеспечивают QFileInfo и QDir.)

Файл открывается с помощью open(), закрывается с помощью close() и очищается с помощью flush(). Данные обычно считываются и записываются с использованием QDataStream или QTextStream, но вы также можете вызывать унаследованные от QIODevice функции read(), readLine(), readAll(), write(). QFile также наследует методы getChar(), putChar() и ungetChar(), которые работают с одним символом за раз.

Размер файла возвращается функцией size(). Вы можете получить текущую позицию в файле с помощью pos() или перейти к новой позиции в файле с помощью seek(). Если вы достигли конца файла, atEnd() возвращает значение true.

Чтение файлов напрямую

В следующем примере текстовый файл считывается построчно:

Флаг QIODevice::Text, переданный в open(), указывает Qt преобразовать разделители строк в стиле Windows ("\r\n") в символы конца строки в стиле C++ ("\n"). По умолчанию QFile предполагает двоичный формат, т. е. не выполняет никакого преобразования байтов, хранящихся в файле.

Использование потоков для чтения файлов

В следующем примере QTextStream используется для чтения текстового файла построчно:

Чтобы написать текст, мы можем использовать оператор >(), чтобы прочитать его обратно. Подробнее см. в документации по классу.

В Unix есть некоторые специальные системные файлы (например, в /proc), для которых функция size() всегда возвращает 0, однако вы все же можете прочитать больше данных из такого файла; данные генерируются в прямом ответе на ваш вызов read(). Однако в этом случае вы не можете использовать atEnd(), чтобы определить, есть ли еще данные для чтения (поскольку atEnd() вернет true для файла, размер которого, как утверждается, равен 0). Вместо этого вы должны либо вызывать readAll(), либо вызывать read() или readLine() несколько раз, пока не перестанут считываться данные. В следующем примере QTextStream используется для чтения /proc/modules построчно:

Сигналы

В отличие от других реализаций QIODevice, таких как QTcpSocket, QFile не выдает сигналы aboutToClose(), bytesWritten() или readyRead(). Эта деталь реализации означает, что QFile не подходит для чтения и записи файлов определенных типов, таких как файлы устройств на платформах Unix.

Проблемы, связанные с платформой

Разрешения на доступ к файлам обрабатываются по-разному в Linux/Mac OS X и Windows. В недоступном для записи каталоге в Linux файлы не могут быть созданы. Это не всегда так в Windows, где, например, каталог «Мои документы» обычно недоступен для записи, но в нем все же можно создавать файлы.

Документация по типу участника

typedef QFile:: DecoderFn

typedef QFile:: EncoderFn

перечисление QFile:: FileError

Это перечисление описывает ошибки, которые могут быть возвращены функцией error().

< tr>< /tr>
КонстантаЗначениеОписание
QFile::NoError0Ошибки не произошло.
< tt>QFile::ReadError1Произошла ошибка при чтении из файла.
QFile::WriteError2Произошла ошибка при записи в файл.
QFile::FatalError3Произошла фатальная ошибка.< /td>
QFile::ResourceError4
QFile::OpenError5Не удалось открыть файл.
QFile::AbortError6Операция была прервана.
QFile::TimeOutError7Произошло время ожидания.
QFile::UnspecifiedError8Произошла неизвестная ошибка.
QFile::RemoveError9Не удалось удалить файл.
QFile::RenameError10Файл не может быть переименован.
QFile::PositionError11 положение в файле не может быть изменено.
QFile::ResizeError12< /td>Не удалось изменить размер файла.
QFile::PermissionsError13< /tt>Не удалось получить доступ к файлу.
QFile::CopyError< tt>14Не удалось скопировать файл.

enum QFile:: FileHandleFlag
flags QFile:: FileHandleFlags

Это перечисление используется при открытии файла для указания дополнительных параметров, которые применяются только к файлам, а не к универсальному QIODevice.

КонстантаЗначениеОписание
QFile::AutoCloseHandle0x0001Описатель файла, переданный в open(), должен быть закрыт функцией close(), поведение по умолчанию заключается в том, что close просто очищает файл, а приложение отвечает за закрытие дескриптора файла. При открытии файла по имени этот флаг игнорируется, поскольку Qt всегда «владеет» дескриптором файла и должен закрыть его.
QFile::DontCloseHandle 0Описатель файла, переданный в open(), не будет закрыт Qt. Приложение должно обеспечить вызов функции close().

Это перечисление было введено или изменено в Qt 4.8.

Тип FileHandleFlags является определением типа для QFlags. Он хранит комбинацию значений FileHandleFlag по схеме ИЛИ.

перечисление QFile:: MemoryMapFlags

Это перечисление описывает специальные параметры, которые могут использоваться функцией map().

КонстантаЗначениеОписание
QFile::NoOptions0Нет параметров.

Это перечисление было введено или изменено в Qt 4.4.

enum QFile:: Разрешения
flags QFile:: Разрешения

Это перечисление используется функцией разрешения() для сообщения разрешений и владельца файла. Значения могут быть объединены по ИЛИ для проверки нескольких разрешений и значений прав собственности.

< td >Файл доступен для чтения группой.< td >0x0004
КонстантаЗначениеОписание
QFile::ReadOwner0x4000Файл доступен для чтения владельцу файла.
QFile::WriteOwner0x2000Ваш файл доступен для записи владельцу файла.
QFile::ExeOwner0x1000Файл исполняемый владельцем файла.
QFile::ReadUser0x0400Файл доступен для чтения пользователем.
QFile::WriteUser0x0200< /tt>Файл доступен для записи пользователю.
QFile::ExeUser0x0100Файл исполняемый пользователем.
QFile::ReadGroup0x0040
QFile::WriteGroup0x0020 Группа может записывать файл.
QFile::ExeGroup 0x0010Файл может исполняться группой.
QFile::ReadOtherФайл доступен для чтения всем.
QFile::WriteOther< /td>0x0002Файл доступен для записи всем.
QFile::ExeOther< /tt>0x0001Файл может исполняться кем угодно.

Предупреждение: Из-за различий в платформах, поддерживаемых Qt, семантика ReadUser, WriteUser и ExeUser зависит от платформы: в Unix возвращаются права владельца файла, а в Windows — права текущего пользователя. возвращаются. Это поведение может измениться в будущей версии Qt.

Обратите внимание, что Qt по умолчанию не проверяет разрешения для файловых систем NTFS, так как это может значительно снизить производительность обработки файлов. Можно принудительно проверить разрешения в NTFS, включив в исходный код следующий код:

Затем проверка разрешений включается и выключается путем увеличения и уменьшения qt_ntfs_permission_lookup на 1.

Читайте также: