Работа с файлами. Класс QFile


Класс QFile унаследован от класса QIODevice. В нем содержатся методы для работы с файлами: открытия, закрытия, чтения и записи данных. Создать объект можно, передав в конструкторе строку, содержащую имя файла. Можно ничего не передавать в конструкторе, а сделать это после создания объекта, вызовом метода setName(). Например:


QFile file;
file.setName("file.dat"); 

В процессе работы с файлами иногда требуется узнать, открыт файл или нет. Для этого вызывается метод QIODevice::isOpen(), который вернет true, в том случае, если файл открыт, иначе — false. Чтобы закрыть файл, нужно вызвать метод close(). С закрытием произведется запись всех данных буфера. Если требуется произвести запись данных буфера в файл без его закрытия, то вызывается метод QFile::flush().

Проверить, существует ли нужный вам файл, можно статическим методом QFile::exists(). Этот метод принимает строку, содержащую полный или относительный путь к файлу. Если файл найден, то метод возвратит true, в противном случае — false. Для проведения этой операции существует и нестатический метод QFile::exists(). Методы QIODevice::read() и QIODevice::write() позволяют считывать и записывать файлы блоками.

Продемонстрируем применение некоторых методов работы с файлами:


QFile file1("file1.dat");
QFile file2("file2.dat");

if(file2.exists())
{
    //Файл уже существует. Перезаписать?
}

if (!file1.open(QIODevice::ReadOnly))
{
    qDebug() << "Ошибка открытия для чтения";
}

if(!file2.open(QIODevice::WriteOnly))
{
    qDebug() << "Ошибка открытия для записи";
}

char a [1024];
while(!file1.atEnd())
{
    int nBlocksize = file1.read(a, sizeof(a));
    file2.write(a, nBlocksize);
}

Если требуется считать или записать данные за один раз, то используют методы QIODevice::write() и QIODevice::readAll(). Все данные можно считать в объект класса QByteArray, а потом записать из него в другой файл:


QFile file1("file1.dat");
QFile file2("file2.dat");

if(file2.exists())
{
    //Файл уже существует. Перезаписать?
}

if(!file1.open(QIODevice::ReadOnly))
{
    qDebug() << "Ошибка открытия для чтения";
}

if(!file2.open(QIODevice::WriteOnly))
{
    qDebug() << "Ошибка открытия для записи";
}

QByteArray a = file1.readAll();
file2.write(a);
file1.close();
file2.close();

Операция считывания всех данных сразу, в зависимости от размера файла, может занять много оперативной памяти, а значит, к этому следует прибегать только в случаях острой необходимости или в том случае, когда файлы занимают мало места. Расход памяти при считывании сразу всего файла можно значительно сократить при том условии, что файл содержит избыточную информацию. Тогда можно воспользоваться функциями сжатия qCompress() и qUncompress(), которые определены вместе с классом QByteArray. Эти функции получают, в качестве аргумента, объект класса QByteArray и возвращают, в качестве результата, новый объект класса QByteArray.

Для удаления файла класс QFile содержит статический метод remove(). В этот метод необходимо передать строку, содержащую полный или относительный путь удаляемого файла.

Читать далее: Класс QBuffer