Урок №5. Работа с файлами и каталогами в Qt5

  Дмитрий Бушуев  | 

  Обновл. 27 Окт 2019  | 

 1150

 ǀ   1 

В этом уроке мы рассмотрим работу с файлами и каталогами в Qt5. Для этого мы будем использовать следующие классы:

   QFile, QDir и QFileInfo — основные классы для работы с файлами в Qt5;

   QFile — предоставляет интерфейс для чтения и записи информации в файлы;

   QDir — обеспечивает доступ к структуре каталогов и к их содержимому;

   QFileInfo — предоставляет информацию о файле, включая его имя и расположение в файловой системе, время доступа и изменения, имя владельца файла и текущие разрешения.

Поехали!

Размер файла

Для определения размера файла в классе QFileInfo предусмотрен метод size():

Для запуска программы проделайте следующие шаги:

ПОДГОТОВКА:

   Шаг №1: Скомпилируйте вашу программу. Для этого выберете в меню Сборка -> Собрать всё (или нажмите Ctrl+Shift+B).

   Шаг №2: Зайдите в папку, где лежит ваш Qt-проект. (у меня он расположен в C:\dev\Qt_Project)

   Шаг №3: После выполнения первого шага у вас должна появиться ещё одна папка, в которой будет создан исполняемый файл программы. Т.к. я использую компилятор MinGW 32-bit и режим компиляции Debug, то при компиляции проекта, Qt автоматически создал папку build-My_QtApplication-Desktop_Qt_5_13_0_MinGW_32_bit-Debug.

   Шаг №4: Зайдите в папку debug (она находится внутри папки из шага №3).

   Шаг №5: Найдите *.exe-файл вашей программы (у меня это file_size.exe).

   Шаг №6: Cкопируйте этот файл в папку к соответствующему компилятору (напомню, т.к. я использовал компилятор MinGW 32-bit, то у меня этот путь выглядит следующим образом: C:\Soft\Qt\5.13.0\mingw73_32\bin).

ЗАПУСК ПРОГРАММЫ:

   Шаг №7: Откройте командную строку.

   Шаг №8: Перейдите в папку из шага №6 (cd C:\Soft\Qt\5.13.0\mingw73_32\bin).

   Шаг №9: Запустите свою программу, передав ей в качестве параметра имя любого файла (у меня этим файлом оказалась эта же программа, поэтому в моём случае команда была следующей — file_size.exe file_size.exe).

   Баста!

Результат:


Чтение содержимого файлов


Для того, чтобы прочитать содержимое файла, мы должны сначала открыть этот файл в режиме чтения, затем создать входящий файловый поток, из которого мы будем считывать данные. В примере ниже мы считываем данные из файла C:\colours.txt. Файл содержит названия семи цветов, вот его содержимое:

Red
Green
Black
Yellow
Purple
Blue
White

А теперь сама программа:

Результат выполнения программы выше:


Запись данных в файл

Для записи данных в файл, мы сначала открываем файл в режиме записи, затем создаём поток вывода, направленный в файл, и используем оператор << для записи данных в этот поток. В примере ниже имена пяти дистрибутивов Linux записываются в файл C:\distros.txt:

В результате по заданному вами пути программа создаст файл со следующим содержимым:


Копирование файла


Когда мы копируем файл, мы создаём точную копию файла с другим именем или же в другом месте файловой системы. В следующем примере создаётся копия указанного файла с помощью метода QFile::copy():

Примечание: Для запуска программы см. часть «Размер файла» (Подготовка и Запуск программы).

Результат выполнения программы выше:


Владелец файла и группы

Примечание: Выполнение данной функции может занимать довольно много времени в Unix и в Windows (в порядке миллисекунд). В Windows функция возвращает пустую строку, если не включена проверка разрешений NTFS. В файловых системах NTFS проверка прав собственности и разрешений по умолчанию отключена как раз из соображений производительности. Чтобы включить проверку, добавьте в вашу программу следующие строчки:

Каждый файл имеет конкретного пользователя, который является его владельцем. Файл также принадлежит и некоторой группе пользователей. В следующем примере выводится информация о владельце и основной группе файла, с которым мы работаем:

Примечание: Для запуска программы см. часть «Размер файла» (Подготовка и Запуск программы).

Результат выполнения программы выше:


Время последнего чтения/изменения файла


Файлы хранят информацию о последнем времени их чтения/изменения. Чтобы получить эту информацию, мы будем использовать класс QFileInfo. В примере ниже выводится время последнего чтения и последнего изменения указанного файла:

Примечание: Для запуска программы см. часть «Размер файла» (Подготовка и Запуск программы).

Результат выполнения программы выше:


Работа с каталогами

Для работы с каталогами (папками) в Qt имеется соответствующий класс QDir. В следующем примере мы рассмотрим 4 метода для работы с каталогами:

Примечание: Для запуска программы см. часть «Размер файла» (Подготовка и Запуск программы).

Результат выполнения программы выше:


Специальные пути


В файловой системе существуют некоторые специальные пути (например, домашняя директория или корневой каталог). Для получения специальных путей, заданных в системе, используется класс QDir. Рассмотрим пример, в котором выводятся 4 специальных пути:

Результат выполнения программы выше:


Путь к файлу

Файл идентифицируется по имени и пути. Путь состоит из имени файла, базового имени и суффикса. В следующем примере мы используем несколько методов для вывода пути к файлу и его частей:

Примечание: Для запуска программы см. часть «Размер файла» (Подготовка и Запуск программы).

Результат выполнения программы выше:


Права доступа

Файлы в файловой системе имеют систему защиты: флаги, которые определяют, кто может получить доступ к файлам и изменять их, а кто — нет. Метод QFile::permissions() возвращает перечисление флагов для рассматриваемого файла. В примере ниже создаётся Unix-подобный список разрешений для указанного файла.

Существует три типа возможных пользователей:

   владелец;

   группа, к которой принадлежит файл;

   все остальные пользователи, именуемые others.

Первые три позиции принадлежат владельцу файла, следующие три позиции — группе, в которую входит файл, а последние три символа принадлежат остальным пользователям.

Существует четыре вида прав:

   чтение (r);

   запись или изменение (w);

   выполнение (x);

   отсутствие прав (-).

Примечание: Следующий пример работает только в Unix-системах.

Результат выполнения программы выше:

Владелец и группа пользователей, которым принадлежит файл, имеют право прочитать файл и изменить его. Другие пользователи имеют право читать файл. Поскольку файл не является исполняемым, то нет никаких прав на выполнение файла.

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

В следующем примере мы рассмотрим работу с содержимым указанного каталога. Для перечисления содержимого каталога используется класс QDir и его метод entryInfoList(). Список файлов отсортирован по размеру, при этом вывод идёт в два столбца: первый столбец содержит имена файлов, а второй — размеры файлов.

Примечание: Для запуска программы см. часть «Размер файла» (Подготовка и Запуск программы).

Результат выполнения программы выше:


Заключение

Это последняя статья, в которой возможности Qt5 рассматриваются на примере консольного приложения. В следующих уроках данного туториала мы начнём работать с GUI + Widgets.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (5 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 1

  1. Аватар Александр:

    Есть служба, которая следит за каталогом с довольно большим, от сотен до тысяч, количеством файлов. На основе анализа содержимого файлов строятся отчеты (до пяти отчетов разных видов). Если содержимое какого-либо файла меняется, либо меняется количество файлов, построение отчетов прерывается и начинается заново. Функциональность построения отчета реализована в классе Начал с чтения документации и примеров Qt. Во всех примерах поток создается наследованием класса QThread и переопределением метода

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *