Qt как прописать путь к файлу

Обновлено: 06.07.2024

Относительный путь

Троекратное использование ../ означает то, что нам нужно подняться на три уровня выше по иерархии (до корневой директории), затем посетить директорию etc и, находящуюся в ней, директорию mc . Если нужно указать файл или папку в текущей директории, то используется ./ :

Полный путь

Полный путь всегда определяется от корневой директории (вне зависимости от текущей выбранной папки). Полный путь к файлам mc.menu и 1.mp3 будет выглядеть следующим образом:

class path

Для того, чтобы представить путь в файловой системе используются объекты класса path . Пути неявно преобразуются в std::basic_string , что позволяет использовать их в качестве аргументов, например, для std::ifstream::open .

Класс path обладает большим количеством методов. Ниже приводятся некоторые из них:

Директория. Класс directory_iterator

Рассмотрим подробнее функции библиотеки для работы с директориями.

create_directory, create_directories

Создает директорию или директории в пути. Возвращают булевский тип успешности операции ( true , если создание директории в пути разрешено).

Отличаются тем, что в первом случае все директории в пути должны существовать.

Копирует файлы и директории. copy_options устанавливает параметры копирования.

Параметры копирования. copy_options
copy_options
Константа Описание
skip_existing Сохранить, но не сообщать об ошибках
overwrite_existing Заменить существующий файл
update_existing Замените существующий файл, только если он старше, чем копируемый файл
recursive Рекурсивно копировать поддиректории и их содержимое
copy_symlinks Копировать только символические ссылки, а не файлы, на которые они указывают
skip_symlinks Игнорировать символические ссылки
directories_only Копировать только структуру директорий, а не файлы относящиеся к директориям
create_symlinks Вместо создания копий файлов создавать символические ссылки, указывающие на оригиналы. Примечание: исходный путь должен быть абсолютным, если путь назначения не находится в текущей директории
create_hard_links Вместо создания копий файлов создаются жесткие ссылки

Несколько опций можно объединить битовой маской с помощью побитовых операций operator& , operator| , operator^ , operator

, operator&= , operator|= , и operator^= :

remove, remove_all

1. Удаляет файл, директорию и символическую ссылку (но не цель). Возвращает булевский тип ( true , если файл был удален, false , если он не существует).
2. Рекурсивно удаляет содержимое p (если это директория) и содержимое всех его поддиректорий, а затем удаляет и сам p . Возвращает количество файлов и директорий, которые были удалены (или 0 , если p не существует).

rename

Перемещает или переименовывает объект файловой системы, идентифицируемый old_p , в new_p .

directory_iterator
directory_options
Константа Описание
follow_directory_symlink Не пропускать символические ссылки
skip_permission_denied Пропускать директории в которых установленные привилегии могут привести к ошибкам

В программе ниже покажем содержимое директории проекта.

Обратите внимание, что в процессе работы итератора текущая директория будет изменяться. Узнать какая директория в данный момент выбрана можно с помощью функции current_path (см. ниже).

recursive_directory_iterator
current_path

1. Возвращает абсолютный путь текущего рабочего каталога.
2. Изменяет текущий рабочий каталог на p .

is_directory

Проверяет, соответствует ли данный статус файла или путь директории.
1. Эквивалент s.type() == file_type::directory .
2. Эквивалентно is_directory(status(p)) или is_directory(status(p, ec)) , соответственно.

temp_directory_path

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

Файлы и ссылки

Проверка типа файла
copy_file

Копирует один файл из from в to , используя параметры копирования. Поведение не определено, если в copy_options присутствует несколько опций.

file_size

Возвращает размер файла. Будет следовать символической ссылке. Попытка определения размера директории определяется реализацией.

resize_file

Изменяет размер обычного файла. Если размер файла был больше, чем new_size , оставшаяся часть файла отбрасывается. Если файл ранее был меньше, чем new_size , размер файла увеличивается, и новая область заполняется нулями.

Символические ссылки. create_symlink

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

copy_symlink

Копирует символическую ссылку в другое место.

read_symlink

Возвращает путь цели символической ссылки или ошибку, если p не является символической ссылкой или путь не символичеcкая ссылка. При ошибке возвращается пустой путь.

Жесткая ссылка. create_hard_link
hard_link_count

Возвращает количество жестких ссылок для объекта файловой системы, идентифицированного путем p.

Права на файлы и директории

Символические ссылки, файлы и директории имеют в UNIX-подобных ОС три вида прав доступа к ресурсу:

  • Право на чтение ( r )
  • Право на запись ( w )
  • Право на исполнение ( x )
  • Владелец
  • Группа владельца
  • Все остальные
Права на ресурс определяются одновременно для всех категорий в очередности, указанной выше.
Помимо прав в формате rwxrwxrwx существуют дополнительные биты SGID , SUID и sticky bit . Использование битов SUID или SGID позволяют запускать файл на выполнение с правами владельца файла или группы соответственно. sticky bit ( t -бит) используется только с директориями. Когда t -бит для директории не установлен, файл в данной директории может удалить (переименовать) любой пользователь, имеющий доступ на запись к данной директории. Устанавливая t -бит на директорию, можно изменить это правило так, что удалить (переименовать) файл мог только владелец этого файла.
Класс перечисление perms содержит константы, определяющие права на файлы и директории.

Тип perms удовлетворяет требованиям BitmaskType , т. е. определены побитовые операции operator& , operator| , operator^ , operator

, operator&= , operator|= и operator^= .
Класс perm_options предоставляет параметры, которые управляют поведением функции permissions (см. ниже). perm_options удовлетворяет требованиям BitmaskType (т. е. определены побитовые операции перечисленные выше).

perm_options
Константа Описание
replace Права будут полностью заменены аргументом для permissions() (поведение по умолчанию)
add Права будут заменены на аргументы perms с побитовым ИЛИ и текущим разрешением
remove Права будут заменены на аргументы perms с побитовым И для отрицания и текущим разрешением
nofollow Права будут изменены для самой символической ссылки, а не для файла, на который она ссылается

permissions

Изменяет права доступа к файлу, к которому разрешает путь p . Переход по символическим ссылкам, если perm_options::nofollow не установлен в opts .

Для того, чтобы показать права на все файлы в домашней директории воспользуемся итераторами по директории. Чтобы пути выводились без кавычек, будем конвертировать путь в строку, а затем небольшими манипуляциями произведем выравнивание:

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

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

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

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

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

Размер файла

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

// Имя файла передается в качестве аргумента в нашу программу qWarning ( "The file does not exist" ) ; // если файл не найден, то выводим предупреждение и завершаем работу программы qint64 size = fileinfo . size ( ) ; // qint64 - это тип данных, который гарантированно будет 64-битным на всех платформах, поддерживаемых Qt

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

ПОДГОТОВКА:

Шаг №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: Скопируйте этот файл в папку к соответствующему компилятору (напомню, т.к. я использовал компилятор 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

У меня есть проект, над которым я работаю в Qt creator, для которого требуется сторонняя библиотека. Я хочу добавить заголовки к пути включения для проекта. Как мне это сделать?

Если вы используете qmake, стандартную систему сборки Qt, просто добавьте строку в .pro файл, как описано в Справочнике по переменным qmake :

Если вы используете свою собственную систему сборки, вы создаете проект, выбрав «Импорт проекта на основе Makefile». Это создаст несколько файлов в вашем каталоге проекта, включая файл с именем <your project name>.includes . В этом файле просто перечислите пути, которые вы хотите включить, по одному на строку. На самом деле все это говорит Qt Creator, где искать файлы для индексации для автозаполнения. Ваша собственная система сборки должна будет обрабатывать пути включения по-своему.

Как объяснено в Руководстве по Qt Creator , <your path> должен быть абсолютный путь, но вы можете избежать записей в вашем .pro файле для ОС, хоста или пользователя , используя $$PWD ссылку на папку, содержащую ваш .pro файл, например

Ладно. Это будет работать для меня просто отлично. Существует ли глобальная настройка для путей включения? Не то, чтобы я знал, но это не значит, что нет. Я ничего не вижу в опциях, которые выглядят так. Неважно. Ваш ответ упоминает, INCLUDE_PATH но вы имели в виду INCLUDEPATH . Я исправлю ваш ответ :) QMAKE_CXXFLAGS Вместо этого лучше использовать переменные, потому что они INCLUDEPATH глючные (по крайней мере, на данный момент - QT5). Т.е. когда я включил INCLUDEPATH += ../../../ , QT просто случайно выбрал каталог по этому пути, и компилятор получил опцию -I../../../GUI . @ Hi-Angel: Похоже, что INCLUDEPATH указанное относится к каталогу сборки, а не к каталогу с, .pro как можно легко предположить. Как показано в моей правке к ответу, вы можете использовать `$$ PWD ', чтобы получить четко определенную папку для запуска пути включения.

Чтобы добавить глобальный путь включения, используйте настраиваемую команду для qmake в разделе Projects / Build / Build Steps в разделе «Дополнительные аргументы» следующим образом: "QT+=your_qt_modules" "DEFINES+=your_defines"

Я думаю, что вы можете использовать любую команду из * .pro файлов таким образом.

1) Как заставить Qt Creator (или qmake?) помещать все бинарники в папку $КОРЕНЬ-ПРОЕКТА/bin? 2) Как заставить его все временные файлы также помещать в папку $КОРЕНЬ-ПРОЕКТА/temp

1) и 2) необходимо чтобы можно было чистить абсолютно все временные файлы при помощи git clean. Если они за $КОРЕНЬ-ПРОЕКТА то уже не очистятся естественно.

3) Проблема: если собирать в Qt Creator 2.0.1 проект с SUBDIRS где исполняемый файл и библиотека (.so), то при запуске оно напишет ошибка что библиотека не грузится и не может быть найдена вообще, т.е. новые правила сборки путают пути и программа не видит библиотеку. Хотя в старой версии все отлично собирается работает и отлаживается.

Подскажите, пожалуйста, как решить эти три проблемы?




Если в самом криэйторе, то Projects —> Build Settings и в Build directory указать $SOURCEDIR/bin. Но лучше прописать это в .pro-файле.

Насчет git clean: не проще ли игнор использовать?



Все три проблемы решаются с помощью CMake.

1 и 2 - советую разделять директорию и исходными файлами и директорию сборки, разделять как на жёстком диске, так и в голове. Завтра вы захотите собрать проект в режиме Release или с каком-нибудь отладочным функционалом или с другой версией Qt (посмотреть, не отвалилось ли что, пощупать новые плюшки) - и тогда вы озадачитесь вопросом, как же это всё ложится на существующую систему директорий. Это уже не говоря, что директория с иходниками должна быть всегда в состоянии, готовом к упаковке. А рекурсивный поиск файлов для добавления в репозиторий должен выдавать только исходники.

3 - в CMake это решается с помощью rpath, которые по-умолчанию включены для связанных целей в проекте, чтобы успростить отладку. Думаю в QMake должно быть так же, сравните Makefile предыдущей и текущей версий на наличие опции --rpath в LFLAGS.


Спасибо всем! Выключение shadow build решило проблему.



Не знаю как для subdirs, но для нескольких открытых проектов точно можно выбирать активный кнопкой над кнопкой запуска(Ctrl T). Если не поможет, возможно нужный проект определяется по номеру, т.е. может берется первый из subdirs.


ЗЫ Проблема что программа не видит SO-шку заключалась в том, что раньше Qt Creator выставлял LD_LIBRARY_PATH, а сейчас по всей видимости нет. Если вручную указать эту переменную в настройках проекта то работает как прежде.

Читайте также: