====== Файлы, каталоги, Ввод/Вывод ====== ===== Ввод/Вывод. Класс 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()**.\\
:!: Пример: Вывод на консоль с любого устройства в/в. 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::**): * **current()** - текущий каталог приложения * **root()** - корневой каталог * **drivers()** - список с узловыми каталогами, например для винды это корневые разделы (C:\, D:\ и т.д.) (указатель на объект QFileInfo) * **home()** - каталог пользователя Данный класс не предоставляет методов для определения каталога из которого запущено приложение, его можно определить методом- **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 ==== -----
:!: Пример: