Инструменты пользователя

Инструменты сайта


develop:qt:files

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
develop:qt:files [2021/09/12 11:57]
admin создано
develop:qt:files [2021/09/22 05:22] (текущий)
admin
Строка 2: Строка 2:
  
  
 +===== Ввод/Вывод. Класс QIODevice =====
 +**IODevice**- это абстрактный класс, обобщающий устройства ввода/вывода.\\
 +Реализация конкретного устройства происходит в унаследованных классах, есть 4 предопределенных:
 +  * **QFile** - работа с файлами
 +  * **QBuffer/QByteArray** - работа с буфером
 +  * **QAbstractSocket** - базовый класс, для сетевой коммуникации
 +  * **QProcess** - работа с процессами
 +
 +Для работы с устройством, его необходимо открыть в одном из след режимов (**QIODevice::**):
 +  * **NotOpen** - устр-во не открыто (хз зачем вообще)
 +  * **ReadOnly** - только чтение
 +  * **WriteOnly** - только запись
 +  * **ReadWrite** - чтение/запись
 +  * **Append** - добавление
 +  * **Unbuffered** - непосредственный доступ к данным, без промежуточных буферов чтения/записи
 +  * **Text** - преобразование символов переноса (Windows/Unix)
 +
 +Метод **openMode()** позволяет узнать в каком режиме открыто устройство.\\
 +Для чтения записи методы **read()** и **write()**, метод **readAll()** читает все и возвращает **QByteArray**. Так же есть **readLine()** и **getChar()**.\\
 +
 +Получить текущее положение курсора **pos()**, сменить его- **seek()**. Применимо к **QFile**, **QBuffer** и **QTemoraryFile**, не применимо при сетевом доступе.\\
 +
 +Есть ряд методов, для получения информации об устройстве, например **isReadable()** и **isWriteable()**.\\
 +
 +<details>
 +<summary>:!: Пример: Вывод на консоль с любого устройства в/в.</summary>
 +<code cpp-qt>
 +void print(QIODevice *vDev)
 +{
 +    char vCh;
 +    QString vStr;
 +    vDev->open(QIODevice::ReadOnly);
 +    for(; !vDev->atEnd();)
 +    {
 +        vDev->getChar(&vCh);
 +        vStr += vCh;
 +    }
 +    vDev->close();
 +    qDebug() << vStr;
 +}
 +</code>
 +</details>
 +
 +
 +==== Работа с файлами. Класс QFile ====
 +-----
 +Открыть файл можно передав путь в конструкторе, либо позже, методом **setName()**. Проверить открытие файла **isOpen()**, с закрытием файла (**close()**) сброс буфера происходит автоматически, можно вызвать его вручную, методом **flush()**. Для проверки существования есть статический метод **QFile::exist()**.\\
 +Для удаления файла есть статический метод **remove()**
 +
 +Для экономии ОЗУ можно использовать **сжатие**, методами **qCompress()** и **qUncompress()**, они работают с классом **QByteArray**.\\
 +
 +<details>
 +<summary>:!: Пример: немного методов для работы с файлами</summary>
 +<code cpp-qt>
 +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();
 +}
 +</code>
 +</details>
 +
 +
 +==== Класс QBuffer ====
 +-----
 +Представляет собой эмуляцию файлов в памяти компьютера. Это позволяет записывать информацию в ОЗУ, и использовать объекты как обычные файлы. Чтение запись можно делать методами **read()** и **write()**, либо же с помощью потоков.\\
 +
 +<code cpp-qt>
 +QByteArray vArr;
 +QBuffer vBuffer(&vArr);
 +vBuffer.open(QIODevice::WriteOnly);
 +QDataStream vOut(&vBuffer);
 +vOut << QString("Message");
 +</code>
 +Из примера видно, что сами данные сохраняются внутри объекта **QByteArray**. Методом **buffer()** можно получить константную ссылку на этот внутренний объект, 
 +а методом **setBuffer()** соответственно установить для использования другой объект.\\
 +
 +Метод **data()** идентичен **buffer()**, но **setData()** возвращает не указатель (как setBuffer()) константную ссылку на **QByteArray**, для копирования его данных.\\
 +
 +В целом, данный класс удобен для кэширования данных.\\
 +
 +
 +==== Класс QTemporaryFile ====
 +-----
 +Предоставляет средства для создания и работы с временными файлами, временные файлы могут пригодится например для сброса больших данных на диск.\\
 +Самостоятельно генерирует уникальное имя файла, хранятся файлы в промежуточной директории (**QDir::tempPath()**), при уничтожении объекта, уничтожаются и его временные файлы.
 +
 +
 +===== Работа с каталогами. Класс QDir =====
 +Представление каталогов в платформонезависимом виде.\\
 +Имеет ряд статических методов (**QDir::**):
 +  * **current()** - текущий каталог приложения
 +  * **root()** - корневой каталог
 +  * **drivers()** - список с узловыми каталогами, например для винды это корневые разделы (C:\, D:\ и т.д.) (указатель на объект QFileInfo)
 +  * **home()** - каталог пользователя
 +
 +Данный класс не предоставляет методов для определения каталога из которого запущено приложение, его можно определить методом- **QApplication::applicationDirPath()**.\\
 +
 +Существование можно определить **exist()**. Для перемещения используются **cd()**, **cdUp()**, **cd("..")** и т.д.\\
 +Для конвертирования относительного пути к абсолютному- **makeAbsolute()**.\\
 +
 +
 +==== Содержимое каталога ====
 +-----
 +
 +Метод **entryList()** возвращает перечень содержимого, есть фильтры и т.д.\\
 +Отобразить можно с помощью представления, например **QListWidget** унаследована от **QListView** и имеет инструменты для работы с элементами (вставка/удаление и т.д.).\\
 +
 +
 +<details>
 +<summary>:!: Пример: Содержимое каталога</summary>
 +<code cpp-qt>
 +/*...*/
 +QDir *vDirectory= new QDir(this->txtSelectedDir->toPlainText());
 +QListWidget viewListResults->addItems(vDirectory->entryList());
 +/*...*/
 +</code>
 +</details>
 +
 +
 +
 +
 +===== Информация о файлах. Класс QFileInfo =====
 +
 +==== Файл или Каталог ====
 +-----
 +==== Путь и имя файла ====
 +-----
 +==== Информация о дате/времени ====
 +-----
 +==== Атрибуты файла ====
 +-----
 +==== Размер файла ====
 +-----
 +
 +
 +===== Наблюдение за файлами и каталогами  =====
 +
 +
 +===== Потоки ввода/вывода =====
 +
 +==== QTextStream ====
 +-----
 +==== QDataStream ====
 +-----
 +
 +
 +
 +<details>
 +<summary>:!: Пример: </summary>
 +<code cpp-qt>
 +
 +</code>
 +</details>
develop/qt/files.1631447830.txt.gz · Последнее изменение: 2021/09/12 11:57 — admin