Qt существует ли файл
На этом шаге рассмотрим класс QFile.
Класс QFile унаследован от класса QIODevice. В нем содержатся методы для работы с файлами: открытия, закрытия, чтения и записи данных. Создать объект можно, передав в конструкторе строку, содержащую имя файла. Можно ничего не передавать в конструкторе, а сделать это после создания объекта вызовом метода setName(). Например:
В процессе работы с файлами иногда требуется узнать, открыт файл или нет. Для этого вызывается метод QIODevice::isOpen(), который вернет значение true, если файл открыт, иначе — false.
Чтобы закрыть файл, нужно вызвать метод close(). С закрытием осуществляется запись всех данных буфера. Если требуется выполнить запись данных буфера в файл без его закрытия, то вызывается метод QFile::flush().
Проверить, существует ли нужный вам файл, можно статическим методом QFile::exists(). Этот метод принимает строку, содержащую полный или относительный путь к файлу. Если файл найден, то метод возвратит значение true, в противном случае — false. Для проведения этой операции существует и нестатический метод QFile::exists(), который проверяет существование файла, возвращаемого методом fileName().
Методы QIODevice::read() и QIODevice::write() позволяют считывать и записывать файлы блоками.
Если требуется считать или записать данные за один раз, то используют методы QIODevice::write() и QIODevice::readAll(). Все данные можно считать в объект класса QByteArray, а потом записать из него в другой файл.
Для удаления файла класс QFile содержит статический метод remove(). В этот метод необходимо передать строку, содержащую полный или относительный путь удаляемого файла.
Продемонстрируем применение некоторых методов работы с файлами. Рассмотрим следующий пример. Даны два файла f1.dat и f2.dat. Необходимо записать в файл f3.dat первые 5 символов из файла f1.dat, а затем первые 5 символов из файла f2.dat, и в завершении дописать содержимое файла f1.dat в конец файла f2.dat. Реализация этого примера приведена на рисунке 1.
Note: All functions in this class are reentrant.
Member Type Documentation
QDataStream - чтение и запись двоичных файлов
14.11.2011 Автор: admin
Класс QDateStream является гарантом того, что формат, в котором будут записаны данные, останется платформонезависимым и его можно будет считать и обработать на других платформах. Это делает класс незаменимым для обмена данными по сети с использованием сокетных соединений. Далее.
Редко встречается приложение, которое не обращается к файлам. Работа с директориями (папками, в терминологии ОС Windows) и файлами — это та область, в которой не все операции являются платформонезависимыми, поэтому Qt предоставляет свою собственную поддержку этих операций, состоящую из следующих классов:
- QDir — для работы с директориями;
- QFile — для работы с файлами;
- QFileInfо — для получения файловой информации;
- QIODevice — абстрактный класс для ввода/вывода;
- QBuffer — для эмуляции файлов в памяти компьютера.
Reading Files Directly
The following example reads a text file line by line:
The QIODevice::Text flag passed to open() tells Qt to convert Windows-style line terminators ("\r\n") into C++-style terminators ("\n"). By default, QFile assumes binary, i.e. it doesn't perform any conversion on the bytes stored in the file.
QDir - работа с директориями в Qt
14.11.2011 Автор: admin
Разные платформы имеют разные способы представления путей. ОС Windows содержит буквы дисков, например: C:\Windows\System. UNIX использует root, например: /usr/bin. Обратите внимание, что для разделения имен директорий в обоих представлениях используются разные знаки. Для представления директорий в платформонезависимой форме Qt предоставляет класс QDir. Далее.
Detailed Description
QFile is an I/O device for reading and writing text and binary files and resources. A QFile may be used by itself or, more conveniently, with a QTextStream or QDataStream.
The file name is usually passed in the constructor, but it can be set at any time using setFileName(). QFile expects the file separator to be '/' regardless of operating system. The use of other separators (e.g., '\') is not supported.
You can check for a file's existence using exists(), and remove a file using remove(). (More advanced file system related operations are provided by QFileInfo and QDir.)
The file is opened with open(), closed with close(), and flushed with flush(). Data is usually read and written using QDataStream or QTextStream, but you can also call the QIODevice-inherited functions read(), readLine(), readAll(), write(). QFile also inherits getChar(), putChar(), and ungetChar(), which work one character at a time.
The size of the file is returned by size(). You can get the current file position using pos(), or move to a new file position using seek(). If you've reached the end of the file, atEnd() returns true .
QFile — класс для работы с файлами в Qt
14.11.2011 Автор: admin
Класс QFile унаследован от класса QIODevice. В нем содержатся методы для работы с файлами: открытия, закрытия, чтения и записи данных. Создать объект можно, передав в конструкторе строку, содержащую имя файла. Можно ничего не передавать в конструкторе, а сделать это после создания объекта, вызовом метода setName(). Например: Далее.
Просмотр директории с помощью QDir
14.11.2011 Автор: admin
При помощи класса QDir можно получить содержимое указанной директории. При этом допускается применять различные фильтры, чтобы исключить из списка не интересующие вас файлы. Для этих целей в классе определены методы entryList() и entryInfoList(). Первый возвращает список имен элементов (QStringList), а второй — информационный список (QFileInfoList). Если вам нужно узнать только количество элементов, находящихся в директории, то просто вызовите метод count(). Далее.
Platform Specific Issues
File permissions are handled differently on Unix-like systems and Windows. In a non writable directory on Unix-like systems, files cannot be created. This is not always the case on Windows, where, for instance, the 'My Documents' directory usually is not writable, but it is still possible to create files in it.
Qt's understanding of file permissions is limited, which affects especially the QFile::setPermissions() function. On Windows, Qt will set only the legacy read-only flag, and that only when none of the Write* flags are passed. Qt does not manipulate access control lists (ACLs), which makes this function mostly useless for NTFS volumes. It may still be of use for USB sticks that use VFAT file systems. POSIX ACLs are not manipulated, either.
QTemporaryFile - создание временных файлов
14.11.2011 Автор: admin
Иногда приложению может потребоваться создать временный файл. Это может быть связано, например, с промежуточным хранением большого объема данных или передачей этих данных какой-либо другой программе. Далее.
Public Types
Reimplemented Public Functions
virtual QString | fileName() const override |
virtual bool | open(QIODevice::OpenMode mode) override |
virtual QFileDevice::Permissions | permissions() const override |
virtual bool | resize(qint64 sz) override |
virtual bool | setPermissions(QFileDevice::Permissions permissions) override |
virtual qint64 | size() const override |
Public Functions
QFile(const QString &name, QObject *parent) | |
QFile(QObject *parent) | |
QFile(const QString &name) | |
QFile() | |
virtual | ~QFile() |
bool | copy(const QString &newName) |
bool | exists() const |
bool | link(const QString &linkName) |
bool | moveToTrash() |
bool | open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) |
bool | open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) |
bool | remove() |
bool | rename(const QString &newName) |
void | setFileName(const QString &name) |
QString | symLinkTarget() const |
Работа с файлами, директориями и потоками ввода/вывода в Qt
14.11.2011 Автор: admin
Редко встречается приложение, которое не обращается к файлам. Работа с директориями (папками, в терминологии ОС Windows) и файлами — это та область, в которой не все операции являются платформонезависимыми, поэтому Qt предоставляет свою собственную поддержку этих операций, состоящую из следующих классов: Далее.
Потоки ввода/вывода. Класс QTextStream
14.11.2011 Автор: admin
Объекты файлов, сами по себе, обладают только элементарными методами для чтения и записи информации. Использование потоков делает запись и считывание файлов более простым и гибким. Для файлов, содержащих текстовую информацию, следует использовать класс QTextStream, а для двоичных файлов — класс QDataStream. Далее.
Эмуляция файлов в памяти компьютера с помощью QBuffer
14.11.2011 Автор: admin
Класс QBuffer унаследован от QIODevice, и представляет собой эмуляцию файлов в памяти компьютера (memory mapped files). Это позволяет записывать информацию в оперативную память и использовать объекты как обычные файлы (открывать при помощи метода open() и закрывать методом close()). При помощи методов write() и read() можно считывать и записывать блоки данных. Можно это так же сделать при помощи потоков, которые будут рассмотрены далее. Рассмотрим пример использования класса QBuffer: Далее.
Static Public Members
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::Permissions permissions) |
QString | symLinkTarget(const QString &fileName) |
Signals
Unlike other QIODevice implementations, such as QTcpSocket, QFile does not emit the aboutToClose(), bytesWritten(), or readyRead() signals. This implementation detail means that QFile is not suitable for reading and writing certain types of files, such as device files on Unix platforms.
QFileInfo - информация о свойствах файла
14.11.2011 Автор: admin
Задача этого класса состоит в предоставлении информации о свойствах файла, например: имя, размер, время последнего изменения, права доступа и т. д. Объект класса QFileInfo создается передачей в его конструктор пути к файлу, но можно передавать и объекты класса QFile. Далее.
Using Streams to Read Files
The next example uses QTextStream to read a text file line by line:
QDataStream is similar, in that you can use operator>() to read it back. See the class documentation for details.
On Unix, there are some special system files (e.g. in /proc ) for which size() will always return 0, yet you may still be able to read more data from such a file; the data is generated in direct response to you calling read(). In this case, however, you cannot use atEnd() to determine if there is more data to read (since atEnd() will return true for a file that claims to have size 0). Instead, you should either call readAll(), or call read() or readLine() repeatedly until no more data can be read. The next example uses QTextStream to read /proc/modules line by line:
Ввод/вывод. Класс QIODevice
QIODevice — это абстрактный класс, обобщающий устройство ввода/вывода, который содержит виртуальные методы для открытия и закрытия устройства ввода/вывода, а также для чтения и записи блоков данных или отдельных символов.
Реализация конкретного устройства происходит в унаследованных классах.
В Qt есть четыре класса, наследующие класс QIODevice:
- QFile — класс для проведения операций с файлами;
- QBuffer — позволяет записывать и считывать данные в массив QByteArray, как будто бы это устройство или файл;
- QAbstractSocket — базовый класс для сетевой коммуникации посредством сокетов.
- QProcess — этот класс предоставляет возможность запуска процессов с дополнительными аргументами и позволяет обмениваться информацией с этими процессами посредством методов, определенных в QIODevice.
Для работы с устройством его необходимо открыть в одном из режимов, определенных В заголовочном файле класса QIODevice:
- QIODevice::NotOpen — устройство не открыто (это значение не имеет смысла передавать в метод open() );
- QIODevice::ReadOnly — открытие устройства только для чтения данных;
- QIODevice::writeOnly — открытие устройства только для записи данных;
- QIODevice::ReadWrite — открытие устройства для чтения и записи данных (то же, что и IO_ReadOnly | IO_WriteOnly );
- QIODevice::Append — открытие устройства для добавления данных;
- QIODevice::Unbuffered — открытие для непосредственного доступа к данным, в обход промежуточных буферов чтения и записи;
- QIODevice::Text — применяются преобразования символов переноса строки в зависимости от платформы. Для ОС Windows, например — \r\n, а для MacOS X и UNIX — /r;
- QIODevice::Truncate — все данные устройства, по возможности, должны быть удалены при открытии.
Для того чтобы в любой момент времени исполнения программы узнать, в каком из режимов было открыто устройство, нужно вызвать метод openMode() .
Считывать и записывать данные можно с помощью методов read() и write() соответственно. Для чтения всех данных сразу определен метод readAll() , который возвращает их в объекте типа QByteArray. Строку или символ можно прочитать методами readLine() и getChar() соответственно.
В классе QIODevice определен метод для смены текущего положения seek() . Получить текущее положение можно вызовом метода pos() . Но не забывайте, что эти методы применимы только для прямого доступа к данным. При последовательном доступе, каким является сетевое соединение, они теряют смысл. Более того, в этом случае теряет смысл и метод size() , возвращающий размер данных устройства. Все эти операции применимы только для QFile, QBuffer и QTemporaryFile.
Для создания собственного класса устройства ввода/вывода, для которого Qt не предоставляет поддержки, необходимо унаследовать класс QIODevice и реализовать в нем методы readData() и writeData() . В большинстве случаев может потребоваться перезаписать методы open() , close() и atEnd() .
Благодаря интерфейсу класса QIODevice можно работать со всеми устройствами одинаково, при этом не имеет значения, является ли устройство файлом, буфером или другим устройством. Выведем на консоль данные из любого устройства.
Класс QIODevice предоставляет ряд методов, с помощью которых можно получить информацию об устройстве ввода/вывода. Например, одни устройства могут только записывать информацию, другие — только считывать, а третьи способны делать и то, и другое. Чтобы узнать об этом, следует воспользоваться методами isReadable() и isWriteable() .
typedef QFile:: DecoderFn
Класс QFile унаследован от класса QIODevice. В нем содержатся методы для работы с файлами: открытия, закрытия, чтения и записи данных. Создать объект можно, передав в конструкторе строку, содержащую имя файла. Можно ничего не передавать в конструкторе, а сделать это после создания объекта, вызовом метода setName() . Например:
В процессе работы с файлами иногда требуется узнать, открыт файл или нет. Для этого вызывается метод QIODevice::isOpen() , который вернет true , в том случае, если файл открыт, иначе — false . Чтобы закрыть файл, нужно вызвать метод close() . С закрытием произведется запись всех данных буфера. Если требуется произвести запись данных буфера в файл без его закрытия, то вызывается метод QFile::flush() .
Проверить, существует ли нужный вам файл, можно статическим методом QFile::exists() . Этот метод принимает строку, содержащую полный или относительный путь к файлу. Если файл найден, то метод возвратит true , в противном случае — false . Для проведения этой операции существует и нестатический метод QFile::exists() . Методы QIODevice::read() и QIODevice::write() позволяют считывать и записывать файлы блоками.
Продемонстрируем применение некоторых методов работы с файлами:
Если требуется считать или записать данные за один раз, то используют методы QIODevice::write() и QIODevice::readAll() . Все данные можно считать в объект класса QByteArray , а потом записать из него в другой файл:
Операция считывания всех данных сразу, в зависимости от размера файла, может занять много оперативной памяти, а значит, к этому следует прибегать только в случаях острой необходимости или в том случае, когда файлы занимают мало места. Расход памяти при считывании сразу всего файла можно значительно сократить при том условии, что файл содержит избыточную информацию. Тогда можно воспользоваться функциями сжатия qCompress() и qUncompress() , которые определены вместе с классом QByteArray . Эти функции получают, в качестве аргумента, объект класса QByteArray и возвращают, в качестве результата, новый объект класса QByteArray .
Для удаления файла класс QFile содержит статический метод remove() . В этот метод необходимо передать строку, содержащую полный или относительный путь удаляемого файла.
Читайте также: