====== Файлы, каталоги, Ввод/Вывод ======
===== Ввод/Вывод. Класс 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 ====
-----
:!: Пример: