Содержание

Файлы, каталоги, Ввод/Вывод

Ввод/Вывод. Класс QIODevice

IODevice- это абстрактный класс, обобщающий устройства ввода/вывода.
Реализация конкретного устройства происходит в унаследованных классах, есть 4 предопределенных:

Для работы с устройством, его необходимо открыть в одном из след режимов (QIODevice::):

Метод openMode() позволяет узнать в каком режиме открыто устройство.
Для чтения записи методы read() и write(), метод readAll() читает все и возвращает QByteArray. Так же есть readLine() и getChar().

Получить текущее положение курсора pos(), сменить его- seek(). Применимо к QFile, QBuffer и QTemoraryFile, не применимо при сетевом доступе.

Есть ряд методов, для получения информации об устройстве, например isReadable() и isWriteable().

:!: Пример: Вывод на консоль с любого устройства в/в.
void print(QIODevice *vDev)
{
    char vCh;
    QString vStr;
    vDev->open(QIODevice::ReadOnly);
    for(; !vDev->atEnd();)
    {
        vDev->getChar(&vCh);
        vStr += vCh;
    }
    vDev->close();
    qDebug() << vStr;
}

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


Открыть файл можно передав путь в конструкторе, либо позже, методом setName(). Проверить открытие файла isOpen(), с закрытием файла (close()) сброс буфера происходит автоматически, можно вызвать его вручную, методом flush(). Для проверки существования есть статический метод QFile::exist().
Для удаления файла есть статический метод remove()

Для экономии ОЗУ можно использовать сжатие, методами qCompress() и qUncompress(), они работают с классом QByteArray.

:!: Пример: немного методов для работы с файлами
void TestFiles()
{
    QFile vFile1("file1.dat");
    QFile vFile2("file2.dat");
 
    if(vFile2.exists())
        qDebug() << "File is exist";
    if(!vFile1.open(QIODevice::ReadOnly))
        qDebug() << "Open Error";
 
    QByteArray a= vFile1.readAll();
    vFile2.write(a);
 
    vFile1.close();
    vFile2.close();
}

Класс QBuffer


Представляет собой эмуляцию файлов в памяти компьютера. Это позволяет записывать информацию в ОЗУ, и использовать объекты как обычные файлы. Чтение запись можно делать методами read() и write(), либо же с помощью потоков.

QByteArray vArr;
QBuffer vBuffer(&vArr);
vBuffer.open(QIODevice::WriteOnly);
QDataStream vOut(&vBuffer);
vOut << QString("Message");

Из примера видно, что сами данные сохраняются внутри объекта QByteArray. Методом buffer() можно получить константную ссылку на этот внутренний объект, а методом setBuffer() соответственно установить для использования другой объект.

Метод data() идентичен buffer(), но setData() возвращает не указатель (как setBuffer()) константную ссылку на QByteArray, для копирования его данных.

В целом, данный класс удобен для кэширования данных.

Класс QTemporaryFile


Предоставляет средства для создания и работы с временными файлами, временные файлы могут пригодится например для сброса больших данных на диск.
Самостоятельно генерирует уникальное имя файла, хранятся файлы в промежуточной директории (QDir::tempPath()), при уничтожении объекта, уничтожаются и его временные файлы.

Работа с каталогами. Класс QDir

Представление каталогов в платформонезависимом виде.
Имеет ряд статических методов (QDir::):

Данный класс не предоставляет методов для определения каталога из которого запущено приложение, его можно определить методом- QApplication::applicationDirPath().

Существование можно определить exist(). Для перемещения используются cd(), cdUp(), cd(«..») и т.д.
Для конвертирования относительного пути к абсолютному- makeAbsolute().

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


Метод entryList() возвращает перечень содержимого, есть фильтры и т.д.
Отобразить можно с помощью представления, например QListWidget унаследована от QListView и имеет инструменты для работы с элементами (вставка/удаление и т.д.).

:!: Пример: Содержимое каталога
/*...*/
QDir *vDirectory= new QDir(this->txtSelectedDir->toPlainText());
QListWidget viewListResults->addItems(vDirectory->entryList());
/*...*/

Информация о файлах. Класс QFileInfo

Файл или Каталог


Путь и имя файла


Информация о дате/времени


Атрибуты файла


Размер файла


Наблюдение за файлами и каталогами

Потоки ввода/вывода

QTextStream


QDataStream


:!: Пример: