На этом шаге рассмотрим класс QFile.
Класс QFile унаследован от класса QIODevice. В нем содержатся методы для работы с файлами: открытия, закрытия, чтения и записи данных. Создать объект можно, передав в конструкторе строку, содержащую имя файла. Можно ничего не передавать в конструкторе, а сделать это после создания объекта вызовом метода setName(). Например:
QFile file("file.dat");
QFile file; file.setName("file.dat");
В процессе работы с файлами иногда требуется узнать, открыт файл или нет. Для этого вызывается метод 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.
Рис.1. Пример работы с файлами
//создаем три объекта класса QFile, передав в конструкторе //строку, содержащую имя файла QFile f1("f1.dat"); QFile f2("f2.dat"); QFile f3("f3.dat"); //если файл f2 создан, то if (f2.exists()) { //если файл f2 нельзя открыть для чтения, то if (!f2.open(QIODevice::ReadOnly)) { //выводим сообщение об ошибке qDebug() << "Ошибка открытия для чтения"; } //иначе else { //выводим строку F2.DAT qDebug()<<"F2.DAT"; //используя функцию, рассмотренную на предыдущем шаге, //выводим содержимое файла F2.DAT на экран print(&f2); } } //если файл f2 не создан, то выводим соответствующее сообщение else qDebug() << "Файла F2.DAT нет!"; if (f1.exists()) { if (!f1.open(QIODevice::ReadOnly)) { qDebug() << "Ошибка открытия для чтения"; } else { qDebug()<<"F1.DAT"; print(&f1); } } else qDebug() << "Файла F1.DAT нет!"; if (f2.exists() && f1.exists()) { //открываем файлы для чтения f1.open(QIODevice::ReadOnly); f2.open(QIODevice::ReadOnly); //открываем файл для записи f3.open(QIODevice::WriteOnly); char a[5]; //читаем из файла f1 первые 5 символов в массив а //nBlocksize содержит количество реально прочитанных байтов int nBlocksize = f1.read(a, sizeof(a)); //записываем в файл f3 5 символов массива а f3.write(a, nBlocksize); nBlocksize = f2.read(a, sizeof(a)); f3.write(a, nBlocksize); //меняем текущее положение в файле f1 на начало файла f1.seek(0); f2.close(); //открываем файл для добавления данных f2.open(QIODevice::Append); //читаем все содержимое из файла f1 QByteArray b= f1.readAll(); //дописываем содержимое массива b в конец файла f2 f2.write(b); } //закрываем файлы f1.close(); f2.close(); f3.close(); //далее выводим содержимое файлов на экран
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим класс QBuffer.