QDir — работа с директориями в Qt
Разные платформы имеют разные способы представления путей. ОС Windows содержит буквы дисков, например: C:\Windows\System. UNIX использует root, например: /usr/bin. Обратите внимание, что для разделения имен директорий в обоих представлениях используются разные знаки. Для представления директорий в платформонезависимой форме Qt предоставляет класс QDir.
Для этих целей класс предоставляет целый ряд статических методов:
- QDir::current() — возвращает путь директории приложения;
- QDir::root () — возвращает root-директорию;
- QDir::drives ()—возвращает указатель на список объектов класса
- QFileinfo с узловыми директориями (root). Для Windows это будут С:\, D:\ и т. д.;
- QDir::home () — возвращает персональную директорию пользователя.
Класс QDir не предоставляет методов для определения текущего каталога приложения.
Существование директории можно проверить с помощью метода exists(). Чтобы перемещаться по директориям, можно использовать метод cd(), который принимает, в качестве параметра, абсолютный путь директории, и cdUp(). Вызов cd(«..») эквивалентен вызову метода cdUp().
Для конвертирования относительного пути директории в абсолютный можно вызвать метод
Для создания директории нужно вызвать метод mkdir(). В случае успешного проведения этой операции метод вернет значение true, в случае неудачи — false.
Если вам потребуется переименовать директорию, то воспользуйтесь методом rename(). В этот метод первым параметром нужно передать старый путь, а вторым — новый. Если операция будет проведена успешно, то метод вернет true, иначе — false.
Удаление директорий производится методом rmdir(), который получает путь, и в случае успеха возвращает
Читать далее: Просмотр содержимого директории с помощью QDir
Как создать путь к файлу
Как указать путь к файлу: основные правила
Несмотря на достаточно высокую автоматизацию всех процессов и пользовательских действий, которые предусмотрены в Windows-системах, иногда возникает необходимость ручного задания пути к какому-то объекту, хранящемуся на локальных дисках или на удаленных серверах в Интернете. Ситуаций, когда крайне необходимо вводить такие данные, может быть очень много, но обычно рядовые пользователи ограничиваются простейшими действиями при задании выполнения команд в командной строке, при быстром вызове программных модулей, при проверке расположения объектов на локальных или сетевых ресурсах и т. д. Далее попробуем определиться, как указать путь к файлу или к любому другому объекту, затронув только самые основные аспекты и действия, которые могут понадобиться в повседневной работе, не вникая в нюансы организации сложных структур веб-страниц.
Что такое путь к файлу, каталогу, диску или веб-странице?
Для начала давайте определимся с основным понятием пути файла. Что это такое? Грубо говоря, путь к любому объекту представляет собой полную или сокращенную ссылку на его физическое местоположение на жестком диске или в Интернете (но тоже на жестком диске удаленного сервера или компьютера). В некотором смысле компьютерное указание пути можно сравнить со всем привычным почтовым адресом, где вы проживаете.
Так, например, в адресе указывается страна, город, улица, дом, корпус, квартира и имя жильца. Аналогия здесь такая:
- страна – диск или удаленный сетевой ресурс;
- имя жильца или адресата – название конечного файла;
- все остальное – промежуточные подпапки.
Многие могут заметить, что в почтовом адресе указывается еще и индекс города. Его чисто условно можно соотнести, скажем, с IP-адресом страницы в Интернете или в сетевом окружении, поскольку для локальных ресурсов такие пути практически никогда не используются.
Теперь давайте посмотрим, как указать путь к файлу, исходя из такой аналогии. Для начала рассмотрим локальные ресурсы, то есть носители, подключенные непосредственно к одному компьютеру.
Типы путей
Но тут сразу стоит сделать еще одно небольшое отступление. При указании пути к любому объекту нужно учитывать, что они могут быть либо абсолютными (полными), либо относительными (сокращенными). Полные пути применяются для указания точного местоположения искомого объекта, а относительные предназначены для объектов, которые могут находиться в определенных папках, для которых указывать их расположение изначально не нужно (это чаще всего применяется в веб-программировании при создании ссылок для перехода к документу).
Как записывать путь к файлу в Windows-системах: общие правила
Но это все пока что была теория. Перейдем к практике.
Итак, абсолютный путь всегда должен начинаться с указания литеры (буквы) диска или носителя, после которой ставится двоеточие. После него вписывается обратный слэш (черта с наклоном влево), далее указываются все промежуточные каталоги (опять же через разделитель в виде слэша), а в конце вписывается имя файла с обязательным указанием его расширения.
Запись путей для веб-страниц
Теперь отдельно стоит сказать о том, как указать путь к файлу, находящемуся на удаленном сервере (в Интернете). Понятно, что в этом случае точно определить букву диска вы не сможете. Собственно, это и не нужно.
В качестве абсолютного пути указывается последовательность, в которой первым вписывается название протокола (например, http, https и т. д.). Затем ставится двоеточие, указывается двойной правый слэш. После этого через одинарный правый слэш прописываются все промежуточные страницы (ресурсы). А в конце, как и в прошлом случае, задается название файла с расширением или имя содержащего его каталога (или страницы) для просмотра всех объектов.
Как узнать, где находится файл?
Но очень часто можно встретить ситуации, когда абсолютный путь к нужному объекту вы не знаете, а его срочно нужно определить. Для этого можете воспользоваться «Проводником» и просто задать название файла в специальном поисковом поле или выполнить аналогичный поиск по расширению, вписав его после точки и заключив в звездочки.
В случае с папками в адресной строке путь можно будет скопировать, используя для этого пункт меню ПКМ «Копировать адрес как текст», а затем вставить в нужное место, дописав название файла вручную. Однако можно использовать свойства самого файла, где тоже будет указана директория, в которой он находится.
А вот в случае наличия для файла ярлыка уже в его свойствах следует обратить внимание на поле типа объекта. В котором как раз и будет указан абсолютный путь.
Методы быстрого копирования путей и открытия нужных файлов
Как указать путь к файлу, немного разобрались. Теперь кратко остановимся на некоторых методах, позволяющих ускорить открытие файлов или копирование их адресов (путей).
Например, используя копирование, описанное выше, ссылки на абсолютные пути файлов можно вставлять в командную консоль, но при этом сам путь с обеих сторон должен заключаться в кавычки. Чтобы не заниматься такими вещами, можете просто перетащить нужный объект из «Проводника» в командную строку. Если это исполняемый файл программы, она запустится немедленно. Если же это какой-то документ, он будет автоматически открыт в сопоставленном ему приложении.
Напоследок остается добавить, что очень часто может потребоваться использовать консоль «Выполнить». В качестве простейших команд в ней вводятся именно названия исполняемых компонентов, для которых путь доступа к файлу и расширение запускаемого объекта очень часто указывать не нужно. Почему? Да только потому, что меню «Выполнить» в основном предназначено для вызова исполняемых апплетов (обычно EXE-формата и некоторых других), находящихся по умолчанию либо в директории System32, либо в каталоге Windows.
Например, для запуска редактора реестра достаточно вписать только имя файла regedit, для старта стандартного «Блокнота» — notepad, для командной строки — cmd и т. д. В принципе, если выполнить некоторые нехитрые настройки, для такого типа быстрого запуска можно указать любое приложение или какой-то документ, но это уже отдельная тема для разговора.
Путь к файлу
Раздел: Контрольные по информатике / Контрольная № 1
Путь к файлу — это очень простая тема, которая, тем не менее, вгоняет в ступор большинство пользователей, особенно с гуманитарным складом ума.
В этой статье я попробую разжевать, разобрать “по косточкам” эту тему настолько подробно и внятно, чтобы стало понятно абсолютно любому человеку, даже если он только вчера сел за компьютер.
Надеюсь, вы уже знаете, что такое файл. Поэтому разбирать этот термин здесь не будем. А будем вести рассказ только о пути к файлу.
Забегая вперёд, скажу, что есть два способа добраться до файла — используя либо полный путь к файлу, либо относительный путь. Подробнее об этом чуть позже, а пока разберёмся с именем файла.
Имя файла
Имя файла в операционных системах DOS/Windows состоит из трёх частей:
- Название (имя).
- Разделитель.
- Расширение.
ПРИМЕЧАНИЕ
По умолчанию в Windows расширения файлов скрыты, так что в Проводнике вы можете их и не увидеть. Как сделать их видимыми — зависит от операционной системы.
В первых версиях операционной системы DOS имя (то есть первая часть имени файла) не могла иметь длину более 8 символов. Сейчас это ограничение снято. Однако я настоятельно рекомендую не давать файлам слишком длинные имена. Потому что если полный путь к файлу (о полном пути будет сказано далее) будет превышать 255 символов, то вы можете столкнуться с разного рода неприятностями (особенно в операционных системах вплоть до Windows XP).
Подробнее см. в бесплатной книге Компьютер для чайника.
Полный путь к файлу
Итак, с именем файла мы разобрались. И это уже хорошо. Теперь определимся с тем, что такое полный путь к файлу.
Начнём с истоков. Где хранятся файлы? Правильно — на диске.
Поэтому начало пути любого файла — это диск (либо какой-то сетевой ресурс, но это уже отдельная тема).
Файл может храниться непосредственно на диске, либо в какой-то папке (каталоге, директории — это разные названия одного и того же объекта — папки). Папки могут быть вложенными другу в друга (как матрёшки).
То есть полный путь файла начинается с буквы диска и заканчивается именем файла. А между ними могут быть имена каталогов. Каталоги в DOS/Windows разделяются косой чертой (\).
Например, у нас на диске С есть папка 000, а в этой папке есть папка 010, а в этой папке тоже есть папка 100. А уже в папке 100 есть файл 111.ТХТ. Тогда полный путь к файлу будет такой:
С:\000\010\100\111. ТХТ
Относительный путь к файлу
С этим вопросом у новичков обычно сложнее. Потому что теорию относительности люди как-то плохо понимают ))))
Разумеется, относительный путь к файлу — это тема намного более простая, чем вышеупомянутая теория Эйнштейна. Поэтому разберёмся и с ней.
Итак, однозначно можно определить местоположение файла, если известен полный путь к нему.
Однако не всегда удобно использовать полный путь, потому что он слишком длинный. И если сейчас для пользователя это не так актуально, то во времена DOS и других подобных операционных систем, где приходилось работать только в командной строке, этот вопрос был очень и очень даже большой проблемой.
Поэтому, чтобы не писать полный путь к файлу для того, чтобы получить к нему доступ, придумали такую штуку как относительный путь.
Сначала давайте вспомним про вложенные папки (каталоги).
Итак, всё начинается с диска. Диск — это корневой каталог. Корневой — потому что он первый в пути, и дальше “расти” уже некуда. Диск — это корень. А дальше растут стволы и ветви (папки), а на ветвях растут листья (файлы).
Соответственно каждая папка имеет родителя (кроме корневого каталога). Но не каждая папка имеет детей (то есть вложенные папки). Что поделаешь — не всем везёт в любви )))
Следовательно, у каждой папки могут быть (а могут и не быть) дочерние папки. И у каждой папки (кроме корневого каталога) есть родительские папки.
Следовательно, в общем случае папка может быть родительской относительно своих “детей”, и дочерней относительно своих “родителей”.
Здесь всё как в жизни — вы чей-то ребёнок, и также чей-то родитель (ну или скоро будете)))
Для вашей мамы вы ребёнок, а для ваших детей — мама (или папа).
А теперь наконец после долгих лирических отступлений перейдём к относительности путей. Итак, снова вспомним наш пример:
С:\000\010\100\111. ТХТ
Здесь каталог 010 является дочерним относительно каталога 000, и он же является родительским по отношению к каталогу 100.
Когда вы работаете в командной строке или в Проводнике, то в текущий момент времени вы можете находиться только в одной папке.
Например, если вы работаете в командной строке и находитесь в папке 100 из нашего примера, то для открытия файла 111.ТХТ вам не надо набирать полный путь к файлу — достаточно написать только имя файла.
Имя файла в данном случае и будет относительным путём. То есть относительный путь — это часть полного пути относительно текущего каталога.
Например, вы находитесь в папке 010. То есть выше находятся
С:\000
а ниже находится каталог
100
Тогда относительный путь к файлу 111.ТХТ будет таким:
100\111.ТХТ
Так можно перемещаться вниз относительно текущего местоположения.
А можно ли перемещаться вверх?
Да, можно.
Для того, чтобы перейти на одну ступень вверх (то есть в родительский каталог) относительно текущего каталога, используются две точки ..
Например, если мы находимся здесь: С:\000\010\100, и в папке 010 у нас есть файл 011.ТХТ, то открыть его можно так:
..\011.ТХТ
А если в папке 000 у нас есть файл 001.ТХТ, то открыть его можно так:
..\..\001.ТХТ
Ну и так далее. Надеюсь, смысл вы уловили.
Как прописать путь к файлу
Вернёмся к полному пути, который мы рассмотрели выше:
С:\000\010\100\111.ТХТ
Если у вас есть такие папки и в этих папках есть такой файл, то вы можете ввести этот путь в командной строке, или прописать путь к файлу в адресной строке Проводника и нажать ENTER. Тогда файл откроется (если, конечно, у вас есть программа, которая сможет его открыть и с этой программой связан тип этого файла).
Командную строку можно вызвать комбинацией клавиш WIN+R или через меню ПУСК-ВЫПОЛНИТЬ.
Когда вы откроете командную строку, то можете непосредственно в ней ввести команду (в нашем случае командой будет путь к файлу) и нажать ENTER.
Если же вам любопытно немного помучиться и представить, как люди работали в DOS, то вы можете открыть командный интерпретатор. Для этого в командной строке наберите CMD (для Windows 2000 и выше) или COMMAND (для Windows 95/98/ME) и нажмите ENTER.
Откроется консоль (см. рис.), где вы можете вдоволь натешиться, вводя разные команды. Правда, для этого вы должны их знать — но это уже другая тема…
Если что-то осталось непонятным, то опять же отправляю вас к книге Компьютер для чайника.
Неправильный путь к файлу
Наверняка при работе за компьютером вы получали сообщение о том, что файл не найден, что указан неправильный путь или что-то типа того (см. рис. выше).
Причины подобных ошибок могут быть следующими:
- Файл не существует по указанному пути.
- Указанный путь не существует (например, вы указали диск D, а на вашем компьютере нет диска с такой буквой).
- В имени файла содержатся недопустимые символы (список недопустимых символов у каждой операционной системы свой).
- Путь к файлу слишком длинный, и операционная система не может его понять.
- Кодировка символов в пути к файлу не соответствует кодировке, установленной в операционной системе (это надо, в основном, программистам — обычные пользователи редко встречаются с такой проблемой).
Ну что же, на этом всё. Надеюсь, статья вам помогла. Не забудьте поделиться ссылкой с друзьями в социальных сетях.
Полный путь к файлу или папке
В этой статье будет рассмотрен ряд методов, которые можно использовать для того, чтобы скопировать полный путь к файлу или папке в Проводнике Windows 10. Невзирая на то, что это тривиальная задача, существует несколько интересных вариантов, которые вы обязательно найдете для себя полезными.
Файловый проводник в операционной системе — это приложение для управления файлами, которое поставляется в комплекте с ОС, начиная с Windows 95. Кроме операций по управлению объектами, в интерфейсе реализована поддержка панелей быстрого доступа, рабочего стола, сети и других полезнейших функций.
Иногда, а в некоторых случаях и на постоянной основе, пользователям необходимо копировать полный путь к папке или файлу. Возможно для загрузки документа в Интернет или добавления в продолжение к какой-либо команде в Командной строке и т.п.
Удобно будет это сделать, когда он уже скопирован в буфер обмена. Тогда его можно получить одним нажатием кнопки мыши или определенным сочетанием клавиш.
В ОС Windows 10 есть несколько способов копирования полного пути к объектам в Проводнике. Давайте их рассмотрим.
Полный путь к файлу
1-й метод. Найдите целевой файл и отметьте его. На вкладке «Главная» Панели инструментов найдите кнопку «Скопировать путь» и нажмите её. Дальше вставьте содержимое из буфера обмена в любое место. Оно будет оформлено двойными кавычками.
2-й метод. В адресной строке кликните правой кнопкой мыши. В контекстном меню выберите кнопку копирования адреса как текста. Это работает только для папок. Кавычки не применяются. Первый же пункт меню «Копировать адрес» отправляет в буфер обмена сам объект, который можно будет вставить в другое место на диске.
3-й метод. Просто нажмите левой кнопкой мыши на область адресной строки. Выделенное содержимое станет доступно для редактирования с помощью пунктов контекстного меню.
4-й метод. Для меня самый эффективный и простой. Зажмите клавишу Shift и, удерживая её, щелкните правой кнопкой мыши на нужном файле. Найдите пункт «Копировать как путь» и нажмите на него. В результате вставки также будут присутствовать кавычки.
Командная строка
5-й метод. Быстро вставить полный путь к файлу в Командную строку можно простым перетаскиванием объекта. Расположите рядом окно файлового Проводника и окно интерпретатора команд, зацепите курсором мыши файл в первом и перетащите его во второе.
Вот и всё! Какие дополнительные методы известны вам? Спасибо за внимание!
Как прописать путь?
Иногда путь к необходимой Вам папке в реестре указывается не совсем корректно. Причинами могут быть так же и воздействие вредных вирусов. Этой проблеме требуется срочное решение, потому что если путь к нужной программе указан не правильно, значит будет невозможно для неё установить плагины и обновления. И это повлечет за собой множество проблем и затруднится работа системы. В этой статье мы поможем эту проблему и расскажем, как прописать путь к файлу или к папке.
Как прописать путь к файлу. Инструкция
- Если Вы хотите узнать, как прописать путь к файлу, надо нажать на ярлык на правую кнопку мыши. Выскочит контекстное меню, там есть команда «Свойства», выбираете ее. В результате, появится окно и там будет вкладка «Ярлык», жмите.
- В появившемся окне Вы увидите некоторые параметры, а именно: «Рабочая папка», которая выполняет функцию названия папки, в которой находится файл. На него указывает ярлык; «Объект» — это полный путь к файлу. Вначале в параметре «Объект», мы наблюдаем жесткий диск, после видим папку, где он находится. «Расположение файла», нажимая левой кнопкой мыши, тем самым Вы открываете папку, в которой находится файл.
- К примеру, Вам надо найти, как прописать путь того или иного процесса, запущенного в операционной системе. Мы расскажем, как это сделать. Нужно нажать на клавиатуре клавиши Ctrl-Alt-Del, в результате чего, на мониторе Вашего компьютера откроется окно, там будет «Диспетчер задач». Можно еще запустить сразу, тогда придется нажать клавиши Ctrl-ShIft-Esc.
- В «Диспетчере задач» войдите в «Процессы». Будет список, Вам необходимо будет выбрать процесс, через который Вы узнаете путь к файлу, это можно сделать с помощью правой кнопки мыши. Потом будет информация об объекте. Строка «Тип» содержит информацию о его типе. Ниже находится — «Расположение». В этой строке будет указан в полном объеме путь к файлу. А если Вы нажмете вкладку «Подробно», тогда узнаете сопутствующие данные о нем. К примеру: исходное имя; авторское право и тому подобное. Чтобы узнать о цифровой подписи объекта, Вам надо перейти на вкладку «Цифровые подписи».
Как прописать путь к папке. Инструкция
- Вам нужно найти «Запуск программы», для этого в меню «Пуск» Вы находите «Выполнить» и делаете выбор.
- Вашему вниманию будет предоставлена строка ввода. В этой строке Вам надо прописать «regedit», что является названием реестра. Когда Вы введете слово и нажмете на ОК, Вы окажетесь в рабочем окне реестра.
- Слева Вашему взгляду представится некое количество папок, с этого перечня выберете папку «HKEY_LOCAL_MACHINE». Сделав выбор, два раза нажмите на нее или раз по крестику.
- Далее Вам надо найти в списке «SOFTWARE», в нем, как правило, имеют свойство отображаться папки с программами и играми, входящими в реестр.
- Открывая документ «SOFTWARE», таким же способом, как «HKEY_LOCAL_MACHINE», Вы найдете ту папку, которая Вам нужна по ее названию.
- Выделив ее одним щелчком левой кнопкой мыши, посмотрите в правой части окна отображающиеся ключи нужной Вам папки. Вы должны убедиться в ее важности, имея в виду нахождения там exe-файла. В обратном порядке, ключи Вы не сможете увидеть. На строке ключа, в пункте «Значение», и есть ответ на вопрос как прописать путь к папке.
- Для того, чтобы путь папки был правильным, нужно его поменять. Щелкните два раза по ключу и запишите в строку значения адрес, который ведет к Вашей папке с данными.
Как указать путь к папке?
Как прописать путь к файлу. Инструкция
- Если Вы хотите узнать, как прописать путь к файлу, надо нажать на ярлык на правую кнопку мыши. Выскочит контекстное меню, там есть команда «Свойства», выбираете ее. В результате, появится окно и там будет вкладка «Ярлык», жмите.
- В появившемся окне Вы увидите некоторые параметры, а именно: «Рабочая папка», которая выполняет функцию названия папки, в которой находится файл. На него указывает ярлык; «Объект» — это полный путь к файлу. Вначале в параметре «Объект», мы наблюдаем жесткий диск, после видим папку, где он находится. «Расположение файла», нажимая левой кнопкой мыши, тем самым Вы открываете папку, в которой находится файл.
- К примеру, Вам надо найти, как прописать путь того или иного процесса, запущенного в операционной системе. Мы расскажем, как это сделать. Нужно нажать на клавиатуре клавиши Ctrl-Alt-Del, в результате чего, на мониторе Вашего компьютера откроется окно, там будет «Диспетчер задач». Можно еще запустить сразу, тогда придется нажать клавиши Ctrl-ShIft-Esc.
- В «Диспетчере задач» войдите в «Процессы». Будет список, Вам необходимо будет выбрать процесс, через который Вы узнаете путь к файлу, это можно сделать с помощью правой кнопки мыши. Потом будет информация об объекте. Строка «Тип» содержит информацию о его типе. Ниже находится — «Расположение». В этой строке будет указан в полном объеме путь к файлу. А если Вы нажмете вкладку «Подробно», тогда узнаете сопутствующие данные о нем. К примеру: исходное имя; авторское право и тому подобное. Чтобы узнать о цифровой подписи объекта, Вам надо перейти на вкладку «Цифровые подписи».
Как прописать путь к папке. Инструкция
- Вам нужно найти «Запуск программы», для этого в меню «Пуск» Вы находите «Выполнить» и делаете выбор.
- Вашему вниманию будет предоставлена строка ввода. В этой строке Вам надо прописать «regedit», что является названием реестра. Когда Вы введете слово и нажмете на ОК, Вы окажетесь в рабочем окне реестра.
- Слева Вашему взгляду представится некое количество папок, с этого перечня выберете папку «HKEY_LOCAL_MACHINE». Сделав выбор, два раза нажмите на нее или раз по крестику.
- Далее Вам надо найти в списке «SOFTWARE», в нем, как правило, имеют свойство отображаться папки с программами и играми, входящими в реестр.
- Открывая документ «SOFTWARE», таким же способом, как «HKEY_LOCAL_MACHINE», Вы найдете ту папку, которая Вам нужна по ее названию.
- Выделив ее одним щелчком левой кнопкой мыши, посмотрите в правой части окна отображающиеся ключи нужной Вам папки. Вы должны убедиться в ее важности, имея в виду нахождения там exe-файла. В обратном порядке, ключи Вы не сможете увидеть. На строке ключа, в пункте «Значение», и есть ответ на вопрос как прописать путь к папке.
- Для того, чтобы путь папки был правильным, нужно его поменять. Щелкните два раза по ключу и запишите в строку значения адрес, который ведет к Вашей папке с данными.
Как быстро скопировать путь к файлу в Windows 7
Нередко нам требуется быстро скопировать полный путь к файлу либо папке в Windows 7. Однако, достать его не так уж просто. Нужно открыть Проводник, выделить путь к папке или файлу и воспользоваться командой Копировать. А если нужно получить еще и расширение файла, то тут вообще начинаются одни сложности.
Непонятно, о чем речь? Давайте разберемся. Вот есть файл history.txt в папке, расположенной по адресу C:\multitran\Puh\. Как мне скопировать путь к файлу в Проводнике?
Ну, можно щелкнуть на значении PUH правой кнопкой мыши и выбрать команду Копировать адрес как текст.
И что? В итоге получим такой адрес:
C:\multitran\PUH
А мне нужен такой:
C:\multitran\PUH\history.txt
Путь к файлу требуется достаточно часто, особенно к исполняемым файлам. Скажем, это нужно в поле ввода команд Выполнить (Win + R) либо в командной строке.
Да, путь несложно ввести ручками, но неужели в могучей Windows 7 нельзя скопировать путь к файлу одной несчастной кнопкой?
К счастью, такая возможность предусмотрена, причем двумя методами.
Как указать путь к папке?
Указать путь к папке. Главный вопрос нашей статьи на которого найдут ответа уважаемые ггости — это вопрос: Как указать путь к папке на виндовс и в начале статьи мы хотим рассказать именно про это. Для того что бы узнать адрес папки, предлагаем уважаемому читателю включить свой компьютер и войти в Мой Компьютер. Потом найти эту папку на которую хотите указать путь и взглянуть на верхнюю часть окна. На верхней части окна есть пункт под названием адрес и рядом с ним ячейка похожая на ту ячейку в нашем браузере к которому пишем адреса сайтов. На этой ячейке и будет адрес вашей папки. Скопируйте её и вставьте на документе в которым хотите указать адрес папки.
#2
ZIP папка. Многие люди скачивают с различных сайтов, файлы архивированные в формате ZIP и затрудняются их открыть. Мы хотим на протяжении этой статьи рассказать таким людям и об открытии такого формата архивов и соответственно продолжая читать, уважаемый гость узнает о том как открыть ZIP папку. Для того что бы открыть архивную папку ZIP, вам надо с начало скачать и установить программу ZIP архиватор WinRAR. Для скачки архиватора есть два способа: Можете поискать в Гуглу или в Яндексе данный архиватор либо установить ZIP архиватор с диска виндовс. На сегодняшний день на всех дисках в формате DVD с виндовс, есть дополнительные программы и среди дополнительных программ виндовса обязательно должно быть ZIP архиватор. После установки архиватора, просто кликните на архивный файл и она откроется.
#3
Удалить папку с диска C. Для тех кто не знает как удалить папку с диска C, объясняем: Сразу нужно сказать что в дике C удалить папки с названиями: Documents and settings, Program files и Windows не возможно. Но возможно удаления некоторых папок внутри этих папок которые Не относятся к системным программам или файлам. Если какой то файл который не имеет не какой принадлежности к системе, не удаляется — это может означать что в данной папке содержится вирус и не допускает к удалению.
#4
Папка Рабочий стол. Пред последняя тема нашей статьи посвящается вопросу: Как найти папку рабочий стол? Для того что бы найти папку рабочий стол, надо зайти в Мой Компьютер. Потом заходим в диск С и переходим в папку Documents and settings. На Documents and settings есть папка All users внутри которой и имеется папка Рабочий стол.
#5
Папка Windows 8. К сожалению наша статья близка концу и в конце нашей статьи мы хотим дать уважаемому читателю информацию о том, как удалить папку Windows 8. К сожалению папку Windows 8 удалить нельзя по тому что она обеспечивает работу виндовса. Но если кто то хочет удалить папку виндовс по тому что хочет установить другой, уверяем что по ходу установки нового виндовса папка Windows 8 сама стирается и пытаться удалить его до установки нового виндовса — бессмысленно.
🔥 Как быстро скопировать путь к файлу или папке
Иногда может потребоваться указать полный путь к какой либо папке или файлу. Например в Командной строке иногда требуется указать путь к файлу для его исполнения и т.п.
Есть несколько способов узнать и скопировать путь. В данной статье рассмотрим три способа копирования пути стандартными средствами Windows, начиная с самого простого.
Копирования в два клика
Самый простой и быстрый способ, это использовать дополнительные возможности контекстного меню.
- Просто зажмите клавишу Shift и кликните по нужной папке или файлу Правой кнопкой мыши;
- В контекстном меню появятся дополнительные пункты;
- Выберите пункт Копировать как путь.
Все, теперь можете вставлять путь туда, куда вам нужно.
Путь в проводнике
Когда вы откроете нужную папку, в верхней панеле проводника будет указан полный путь к ней.
- Кликните по нему Левой кнопкой мыши;
- Теперь копируйте путь через контекстное меню или при помощи сочетания клавиш Ctrl+C.
Все, вставляем куда надо. Так просто это работает, если требуется путь к какой либо папке. Если же путь нужен к файлу, то вставив подобный образом путь до папки, где расположен файл, придется еще описать название самого файла, включая его расширение (например Setup.exe).
Через свойства
- Кликнув правой кнопкой мыши по нужному файлу или папке, выберите Свойства;
- Теперь вы видите путь к ним в графе Расположение;
- Можете скопировать этот путь и вставлять куда требуется;
- К пути придется дописать \ и название файла или папки.
Вконтакте
Google+
Загрузка…Как создать новый файл с полным путем в Qt?
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
Пути к HTML-файлам
Путь к файлу описывает расположение файла в структуре папок веб-сайта.
Примеры путей к файлам
Путь | Описание |
---|---|
Файл «picture.jpg» находится в той же папке, что и текущая страница. | |
Файл «picture.jpg» находится в папке изображений в текущей папке | |
Файл «picture.jpg» находится в папке изображений в корне текущего веб-сайта. | |
Файл «picture.jpg» находится в папке на один уровень выше текущей папки |
Пути к HTML-файлам
Путь к файлу описывает расположение файла в структуре папок веб-сайта.
Пути к файлам используются при связывании с внешними файлами, например:
- Интернет-страницы
- Изображения
- Таблицы стилей
- Скрипты Java
Абсолютные пути к файлам
Абсолютный путь к файлу — это полный URL-адрес файла:
Пример
Попробуйте сами »
Тег объясняется в главе: Изображения HTML.
Относительные пути к файлам
Относительный путь к файлу указывает на файл относительно текущей страницы.
В следующем примере путь к файлу указывает на файл в папке изображений, расположенной в корне текущей сети:
В следующем примере путь к файлу указывает на файл в папке изображений, расположенной в текущая папка:
В следующем примере путь к файлу указывает на файл в папке изображений, расположенной в папка на один уровень выше текущей папки:
Лучшая практика
Лучше всего использовать относительные пути к файлам (если возможно).
При использовании относительных путей к файлам ваши веб-страницы не будут привязаны к текущему базовый URL. Все ссылки будут работать как на вашем собственном компьютере (localhost), так и на ваше текущее общественное достояние и ваши будущие общедоступные домены.
.
c ++ — Как создать абсолютный путь к файлу из QDir и относительный путь к файлу?
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
linux — Unix — создать путь к папкам и файлу
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…
R команда dir.create и file.path
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
Именование файлов, путей и пространств имен — приложения Win32
- 14 минут на чтение
В этой статье
Все файловые системы, поддерживаемые Windows, используют концепцию файлов и каталогов для доступа к данным, хранящимся на диске или устройстве. Разработчики Windows, работающие с API Windows для ввода-вывода файлов и устройств, должны понимать различные правила, соглашения и ограничения имен файлов и каталогов.
Доступ к данным можно получить с дисков, устройств и сетевых ресурсов с помощью API файлового ввода-вывода. Файлы и каталоги, наряду с пространствами имен, являются частью концепции пути, который представляет собой строковое представление того, где получить данные, независимо от того, с диска ли они, устройства или сетевого подключения для конкретной операции.
Некоторые файловые системы, такие как NTFS, поддерживают связанные файлы и каталоги, которые также соответствуют соглашениям и правилам именования файлов, как и обычный файл или каталог.Дополнительные сведения см. В разделах Жесткие ссылки и переходы, Точки повторной обработки и операции с файлами.
Для получения дополнительной информации см. Следующие подразделы:
Чтобы узнать о настройке Windows 10 для поддержки длинных путей к файлам, см. Ограничение максимальной длины пути.
Имена файлов и каталогов
Все файловые системы следуют одним и тем же общим соглашениям об именах для отдельных файлов: базовое имя файла и дополнительное расширение, разделенные точкой. Однако каждая файловая система, такая как NTFS, CDFS, exFAT, UDFS, FAT и FAT32, может иметь особые и разные правила формирования отдельных компонентов на пути к каталогу или файлу.Обратите внимание, что каталог — это просто файл со специальным атрибутом, обозначающим его как каталог, но в остальном он должен следовать всем тем же правилам именования, что и обычный файл. Поскольку термин каталог просто относится к особому типу файла в том, что касается файловой системы, в некоторых справочных материалах будет использоваться общий термин файл , чтобы охватить как концепции каталогов, так и файлов данных как таковых. По этой причине, если не указано иное, любые правила именования или использования или примеры для файла также должны применяться к каталогу.Термин путь означает один или несколько каталогов, обратную косую черту и, возможно, имя тома. Для получения дополнительной информации см. Раздел «Пути».
Ограничения на количество символов также могут быть разными и могут различаться в зависимости от файловой системы и используемого формата префикса имени пути. Это дополнительно осложняется поддержкой механизмов обратной совместимости. Например, более старая файловая система MS-DOS FAT поддерживает максимум 8 символов для основного имени файла и 3 символа для расширения, всего 12 символов, включая разделитель точек.Обычно это имя файла 8.3 . Файловые системы Windows FAT и NTFS не ограничиваются именами файлов 8.3, потому что они имеют длинных имен файлов, поддерживают , но они все еще поддерживают версию 8.3 длинных имен файлов.
Условные обозначения
Следующие фундаментальные правила позволяют приложениям создавать и обрабатывать допустимые имена для файлов и каталогов независимо от файловой системы:
Используйте точку, чтобы отделить базовое имя файла от расширения в имени каталога или файла.
Используйте обратную косую черту (\) для разделения компонентов пути . Обратная косая черта отделяет имя файла от пути к нему и одно имя каталога от имени другого каталога в пути. Вы не можете использовать обратную косую черту в имени фактического файла или каталога, потому что это зарезервированный символ, разделяющий имена на компоненты.
Используйте обратную косую черту как часть имен томов, например, «C: \» в «C: \ path \ file» или «\\ server \ share» в «\\ server \ share \ path \ file «для имен UNC.Дополнительные сведения об именах UNC см. В разделе «Ограничение максимальной длины пути».
Не учитывайте регистр. Например, считайте имена OSCAR, Oscar и oscar одинаковыми, даже если некоторые файловые системы (например, файловая система, совместимая с POSIX) могут рассматривать их как разные. Обратите внимание, что NTFS поддерживает семантику POSIX для чувствительности к регистру, но это не поведение по умолчанию. Для получения дополнительной информации см. CreateFile .
Обозначения томов (буквы дисков) также нечувствительны к регистру.Например, «D: \» и «d: \» относятся к одному и тому же тому.
Используйте любой символ текущей кодовой страницы для имени, включая символы Unicode и символы из расширенного набора символов (128–255), за исключением следующего:
Следующие зарезервированные символы:
- > (больше)
- : (двоеточие)
- «(двойная кавычка)
- / (косая черта)
- \ (обратная косая черта)
- | (вертикальный стержень или труба)
- ? (вопросительный знак)
- * (звездочка)
Целочисленное значение 0, иногда называемое символом ASCII NUL .
Символы, целочисленные представления которых находятся в диапазоне от 1 до 31, за исключением альтернативных потоков данных, где эти символы разрешены. Для получения дополнительной информации о файловых потоках см. Файловые потоки.
Любой другой символ, запрещенный целевой файловой системой.
Используйте точку в качестве каталога , компонент в пути для представления текущего каталога, например «. \ Temp.txt». Для получения дополнительной информации см. Пути.
Используйте две последовательные точки (..) в качестве каталога , компонент в пути для представления родительского элемента текущего каталога, например «.. \ temp.txt». Для получения дополнительной информации см. Пути.
Не используйте следующие зарезервированные имена для имени файла:
CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 и LPT9. Также избегайте этих имен, за которыми сразу следует расширение; например, NUL.txt не рекомендуется. Для получения дополнительной информации см. Пространства имен.
Не заканчивайте имя файла или каталога пробелом или точкой. Хотя базовая файловая система может поддерживать такие имена, оболочка Windows и пользовательский интерфейс — нет. Однако допустимо указывать точку в качестве первого символа имени. Например, «.temp».
Краткие и длинные имена
Длинным именем файла считается любое имя файла, которое превышает короткое имя MS-DOS (также называемое 8.3 ) соглашение об именах стилей. Когда вы создаете длинное имя файла, Windows может также создать короткую форму имени 8.3, названную псевдонимом 8.3, или коротким именем, и также сохранить ее на диске. Этот псевдоним 8.3 может быть отключен по соображениям производительности в масштабе всей системы или для определенного тома, в зависимости от конкретной файловой системы.
Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: 8.3 псевдонимы нельзя отключить для указанных томов до Windows 7 и Windows Server 2008 R2.
Во многих файловых системах имя файла будет содержать тильду (~) внутри каждого компонента имени, которое является слишком длинным для соответствия правилам именования 8.3.
Примечание
Не все файловые системы следуют соглашению о замене тильды, и системы можно настроить так, чтобы отключить создание псевдонимов 8.3, даже если они обычно это поддерживают. Поэтому не предполагайте, что псевдоним 8.3 уже существует на диске.
Чтобы запросить у системы имена файлов 8.3, длинные имена или полный путь к файлу, рассмотрите следующие варианты:
В более новых файловых системах, таких как NTFS, exFAT, UDFS и FAT32, Windows хранит длинные имена файлов на диске в Unicode, что означает, что исходное длинное имя файла всегда сохраняется.Это верно, даже если длинное имя файла содержит расширенные символы, независимо от кодовой страницы, которая активна во время операции чтения или записи на диск.
Файлы с длинными именами файлов можно копировать между разделами файловой системы NTFS и разделами файловой системы Windows FAT без потери информации об имени файла. Это может быть неверно для старых файловых систем MS-DOS FAT и некоторых типов файловых систем CDFS (CD-ROM), в зависимости от фактического имени файла. В этом случае, если возможно, подставляется короткое имя файла.
Пути
Путь к указанному файлу состоит из одного или нескольких компонентов , разделенных специальным символом (обратной косой чертой), при этом каждый компонент обычно является именем каталога или именем файла, но с некоторыми заметными исключениями, обсуждаемыми ниже. Для интерпретации системой пути часто критически важно, как выглядит начало пути, или префикс , . Этот префикс определяет пространство имен , которое использует путь, и, кроме того, какие специальные символы используются в какой позиции в пути, включая последний символ.
Если компонент пути является именем файла, он должен быть последним компонентом.
Каждый компонент пути также будет ограничен максимальной длиной, указанной для конкретной файловой системы. В общем, эти правила делятся на две категории: коротких и длинных . Обратите внимание, что имена каталогов хранятся в файловой системе как файлы особого типа, но правила именования файлов также применяются к именам каталогов. Подводя итог, путь — это просто строковое представление иерархии между всеми каталогами, которые существуют для определенного имени файла или каталога.
Полностью квалифицированные и относительные пути
Для функций Windows API, которые управляют файлами, имена файлов часто могут относиться к текущему каталогу, в то время как некоторые API требуют полного пути. Имя файла указывается относительно текущего каталога, если оно не начинается с одного из следующих символов:
- Имя UNC любого формата, которое всегда начинается с двух символов обратной косой черты («\\»). Для получения дополнительной информации см. Следующий раздел.
- Обозначение диска с обратной косой чертой, например «C: \» или «d: \».
- Одинарная обратная косая черта, например, «\ каталог» или «\ file.txt». Это также называется абсолютным путем .
Если имя файла начинается только с указателя диска, но не с обратной косой черты после двоеточия, оно интерпретируется как относительный путь к текущему каталогу на диске с указанной буквой. Обратите внимание, что текущий каталог может быть или не быть корневым, в зависимости от того, что он был установлен во время последней операции «изменения каталога» на этом диске.Примеры этого формата:
- «C: tmp.txt» относится к файлу с именем «tmp.txt» в текущем каталоге на диске C.
- «C: tempdir \ tmp.txt» относится к файлу в подкаталоге текущего каталога на диске C.
Путь также называется относительным, если он содержит «двойные точки»; то есть два периода вместе в одном компоненте пути. Этот специальный спецификатор используется для обозначения каталога над текущим каталогом, также известного как «родительский каталог».Примеры этого формата:
- «.. \ tmp.txt» определяет файл с именем tmp.txt, расположенный в родительском каталоге текущего каталога.
- «.. \ .. \ tmp.txt» указывает файл, который находится на два каталога выше текущего каталога.
- «.. \ tempdir \ tmp.txt» указывает файл с именем tmp.txt, расположенный в каталоге с именем tempdir, который является одноранговым каталогом для текущего каталога.
Относительные пути могут сочетать оба типа примеров, например «C: .. \ tmp.txt».Это полезно, потому что, хотя система отслеживает текущий диск вместе с текущим каталогом этого диска, она также отслеживает текущие каталоги в каждой из разных букв дисков (если в вашей системе их больше одной), независимо от какое обозначение привода установлено в качестве текущего привода.
Ограничение максимальной длины пути
В выпусках Windows до Windows 10 версии 1607 максимальная длина пути составляет MAX_PATH , что определяется как 260 символов.В более поздних версиях Windows для снятия ограничения требуется изменение раздела реестра или использование инструмента групповой политики. См. Полную информацию в разделе «Ограничение максимальной длины пути».
Пространства имен
Существует две основные категории соглашений о пространствах имен, используемых в API Windows, обычно называемых пространствами имен NT и пространствами имен Win32 . Пространство имен NT было разработано как пространство имен самого нижнего уровня, в котором могли существовать другие подсистемы и пространства имен, включая подсистему Win32 и, как следствие, пространства имен Win32.POSIX — еще один пример подсистемы в Windows, которая построена на основе пространства имен NT. Ранние версии Windows также определяли несколько предопределенных или зарезервированных имен для определенных специальных устройств, таких как коммуникационные (последовательные и параллельные) порты и консоль дисплея по умолчанию как часть того, что теперь называется пространством имен устройств NT, и все еще поддерживаются в текущих версиях. Windows для обратной совместимости.
Пространства имен файлов Win32
Префикс и соглашения пространства имен Win32 суммированы в этом и следующем разделах с описанием их использования.Обратите внимание, что эти примеры предназначены для использования с функциями Windows API и не обязательно работают с приложениями оболочки Windows, такими как Windows Explorer. По этой причине существует более широкий диапазон возможных путей, чем обычно доступен из приложений оболочки Windows, и приложения Windows, которые используют это преимущество, могут быть разработаны с использованием этих соглашений о пространстве имен.
Для файлового ввода-вывода префикс «\\? \» В строке пути указывает API-интерфейсам Windows отключить весь синтаксический анализ строк и отправить строку, которая следует за ним, прямо в файловую систему.Например, если файловая система поддерживает большие пути и имена файлов, вы можете превысить ограничения MAX_PATH , которые в противном случае применяются API Windows. Дополнительные сведения о обычном ограничении максимального пути см. В предыдущем разделе «Ограничение максимальной длины пути».
Поскольку он отключает автоматическое расширение строки пути, префикс «\\? \» Также позволяет использовать «..» и «.» в именах путей, что может быть полезно, если вы пытаетесь выполнить операции с файлом с этими зарезервированными спецификаторами относительного пути как часть полного пути.
Многие, но не все API файлового ввода-вывода поддерживают «\\? \»; вы должны посмотреть справочную тему для каждого API, чтобы быть уверенным.
Обратите внимание, что API Unicode следует использовать, чтобы убедиться, что префикс «\\? \» Позволяет вам превышать MAX_PATH
Пространства имен устройств Win32
Префикс «\\. \» Будет обращаться к пространству имен устройства Win32 вместо пространства имен файлов Win32. Таким образом, доступ к физическим дискам и томам осуществляется напрямую, без прохождения через файловую систему, если API поддерживает этот тип доступа.Таким образом можно получить доступ ко многим устройствам, отличным от дисков (например, с помощью функций CreateFile и DefineDosDevice ).
Например, если вы хотите открыть системный последовательный коммуникационный порт 1, вы можете использовать «COM1» в вызове функции CreateFile . Это работает, потому что COM1 – COM9 являются частью зарезервированных имен в пространстве имен NT, хотя использование префикса «\\. \» Также будет работать с этими именами устройств. Для сравнения: если у вас установлена плата расширения последовательного порта на 100 портов и вы хотите открыть COM56, вы не сможете открыть ее с помощью «COM56», потому что для COM56 нет предопределенного пространства имен NT.Вам нужно будет открыть его, используя «\\. \ COM56», потому что «\\. \» Переходит непосредственно в пространство имен устройства, не пытаясь найти предопределенный псевдоним.
Другой пример использования пространства имен устройства Win32 — использование функции CreateFile с «\\. \ PhysicalDisk X » (где X — допустимое целочисленное значение) или «\\. \ CdRom X ». Это позволяет получить доступ к этим устройствам напрямую, минуя файловую систему. Это работает, потому что эти имена устройств создаются системой при перечислении этих устройств, а некоторые драйверы также создают другие псевдонимы в системе.Например, драйвер устройства, реализующий имя «C: \», имеет собственное пространство имен, которое также является файловой системой.
API-интерфейсы, которые проходят через функцию CreateFile , обычно работают с префиксом «\\. \», Потому что CreateFile — это функция, используемая для открытия файлов и устройств, в зависимости от используемых вами параметров.
Если вы работаете с функциями Windows API, вы должны использовать префикс «\\. \» Для доступа только к устройствам, а не к файлам.
Большинство API-интерфейсов не поддерживают «\\.\ «; только те, которые предназначены для работы с пространством имен устройства, распознают его. Всегда проверяйте справочную тему для каждого API, чтобы быть уверенным.
Пространства имен NT
Существуют также API-интерфейсы, позволяющие использовать соглашение о пространстве имен NT, но диспетчер объектов Windows делает это ненужным в большинстве случаев. Чтобы проиллюстрировать это, полезно просматривать пространства имен Windows в обозревателе системных объектов, используя инструмент Windows Sysinternals WinObj. Когда вы запускаете этот инструмент, вы видите пространство имен NT, начинающееся с корня, или «\».Подпапка под названием «Global ??» здесь находится пространство имен Win32. Именованные объекты устройств находятся в пространстве имен NT в подкаталоге «Device». Здесь вы также можете найти Serial0 и Serial1, объекты устройства, представляющие первые два COM-порта, если они есть в вашей системе. Объект устройства, представляющий том, будет чем-то вроде «HarddiskVolume1», хотя числовой суффикс может отличаться. Имя «DR0» в подкаталоге «Harddisk0» является примером объекта устройства, представляющего диск, и так далее.
Чтобы сделать эти объекты устройств доступными для приложений Windows, драйверы устройств создают символическую ссылку (символическую ссылку) в пространстве имен Win32, «Global ??», на свои соответствующие объекты устройств. Например, COM0 и COM1 под заголовком «Global ??» подкаталог — это просто символические ссылки на Serial0 и Serial1, «C:» — это символическая ссылка на HarddiskVolume1, «Physicaldrive0» — это символическая ссылка на DR0 и так далее. Без символической ссылки указанное устройство «Xxx» не будет доступно для любого приложения Windows, использующего соглашения о пространстве имен Win32, как описано ранее.Однако дескриптор этого устройства может быть открыт с помощью любых API-интерфейсов, которые поддерживают абсолютный путь пространства имен NT в формате «\ Device \ Xxx».
С добавлением многопользовательской поддержки через службы терминалов и виртуальные машины возникла необходимость виртуализировать общесистемное корневое устройство в пространстве имен Win32. Это было достигнуто путем добавления символической ссылки «GLOBALROOT» в пространство имен Win32, которое вы можете увидеть в «Global ??» подкаталог инструмента браузера WinObj, о котором говорилось ранее, и получить доступ к нему можно по пути «\\? \ GLOBALROOT».Этот префикс гарантирует, что следующий за ним путь будет выглядеть как истинный корневой путь диспетчера системных объектов, а не путь, зависящий от сеанса.
Сравнение функций файловой системы
Привет, std::filesystem!. Небольшой пост о больших возможностях… | by Sergey Shambir
Небольшой пост о больших возможностях C++17
Как попробовать filesystem
На момент написания поста, то есть в июне 2017 года, стандарт С++17 ещё не утверждён окончательно, поэтому пространство имён filesystem
целиком находится в std::exprimental
. Три ведущих компилятора уже реализовали filesystem:
- Для Visuals Studio данный модуль доступен начиная с VS2017, и не забудьте включить в своих проектах флаг “/std:c++latest”
- Для Clang/LLVM с библиотекой libc++ модуль также доступен, но не забудьте добавить к флагам компоновщика
-lc++experimental -pthread
, поскольку в этой реализации STL все экспериментальные возможности выделены в “libc++experimental.a”, а сама STL использует pthreads - Для компилятора G++ из состава GCC версии 6.x и выше также потребуется флаг компоновщика:
-lstdc++fs
.
В любом случае, вам потребуется включать <std/experimental/filesystem>
вплоть до окончательного вступления C++17 в силу.
Конструирование путей и работа с кодировками
Любой опытный программист знает о разнице в обработке путей между Windows и UNIX-системами:
- в Windows пути принимаются в виде UTF-16 строк, часто используемый тип wchar_t представляет 2-байтный символ в кодировке UTF-16, а разделителем путей служит обратный слеш “\”
- в UNIX пути принимаются в виде UTF-8 строк, редко используеый wchar_t представляет 4-байтный символ в кодировке UCS32, а разделителем путей служит прямой слеш “/”
Конечно же filesystem абстрагируется от подобных различий и позволяет легко работать как с платформо-зависимыми строками, так и с универсальным UTF-8. Для получения UTF-8 версии пути служит метод .u8string()
.
Другие методы path и свободные функции позволяют конвертировать относительные пути в абсолютные и обратно, заменять расширение или имя файла, нормализовывать разделители к родному для ОС формату или получать “каноническое” представление пути.
Создание, удаление, переименование, копирование
Модуль filesystem предоставляет средства
- для проверки существования файла или каталога по заданному пути:
fs::exists
- для создания каталога (даже если потребуется создать несколько вложенных каталогов, он с этим справится):
fs::create_directories
- для удаления каталогов и файлов:
fs::remove
(удаляет файл или пустой каталог) иfs::remove_all
(удаляет файл или рекурсивно удаляет каталог) - для копирования и переименования каталогов и файлов средствами ОС, то есть с минимальными накладными расходами для приложения:
fs::copy
,fs::copy_file
иfs::rename
. - для обрезания или увеличения размера файла (путём забивания нулями):
fs::resize_file
.
Все подобные операции могут завершиться с ошибкой не по вине программиста, а из-за отказа операционной системы: например, процессу не хватит прав для удаления каталога. В одних приложениях такая ошибка доступа приводит к срыву всей операции и должна порождать исключение, в других — это типичная ситуация, которую приложение должно быстро обработать, и желательно без исключений. Чтобы учесть интересы всех программистов, каждая операция над файлами и каталогами в filesystem имеет две версии:
- более простая версия выбрасывает исключение типа
std::system_error
при ошибке - более сложная версия принимает дополнительный out-параметр типа
std::error_code
, в который в случае ошибки записывается код ошибки
Рекурсивный и нерекурсивный обход каталогов
До появления filesystem перечисление содержимого каталога в C++ было настоящей проблемой, решаемой чаще всего средствами нестандартного для C/C++ заголовка <dirent.h>
и ручной работы с циклами и списками.
В C++17 модуль filesystem предоставляет как рекурсивный, так и нерекурсивный итератор для доступа к содержимому каталога. С ним легко сочетаются любые алгоритмы из STL или Boost.Range. Ниже показан пример рекурсивного обхода каталога “data”:
Запрос метаинформации о файле
С помощью filesystem можно родными средствами ОС узнать метаинформацию о файле, например:
- определить размер файла, не читая его содержимое:
fs::file_size
- прочитать или установить последнее время записи данных каким-либо процессом в заданный файл:
fs::last_write_time
- прочитать или установить права доступа к файлу:
fs::permissions
Обработка symlink и hardlink
В современных UNIX-системах и даже в Windows есть так называемые мягкие и жёсткие ссылки на файлы, расположенные в другом месте.
- Мягкие ссылки хранят в метаданных файловой системы оригинальный путь файла, из-за этого они могут становиться битыми, если оригинальный файл удалят
- Жёсткие ссылки позволяют одному файлу одновременно быть доступным по нескольким путям, при этом все пути равноправны, а файл не удаляется, пока число жёстких ссылок на него не упадёт до нуля. Есть ограничение: жёсткие ссылки на один и тот же файл должны находиться на одном и том же разделе диска.
Эти ссылки воспринимаются как настоящие файлы при работе с ними через обычные средства, такие как fopen
или std::ifstream
. Но иногда возникает нужда поработать именно со ссылкой, и ОС предоставляют такой API, а filesystem абстрагирует программиста от ОС. Ниже показан пример работы с мягкими ссылками:
Информация о свободном месте на диске
Глобальная функция fs::space
возвращает объект типа fs::space_info
, который описывает объём свободного места на носителе, на котором расположен указанный путь. Если передать несколько путей, находящихся на одном носителе, результат будет одинаковым.
Возвращаемый объект содержит три показателя, все в байтах:
- capacity — общий объём носителя
- free — объём свободного места
- available — объём места, доступного непривелигированным процессам; этот показатель меньше или равен free — например, в Linux система резервирует 5% места для пользователя root и размер available скорее всего будет меньше на 5% от capacity.
Так можно вывести информацию о свободном месте на диске, где находися текущий рабочий каталог:
Решена ли проблема 2038 года?
Тип данных time_t на большинстве платформ хранит число секунд с полуночи 1 января 1970 года (хотя по стандарту единица измерения времени в time_t не определена, почти все используют секунды). Если time_t остаётся 32-битным, то возникает проблема 2038 года: именно в этот год произойдёт переполнение time_t, и время в формате UNIX Timestamp уже нельзя будет представить в виде 32-битной переменной.
В Windows по умолчанию используется 64-битный time_t. В Linux, к сожалению, нет. Это означает, что вы никогда не должны использовать time_t в своём повседневном коде! Напишите для своего проекта простой класс для создания и хранения Timestamp или воспользуйтесь библиотечным, таким как класс Poco::Timestamp. Для взаимодействия со стандартной библиотекой используйте struct tm
.
Проблема 2038 года не была решена в boost::filesystem
— в нём дата модификации файла передавалась в виде time_t. К счастью, std::filesystem
не имеет такого недостатка: для хранения времени используются типы данных из chrono
. Посмотрите пример:
Чего нет в filesystem?
Хотя в filesystem есть большинство популярных операций, некоторые задачи могут потребовать использования внешних библиотек либо API операционной системы. Примеры задач, не решённых в filesystem:
- определить, что путь является путём к сетевому хранилищу, а не к локальному диску
- определить путь к каталогу, в котором находится исполняемый файл процесса либо библиотека .dll/.so, код которой сейчас выполняется
- прочитать всю метаинформацию о файле за один запрос к ОС, а не за несколько
Впрочем, для решения таких задач нетрудно один раз написать вспомогательный класс, интерфейс которого будет использовать классы из filesystem.
Что ещё почитать
При составлении статьи мной были прочитаны и переосмыслены несколько англоязычных статей:
Если вы захотите ещё больше погрузиться в нюансы filesystem, то я советую их прочитать.
Файлы в Python | | О жизни, работе, людях…
1. Определение файла. Остатки кластеров.
2. Перевод строки.
\n —
\r —
3. Абсолютный и относительный путь к файлу.
4. Кодировка файлов.
5. Текстовые и бинарные файлы.
6. Чтение данных из файла
Рассмотрим простой пример:
from pprint import pprint f = open("виджет2.py", encoding="utf-8") a = f.read(20) print(a) print(f.name) print(f.tell()) print(f.seek(112)) print(f.tell()) a = f.read(20) print(a) pprint(dir(f))
Функция pprint предназначена для красивого вывода, pprint(dir(f)) выводит методы и свойства f. open — открывает файл и открытому файлу ставит в соответствие дескриптор f, с которым мы далее работаем.
В текстовом режиме можно читать файл построчно с использованием метода readline, при этом признаком конца строки является символ \n
:
f = open("виджет2.py", encoding="utf-8") for i in range(7): print(f.readline(), end="") f.close()
При этом строка читается из файла целиком, вместе со всеми специальными символами.
Текстовый файл можно занести в список:
f = open("виджет2.py", encoding="utf-8") lines = f.readlines() print('Type: %s, length: %d' % (type(lines), len(lines))) # Тип и количество строк print(lines[11]) # Номер выводимой строки f.close()
Файл можно перебирать по строкам:
f = open("виджет2.py", encoding="utf-8") for number, line in enumerate(f): print(line, end="") if number > 8: break f.close()
7. Запись в файл
f = open("1.txt", 'w') print(f.write('123\n456')) f.close()
8. Взаимодействие с PyQT
C помощью Qt Desiner создайте форму с двумя текстовыми областями и двумя кнопками как показано ниже на рисунке. Сохраните макет под именем read_file.ui. Обратите внимание, что одна текстовая область называется textBrowser, другая — textBrowser_2, а кнопки — pushButton и pushButton_2. После этого пишем код:
import sys from PyQt5 import uic from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow class MyWidget(QMainWindow): def __init__(self): super().__init__() uic.loadUi('read_file.ui',self) self.pushButton.clicked.connect(self.loadText) self.pushButton_2.clicked.connect(self.reverseText) def loadText(self): with open('read_file.ui','r') as f: self.textBrowser.setText(f.read()) def reverseText(self): data = self.textBrowser.toPlainText() self.textBrowser_2.setText(data[::-1]) app = QApplication(sys.argv) ex = MyWidget() ex.show() sys.exit(app.exec_())
Результат работы программы показан ниже.
Связанные статьи
Собрать данные из файлов защищенных паролем PowerQuery
Хитрости » 11 Апрель 2018 Дмитрий 6820 просмотровPowerQuery очень мощный инструмент по работе с файлами
Если еще не работали с надстройкой PowerQuery и не знаете что это такое, то для начала лучше ознакомиться со статьей: Power Query — что такое и почему её необходимо использовать в работе?
Наиболее часто она применяется для сбора данных с листов и файлов. Я для примеру возьму модель из своей статьи: Собрать и просуммировать данные из разных файлов при помощи PowerQuery. Там из папки отбираются все файлы Excel и объединяются в единую таблицу(плюс суммируются по критерию, но это сейчас неважно). Все работает отлично. Но если хотя бы на один файл будет установлен пароль на открытие запрос выдаст ошибку([DataFormat.Error] Внешняя таблица не имеет предполагаемый формат):
а если перейти в редактор запроса, то там будет ошибка вроде такой — Невозможно импортировать данные из книги, защищенной паролем:
чтобы избежать ошибки при обновлении надо держать файл без пароля, что не всегда допустимо. Особенно, когда речь идет о бюджетах и лежат они где-то на сетевом диске. Можно вручную открыть каждый файл, снять пароль, сохранить книгу, закрыть, обновить запрос, а затем установить пароль на все книги заново. Метод хоть и надежный, но совсем не быстрый, если книг с паролем в папке хотя бы 5-10.
Сама модель PowerQuery не умеет(пока что) работать с защищенными паролем файлами и не может снять пароль с книг. Но это можно сделать при помощи Visual Basic for Applications(VBA). При этом код не такой уж сложный сам по себе, но нам надо учесть три вещи:
- Папка с файлами должна определяться кодом автоматически из запроса. Здесь мы можем пойти хитрым путем и указывать путь в умной таблице(подробно про такой подход я описывал в статье: Относительный путь к данным PowerQuery). Тогда код так же сможет получить путь к папке просто из таблицы параметров. Это значит что и запрос PowerQuery и код VBA будут использовать один и тот же путь и это не потребует от нас особых усилий. Плюс модель можно будет перемещать куда угодно — а это тоже большой плюс
- Код должен сам сначала открыть все файлы, снять с них пароль, сохранить и закрыть. После этого обновить запрос и дождаться его выполнения
- И последним шагом код должен установить пароль на файлы обратно. И только после завершения обновления запроса, не раньше
Код просмотра файлов в папке я уже когда-то давно приводил на сайте: Просмотреть все файлы в папке. Нам останется его немного модифицировать и сделать из него функцию, которая будет на основании переданных в неё параметров либо снимать пароль, либо устанавливать. Впрочем, ниже готовый код, в котором достаточно комментариев, чтобы уловить суть:
'--------------------------------------------------------------------------------------- ' Author : The_Prist(Щербаков Дмитрий) ' Профессиональная разработка приложений для MS Office любой сложности ' Проведение тренингов по MS Excel ' http://www.excel-vba.ru ' [email protected] ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' Purpose: '--------------------------------------------------------------------------------------- Option Explicit Sub RefreshPQ() 'вызываем функцию, убирающую пароль на открытие файлов Call ReOpenFiles(True, "1234") 'обновляем все запросы в книге 'если надо обновить только определенные ' -можно сделать это либо в одном конкретном листе ' (убрать цикл For Each ws In ThisWorkbook.Worksheets) ' -либо взять конкретный запрос(ws.QueryTables(1).Refresh) Dim ws As Worksheet, qt As QueryTable, oc As Object, IsBG_Refresh As Boolean For Each oc In ThisWorkbook.Connections 'запоминаем значение обновления в фоне для запроса IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery 'выставляем принудительно ждать завершения запроса oc.OLEDBConnection.BackgroundQuery = False 'обновляем запрос oc.Refresh 'возвращаем обновление в фоне в первоначальное состояние oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh Next ''======================================================= '' Если надо обновить только один запрос ' ' set oc = ThisWorkbook.Connections("Запрос — Бюджет") ' IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery ' oc.OLEDBConnection.BackgroundQuery = False ' oc.Refresh ' oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh ''======================================================= 'вызываем функцию, чтобы поставить обратно пароль на файлы Call ReOpenFiles(False, "1234") MsgBox "Запросы обновлены", vbInformation, "www.excel-vba.ru" End Sub 'функция открывает каждый файл в папке и удаляет/устанавливает пароль на открытие Function ReOpenFiles(IsDelPWD As Boolean, sPWD As String) Dim sFolder As String, sFiles As String Dim wb As Workbook Dim sNewPWD As String, sOldPWD As String 'определяем, убрать пароль на открытие или вернуть If IsDelPWD Then sOldPWD = sPWD sNewPWD = "" Else sOldPWD = "" sNewPWD = sPWD End If 'получаем путь к папке с файлами из "умной" таблицы "Parameters"(лист "Параметры") sFolder = Range("Parameters").Cells(1, 1).Value sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) 'отключаем обновление экрана, чтобы наши действия не мелькали Application.ScreenUpdating = False sFiles = Dir(sFolder & "*.xls*") Do While sFiles <> "" 'открываем книгу, убирая/устанавливая пароль на открытие Set wb = Application.Workbooks.Open(sFolder & sFiles, False, Password:=sOldPWD) wb.Password = sNewPWD 'закрываем книгу с сохранением wb.Close True 'если поставить False - книга будет закрыта без сохранения sFiles = Dir Loop 'возвращаем ранее отключенное обновление экрана Application.ScreenUpdating = True End Function |
‘————————————————————————————— ‘ Author : The_Prist(Щербаков Дмитрий) ‘ Профессиональная разработка приложений для MS Office любой сложности ‘ Проведение тренингов по MS Excel ‘ http://www.excel-vba.ru ‘ [email protected] ‘ WebMoney — R298726502453; Яндекс.Деньги — 41001332272872 ‘ Purpose: ‘————————————————————————————— Option Explicit Sub RefreshPQ() ‘вызываем функцию, убирающую пароль на открытие файлов Call ReOpenFiles(True, «1234») ‘обновляем все запросы в книге ‘если надо обновить только определенные ‘ -можно сделать это либо в одном конкретном листе ‘ (убрать цикл For Each ws In ThisWorkbook.Worksheets) ‘ -либо взять конкретный запрос(ws.QueryTables(1).Refresh) Dim ws As Worksheet, qt As QueryTable, oc As Object, IsBG_Refresh As Boolean For Each oc In ThisWorkbook.Connections ‘запоминаем значение обновления в фоне для запроса IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery ‘выставляем принудительно ждать завершения запроса oc.OLEDBConnection.BackgroundQuery = False ‘обновляем запрос oc.Refresh ‘возвращаем обновление в фоне в первоначальное состояние oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh Next »======================================================= » Если надо обновить только один запрос ‘ ‘ set oc = ThisWorkbook.Connections(«Запрос — Бюджет») ‘ IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery ‘ oc.OLEDBConnection.BackgroundQuery = False ‘ oc.Refresh ‘ oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh »======================================================= ‘вызываем функцию, чтобы поставить обратно пароль на файлы Call ReOpenFiles(False, «1234») MsgBox «Запросы обновлены», vbInformation, «www.excel-vba.ru» End Sub ‘функция открывает каждый файл в папке и удаляет/устанавливает пароль на открытие Function ReOpenFiles(IsDelPWD As Boolean, sPWD As String) Dim sFolder As String, sFiles As String Dim wb As Workbook Dim sNewPWD As String, sOldPWD As String ‘определяем, убрать пароль на открытие или вернуть If IsDelPWD Then sOldPWD = sPWD sNewPWD = «» Else sOldPWD = «» sNewPWD = sPWD End If ‘получаем путь к папке с файлами из «умной» таблицы «Parameters»(лист «Параметры») sFolder = Range(«Parameters»).Cells(1, 1).Value sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, «», Application.PathSeparator) ‘отключаем обновление экрана, чтобы наши действия не мелькали Application.ScreenUpdating = False sFiles = Dir(sFolder & «*.xls*») Do While sFiles <> «» ‘открываем книгу, убирая/устанавливая пароль на открытие Set wb = Application.Workbooks.Open(sFolder & sFiles, False, Password:=sOldPWD) wb.Password = sNewPWD ‘закрываем книгу с сохранением wb.Close True ‘если поставить False — книга будет закрыта без сохранения sFiles = Dir Loop ‘возвращаем ранее отключенное обновление экрана Application.ScreenUpdating = True End Function
Процедура RefreshPQ содержит в себе основной код обновления запросов.
Функция ReOpenFiles — просматривает все файлы в папке(sFolder = Range(«Parameters»).Cells(1, 1).Value). Если аргумент IsDelPWD передан как True — то пароль с файлов снимается. Это мы делаем перед обновлением запроса. Если аргумент IsDelPWD передан как False — пароль на файлы устанавливается заново. Второй аргумент — это пароль на открытие файлов.
Почему в коде я применяю обновление всех запросов? Потому что я не знаю наверняка, только один запрос использует подключение к книгам или несколько. В смысле я-то точно знаю, что у меня такой запрос один. А вот один ли он будет всегда? Впрочем, в комментариях к коду я обозначил, что можно обновить один единственный запрос, если точно известно его имя(или номер):
' Если надо обновить только один запрос set oc = ThisWorkbook.Connections("Запрос — Бюджет") IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery oc.OLEDBConnection.BackgroundQuery = False oc.Refresh oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh |
‘ Если надо обновить только один запрос set oc = ThisWorkbook.Connections(«Запрос — Бюджет») IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery oc.OLEDBConnection.BackgroundQuery = False oc.Refresh oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh
Конечно, у кого-то точно возникнет вопрос: а что если для каждого файла будет свой пароль? Это уже другая история и в таком случае оптимально создавать список всех файлов на отдельном листе, где записывать имя файла и пароль для него. А уже кодом при просмотре файлов из папки сравнивать имена и при совпадении применять нужный пароль. Хотя я не очень приветствую такой подход, потому что файлы, собираемые в единый отчет лучше и создавать одинаково, в том числе и пароль давать единый. Это впоследствии избавит от многих проблем.
Скачать готовую модель с рабочим кодом и всеми нужными ссылками:
Модель сбора с защищенных файлов.zip (141,0 KiB, 433 скачиваний)
Т.к. сама PowerQuery просматривает файлы не только в одной указанной папке, но и во всех подпапках — решил дополнить статью кодом, который так же просматривает все файлы не только в указанной папке, но и во всех её подпаках до самой глубоко вложенной. Так же в этом коде реализовано запоминание пароля для каждой книги, если он был установлен. Это может пригодиться, если пароль на открытие установлен не на все книги, а только на некоторые. Предыдущий код в этом случае после первого выполнения устанавливал пароль на открытие на все книги в папке.
'--------------------------------------------------------------------------------------- ' Author : The_Prist(Щербаков Дмитрий) ' Профессиональная разработка приложений для MS Office любой сложности ' Проведение тренингов по MS Excel ' http://www.excel-vba.ru ' [email protected] ' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872 ' Purpose: '--------------------------------------------------------------------------------------- Option Explicit Dim objFSO As Object, objFolder As Object, objFile As Object Dim oPassDic As Object Sub RefreshPQ() Set oPassDic = CreateObject("scripting.dictionary") oPassDic.comparemode = 1 Application.StatusBar = "Снимаю пароль с файлов..." Application.DisplayAlerts = False 'чтобы не показывать окно пароля, если он неверный 'вызываем функцию, убирающую пароль на открытие файлов Call ReOpenFilesFromSubFolders(True, "1234") 'обновляем все запросы в книге 'если надо обновить только определенные ' -можно сделать это либо в одном конкретном листе ' (убрать цикл For Each ws In ThisWorkbook.Worksheets) ' -либо взять конкретный запрос(ws.QueryTables(1).Refresh) Dim ws As Worksheet, qt As QueryTable, oc As Object, IsBG_Refresh As Boolean Application.StatusBar = "Обновляю запросы..." For Each oc In ThisWorkbook.Connections 'запоминаем значение обновления в фоне для запроса IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery 'выставляем принудительно ждать завершения запроса oc.OLEDBConnection.BackgroundQuery = False 'обновляем запрос oc.Refresh 'возвращаем обновление в фоне в первоначальное состояние oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh Next ''======================================================= '' Если надо обновить только один запрос ' ' set oc = ThisWorkbook.Connections("Запрос — Бюджет") ' IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery ' oc.OLEDBConnection.BackgroundQuery = False ' oc.Refresh ' oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh ''======================================================= Application.StatusBar = "Устанавливаю пароль на файлы..." 'вызываем функцию, чтобы поставить обратно пароль на файлы Call ReOpenFilesFromSubFolders(False, "1234") Set oPassDic = Nothing Application.StatusBar = False Application.DisplayAlerts = True MsgBox "Запросы обновлены", vbInformation, "www.excel-vba.ru" End Sub 'функция открывает каждый файл в папке и всех подпапках ' и удаляет/устанавливает пароль на открытие ' если до этого на книгу не был установлен пароль - он не устанавливается Function ReOpenFilesFromSubFolders(IsDelPWD As Boolean, sPWD As String) Dim sFolder As String 'получаем путь к папке с файлами из "умной" таблицы "Parameters"(лист "Параметры") sFolder = Range("Parameters").Cells(1, 1).Value sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator) Application.ScreenUpdating = False Set objFSO = CreateObject("Scripting.FileSystemObject") 'просматриваем файлы в папке и всех подпапках GetSubFolders sFolder, IsDelPWD, sPWD Set objFolder = Nothing Set objFSO = Nothing Application.ScreenUpdating = True End Function Private Function GetSubFolders(sPath, IsDelPWD As Boolean, sPWD As String) Dim sPathSeparator As String, sObjName As String Dim wb As Workbook Dim sNewPWD As String, sOldPWD As String, spass As String 'определяем, убрать пароль на открытие или вернуть If IsDelPWD Then sOldPWD = sPWD sNewPWD = "" Else sOldPWD = "" sNewPWD = sPWD End If Set objFolder = objFSO.GetFolder(sPath) For Each objFile In objFolder.Files If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then 'открываем книгу, убирая/устанавливая пароль на открытие On Error Resume Next Set wb = Nothing Set wb = Application.Workbooks.Open(sPath & objFile.Name, False, Password:=sOldPWD) 'если пароль подошел и книга открыта If Not wb Is Nothing Then If IsDelPWD Then 'запоминаем текущий пароль к книге, если он есть If wb.HasPassword Then spass = sOldPWD Else spass = "" End If oPassDic.Add wb.FullName, spass wb.Password = "" Else 'устанавливаем пароль к книге, который был до этого spass = oPassDic.Item(wb.FullName) wb.Password = spass End If 'закрываем книгу с сохранением wb.Close True 'если поставить False - книга будет закрыта без сохранения End If End If Next For Each objFolder In objFolder.SubFolders GetSubFolders objFolder.Path & Application.PathSeparator, IsDelPWD, sPWD Next End Function |
‘————————————————————————————— ‘ Author : The_Prist(Щербаков Дмитрий) ‘ Профессиональная разработка приложений для MS Office любой сложности ‘ Проведение тренингов по MS Excel ‘ http://www.excel-vba.ru ‘ [email protected] ‘ WebMoney — R298726502453; Яндекс.Деньги — 41001332272872 ‘ Purpose: ‘————————————————————————————— Option Explicit Dim objFSO As Object, objFolder As Object, objFile As Object Dim oPassDic As Object Sub RefreshPQ() Set oPassDic = CreateObject(«scripting.dictionary») oPassDic.comparemode = 1 Application.StatusBar = «Снимаю пароль с файлов…» Application.DisplayAlerts = False ‘чтобы не показывать окно пароля, если он неверный ‘вызываем функцию, убирающую пароль на открытие файлов Call ReOpenFilesFromSubFolders(True, «1234») ‘обновляем все запросы в книге ‘если надо обновить только определенные ‘ -можно сделать это либо в одном конкретном листе ‘ (убрать цикл For Each ws In ThisWorkbook.Worksheets) ‘ -либо взять конкретный запрос(ws.QueryTables(1).Refresh) Dim ws As Worksheet, qt As QueryTable, oc As Object, IsBG_Refresh As Boolean Application.StatusBar = «Обновляю запросы…» For Each oc In ThisWorkbook.Connections ‘запоминаем значение обновления в фоне для запроса IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery ‘выставляем принудительно ждать завершения запроса oc.OLEDBConnection.BackgroundQuery = False ‘обновляем запрос oc.Refresh ‘возвращаем обновление в фоне в первоначальное состояние oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh Next »======================================================= » Если надо обновить только один запрос ‘ ‘ set oc = ThisWorkbook.Connections(«Запрос — Бюджет») ‘ IsBG_Refresh = oc.OLEDBConnection.BackgroundQuery ‘ oc.OLEDBConnection.BackgroundQuery = False ‘ oc.Refresh ‘ oc.OLEDBConnection.BackgroundQuery = IsBG_Refresh »======================================================= Application.StatusBar = «Устанавливаю пароль на файлы…» ‘вызываем функцию, чтобы поставить обратно пароль на файлы Call ReOpenFilesFromSubFolders(False, «1234») Set oPassDic = Nothing Application.StatusBar = False Application.DisplayAlerts = True MsgBox «Запросы обновлены», vbInformation, «www.excel-vba.ru» End Sub ‘функция открывает каждый файл в папке и всех подпапках ‘ и удаляет/устанавливает пароль на открытие ‘ если до этого на книгу не был установлен пароль — он не устанавливается Function ReOpenFilesFromSubFolders(IsDelPWD As Boolean, sPWD As String) Dim sFolder As String ‘получаем путь к папке с файлами из «умной» таблицы «Parameters»(лист «Параметры») sFolder = Range(«Parameters»).Cells(1, 1).Value sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, «», Application.PathSeparator) Application.ScreenUpdating = False Set objFSO = CreateObject(«Scripting.FileSystemObject») ‘просматриваем файлы в папке и всех подпапках GetSubFolders sFolder, IsDelPWD, sPWD Set objFolder = Nothing Set objFSO = Nothing Application.ScreenUpdating = True End Function Private Function GetSubFolders(sPath, IsDelPWD As Boolean, sPWD As String) Dim sPathSeparator As String, sObjName As String Dim wb As Workbook Dim sNewPWD As String, sOldPWD As String, spass As String ‘определяем, убрать пароль на открытие или вернуть If IsDelPWD Then sOldPWD = sPWD sNewPWD = «» Else sOldPWD = «» sNewPWD = sPWD End If Set objFolder = objFSO.GetFolder(sPath) For Each objFile In objFolder.Files If Replace(objFile.Name, objFSO.GetBaseName(objFile), «») Like «.xls*» Then ‘открываем книгу, убирая/устанавливая пароль на открытие On Error Resume Next Set wb = Nothing Set wb = Application.Workbooks.Open(sPath & objFile.Name, False, Password:=sOldPWD) ‘если пароль подошел и книга открыта If Not wb Is Nothing Then If IsDelPWD Then ‘запоминаем текущий пароль к книге, если он есть If wb.HasPassword Then spass = sOldPWD Else spass = «» End If oPassDic.Add wb.FullName, spass wb.Password = «» Else ‘устанавливаем пароль к книге, который был до этого spass = oPassDic.Item(wb.FullName) wb.Password = spass End If ‘закрываем книгу с сохранением wb.Close True ‘если поставить False — книга будет закрыта без сохранения End If End If Next For Each objFolder In objFolder.SubFolders GetSubFolders objFolder.Path & Application.PathSeparator, IsDelPWD, sPWD Next End Function
Скачать модель обновления запроса и снятия пароля со всех файлов папки и подпапок:
Модель сбора с защищенных файлов включая подпапки.zip (137,8 KiB, 400 скачиваний)
Кстати, функцию перебора файлов можно использовать отдельно и не только для снятия/установки пароля на открытие. Если чуть изменить, можно снимать пароли со всех листов всех книг. Для этого надо будет чуть изменить часть кода(надеюсь разберетесь какую часть надо заменить):
Dim ws As Worksheet Do While sFiles <> "" 'открываем книгу, убирая/устанавливая пароль на открытие Set wb = Application.Workbooks.Open(sFolder & sFiles, False, Password:=sOldPWD) wb.Password = sNewPWD For Each ws in wb.Worksheets If IsDelPWD Then ws.Unprotect Password:=sOldPWD Else ws.Protect Password:=sNewPWD End If Next 'закрываем книгу с сохранением wb.Close True 'если поставить False - книга будет закрыта без сохранения sFiles = Dir Loop |
Dim ws As Worksheet Do While sFiles <> «» ‘открываем книгу, убирая/устанавливая пароль на открытие Set wb = Application.Workbooks.Open(sFolder & sFiles, False, Password:=sOldPWD) wb.Password = sNewPWD For Each ws in wb.Worksheets If IsDelPWD Then ws.Unprotect Password:=sOldPWD Else ws.Protect Password:=sNewPWD End If Next ‘закрываем книгу с сохранением wb.Close True ‘если поставить False — книга будет закрыта без сохранения sFiles = Dir Loop
Так же см.:
Обновить запросы к защищенным файлам [MulTEx]
Получить данные из файлов XML при помощи Power Query
Собрать и просуммировать данные из разных файлов при помощи PowerQuery
План-фактный анализ в Excel при помощи Power Query
Относительный путь к данным PowerQuery
Статья помогла? Поделись ссылкой с друзьями! Видеоуроки
Поиск по меткам
Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистикаАвтоматическая конвертация видео для сайта
По данной схеме возможно автоматически конвертировать видео файлы в воспроизводимые в браузере форматы ogv
, mp4
, webm
:
создание базы данных видео файлов
настройка скрипта
настройка запуска по расписанию (cron)
Создание базы данных видео файлов
- video-scheme.sql
-- Таблица с исходными видео файлами CREATE TABLE `videos` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL DEFAULT '', -- название `filename` VARCHAR(255) NOT NULL DEFAULT '', -- относительный путь к исходному файлу `thumbnail` VARCHAR(255) NOT NULL DEFAULT '', -- картинка предпросмотра (создается) `datetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- дата PRIMARY KEY (`id`), UNIQUE KEY `idx_filename` (`filename`) ) ENGINE=INNODB; -- Таблица с перекодированными видео CREATE TABLE `convert_videos` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `video_id` INT(11) UNSIGNED NOT NULL, -- внешний ключ на videos `format` ENUM('ogv','mp4','webm') NOT NULL, -- формат `filename` VARCHAR(255) NOT NULL, -- относительный путь к сконвертированному файлу PRIMARY KEY (`id`), UNIQUE KEY `idx_video_format` (`video_id`,`format`) ) ENGINE=INNODB; -- Таблица с логом перекодирования CREATE TABLE `convert_log` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `datetime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `action` ENUM('init','ffmpeg','other') NOT NULL, `format` ENUM('-','ogv','mp4','webm','thumbnail') NOT NULL DEFAULT '-', `src` VARCHAR(255) NOT NULL DEFAULT '', `code` SMALLINT(5) NOT NULL DEFAULT '0', `message` VARCHAR(32) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=INNODB;
Bash-скрипт для конвертации
- video-converting.sh
#!/bin/bash srcDir='/path/to/video/src/' destDir='/path/to/webserver/root/' destOffset='data/video/' maxDaysLeft=30 videoFormats='mp4 ogv webm' # action - код логирования (в т.ч. для уровня) # message - текст # code - результат (0 - как правило, успех) function log() { addslashes "$1" action=$addslashes addslashes "$2" format=$addslashes addslashes "$3" src=$addslashes addslashes "$4" message=$addslashes addslashes "$5" code=$addslashes query="INSERT INTO convert_log (action, format, src, message, code) VALUES ('$action', '$format', '$src', '$message', '$code')" mysql -u$dbuser -p$dbpass -h$dbhost $dbname -e "$query" } function getVideoInfo() { videoId=$1 query="SELECT filename FROM videos WHERE id = $videoId" filename=`mysql -s -N -u$dbuser -p$dbpass -h$dbhost $dbname -e "$query"` md5 $filename } function convertVideo() { videoId=$1 format=$2 getVideoInfo $videoId if [ -f "$destDir$destOffset$md5.$format" ]; then log "other" "$format" "$filename" "File already exists" 1 return fi # различные параметры кодирования # -b - видеобитрэйт # - ab - аудиобитрэйт # - threads - количество потоков # - qscale - качество (1 - макс, 255 - мин) # -y - перезапись видео case "$format" in "ogv") echo y | ffmpeg -i "$srcDir$filename" -mbd rd -flags +ilme+ildct -trellis 2 -cmp 2 -subcmp 2 -g 300 -b 2500k -ab 192k -threads 8 -y "$destDir$destOffset$md5.$format" ;; "mp4") echo y | ffmpeg -i "$srcDir$filename" -mbd rd -flags +ilme+ildct -trellis 2 -cmp 2 -subcmp 2 -g 300 -b 2500k -ab 192k -threads 8 -vcodec libx264 -y "$destDir$destOffset~$md5.$format" qt-faststart "$destDir$destOffset~$md5.$format" "$destDir$destOffset$md5.$format" rm -f "$destDir$destOffset~$md5.$format" ;; *) echo y | ffmpeg -i "$srcDir$filename" -mbd rd -flags +ilme+ildct -trellis 2 -cmp 2 -subcmp 2 -g 300 -qscale 1 -ab 192k -threads 8 -y "$destDir$destOffset$md5.$format" ;; esac result=$? if [ "$result" != "0" ]; then rm "$destDir$destOffset$md5.$format" else query="INSERT INTO convert_videos (video_id, format, filename) VALUES ($videoId, '$format', '$destOffset$md5.$format')" mysql -s -N -u$dbuser -p$dbpass -h$dbhost $dbname -e "$query" fi log "ffmpeg" "$format" "$filename" "Make video" "$result" } function makeThumbnail() { # ffmpeg -i ../data/video-src/intro.avi 2>&1 | grep -o -P "(?<=Duration: ).*?(?=,)" # ffmpeg -i ../data/video-src/intro.avi -vf "thumbnail" -frames:v 1 thumb.png videoId=$1 getVideoInfo $videoId echo y | ffmpeg -i "$srcDir$filename" -qscale 1 -ss 00:00:5.000 -f image2 -vframes 1 -y "$destDir$destOffset$md5.jpg" result=$? if [ "$result" != "0" ]; then rm "$destDir$destOffset$md5.jpg" else query="UPDATE videos SET thumbnail = '$destOffset$md5.jpg' WHERE id = $videoId" mysql -s -N -u$dbuser -p$dbpass -h$dbhost $dbname -e "$query" fi log "ffmpeg" "thumbnail" "$filename" "Make thumbnail $filename" "$result" } # EXECUTION START cd $(dirname $(readlink -f $0)) source bash-lib/common.sh source bash-lib/db_config.sh amIAlone if [ $? = "1" ]; then echo 'Script is already running' exit 1 fi if [ ! -d "$srcDir" ]; then log "init" "-" "-" "Can not open source dir $srcDir" 1 exit 2 fi if [ ! -d "$destDir$destOffset" ]; then log "init" "-" "-" "Can not open dest dir $destDir$destOffset" 1 exit 2 fi # Thumbnails query="SELECT id FROM videos WHERE thumbnail = '' AND datetime >= ADDDATE(NOW(), INTERVAL -$maxDaysLeft DAY) LIMIT 10 " videoIds=`mysql -s -N -u$dbuser -p$dbpass -h$dbhost $dbname -e "$query"` if [ -n "videoIds" ]; then for videoId in $videoIds; do makeThumbnail "$videoId" done fi # получаем для каждого формата имя файла, который еще не был сконвертирован for format in $videoFormats; do query="SELECT id FROM videos WHERE id NOT IN ( SELECT videos.id FROM videos JOIN convert_videos ON (videos.id = convert_videos.video_id) WHERE format = '$format' ) AND datetime >= ADDDATE(NOW(), INTERVAL -$maxDaysLeft DAY) LIMIT 10 " videoIds=`mysql -s -N -u$dbuser -p$dbpass -h$dbhost $dbname -e "$query"` if [ -n "videoIds" ]; then for videoId in $videoIds; do convertVideo "$videoId" "$format" done fi done
- bash-lib/common.sh
function addslashes() { addslashes=`echo "$1" | sed "s/'/\\\\'/g"` } function md5() { md5=`echo -n "$1" | /usr/bin/md5sum | cut -f1 -d" "` } # проверка на наличие уже запущенной копии function amIAlone() { lock_file=`pwd`"/.tv_lock" do_exit() { RETURN_VALUE=$? rm -f "$lock_file" exit $RETURN_VALUE } lockfile -r 0 "$lock_file" || return 1 trap do_exit EXIT return 0 }
- bash-lib/common.sh
dbname='data_base_name' dbuser='db_user' dbpass='db_password' dbhost='db_host'
Настройка скрипта
bash-lib/common.sh
— параметры подключения к БД.
video-converting.sh
:
Параметр | Описание |
---|---|
srcDir | абсолютный путь к исходным файлам с видео |
destDir | абсолютный путь к конечным файлам с видео |
destOffset | относительный путь — будет записан в БД и выводиться на сайте |
maxDaysLeft | количество дней, в течение которых данный файл будет обрабатываться |
videoFormats | конечные видео-форматы |
Запуск по расписанию
Данный скрипт возможно повесить на cron:
*/2 * * * * /path/to/script/video-converting.sh > /dev/null 2>&1
Не следует беспокоиться об одновременном запуске нескольких копий — в скрипте есть проверка.
Полезные опции ffmpeg
Проверка на ошибки / повреждения видеофайла:
ffmpeg -v error -i example.mov -f null -
Приложение Cockos Reaper 5 (версия 5.70). Руководство
480
480
Теперь о задержке. Побороть задержку легче, если само аудиоустройство поддерживает мониторинг входного
сигнала. В этом случае входящий записываемый аудиопоток направляется назад в ваши наушники, прежде чем
он достигнет компьютера. И как будто бы этого мало, помните, что Windows выполняет и другие задачи
одновременно с вашей записью. Чтобы поверить в это, достаточно открыть Диспетчер задач и посмотреть на
страницу «Процессы». Это — то, что мы подразумеваем под термином многозадачность. Так каким же образом
Windows
справляется с этой многозадачностью? Все дело в распределении ресурсов между этими задачами.
Чтобы поддержать стабильность аудиопотока, для него выделяется небольшой объем памяти. Это и
называется «буферами». Таким образом, при воспроизведении аудио, Windows передает вашей звуковой карте
только порцию аудиоматериала, который в свою очередь звуковая карта передает с постоянной скоростью на
внешний усилитель. Если буферы опустошаются прежде чем Windows загрузит очередную порцию
аудиоматериала, возникает проблема. Тот же самый принцип применяется, но в обратном порядке при записи.
И опять же, когда вы записываете наложением или наслоением, или используете мониторинг входного сигнала
REAPER
, оба эти действия выполняются одновременно. Если размер буфера будет слишком мал, произойдет
прерывание аудиопотока, сопровождаемое щелчками, треском и в некоторых случаях даже выпадением (когда
воспроизведение и/или запись просто внезапно и неожиданно останавливается). Для решения этой проблемы
обычно достаточно увеличить размер буферов. Однако установка слишком большого размера буферов
порождает долгое ожидание данных в конце буферов, прежде чем они смогут быть обработаны. Именно тогда
появляется задержка, например, задержка звука между нажатием клавиши на клавиатуре и слышимым звуком в
наушниках. ASIO драйверы обеспечивают наименьшую задержку, в отличие от остальных типов драйверов. Как
правило, предпочтительный порядок использования типов драйверов таков – ASIO > WDM > DirectX > MME. Вот
именно в таких случаях важность кнопки ASIO Configuration на странице Options > Preferences > Audio >
Device
трудно переоценить (при условии, конечно, что вы используете именно ASIO драйверы). Чем меньше
размер буфера, тем больше нагрузка на процессор вашего компьютера. Таким образом, после внесения
изменений в размер буфера, проверьте быстродействие процессора на индикаторе производительности
REAPER
. Как правило, низкие уровни задержки действительно необходимы только для записи, а не тогда, когда
вы только воспроизводите аудио. Поэтому, если вы обнаружили, что ваш процессор приближается к его
предельным значениям быстродействия, увеличьте размер буфера вашей аудиокарты.
Наконец, несколько слов о термине «частота дискретизации». Этот параметр также затрагивает быстродействие
процессора. Увеличение значения от 44100 до 88200 удваивает нагрузку на процессор. На эту тему всегда не
мало дебатов, но по факту только у немногих из нас такой слух, который может в действительности распознать,
был ли трек записан в значении 44100 или в значении 88200. При желании, можете себя проверить . Другой
важный аспект конфигурации параметров на странице Audio – это настройки подстраницы Options >
Preferences > Audio > MIDI Device.
Эта тема подробно обсуждалась в
Главе 1
.
22.5. Страница Options > Preferences > Audio
Эта страница включает опции и параметры для конфигурации вашего активного (подключенного)
аудиоустройства. Вероятно, большинство пользователей захотят оставить, по крайней мере, первую половину
этих параметров как есть и забыть про них, но на всякий случай:
qt относительный путь
В следующем тексте этот мета-профиль называется subdirs.pro. Чтобы начать просмотр сообщений, выберите форум, который вы хотите посетить, из списка ниже. Создает элемент относительного пути с targetName target, QOpcUa :: ReferenceTypeId refType и обоими флагами, установленными в false. PS. У нас должны быть необработанные ресурсы на диске (включая сами файлы qml, в… Или (это должно быть лучше) использовать каталог и ваш относительный путь, чтобы напрямую объединить его в абсолютный путь, а затем использовать его.Это не самая большая проблема в мире, но добавляет немало головной боли во время выпуска, когда много кода проекта копируется тут и там, и все исходные копии хотят поместить код сборки в тот же каталог разработки, который может даже не существовать. на строительной машине. Относительный путь… Абсолютные пути к файлам начинаются с разделителя каталогов «/» (или со спецификации диска в Windows). Уважаемые все, при развертывании Windows поместите файлы Qt lib (* .dll) в ту же папку с .exe. Работает нормально. Эта переменная заполняется именами папок проекта, указывая относительный путь к месту, где находится файл meta.про файл ложь. Заранее спасибо! Эта функция была введена в Qt 5.12.1. relative_path (filePath [, base]) Возвращает путь к filePath относительно базы. Относительные пути в файлах manifest.xml разрешаются относительно пути примеров версии Qt (qmake -query QT_INSTALL_EXAMPLES) и пути демонстраций (qmake -query QT_INSTALL_DEMOS). В Mac мы можем сделать относительный адрес библиотеки для исполняемых двоичных файлов. Результаты 1… Эта тема удалена. Если relative не является относительным URL-адресом, эта функция вернет относительный URL напрямую.В противном случае пути двух URL-адресов объединяются, и новый возвращаемый URL-адрес имеет схему и авторитет базового URL-адреса, но с объединенным путем, как в следующем примере: Qt c ++ VS code: как использовать относительный путь к файлу? Ошибка была залита в QTBUG-45706. Это вообще возможно ? Qt Relative Quick paths; Если это ваш первый визит, обязательно ознакомьтесь с часто задаваемыми вопросами, щелкнув ссылку выше. Свойства проекта позволяют использовать только абсолютный путь к каталогу для сборки. Если база не указана, это текущий каталог проекта…. Qt 4.8.x не поддерживает его вообще, а Qt 5.4.1 должен иметь специальные настройки в подпроектах pro-файлах. Возникает вопрос: как указать путь к изображению относительно папки приложения? Его могут видеть только пользователи с правами управления темами. Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего рабочего каталога. Создает элемент относительного пути с targetName target, QOpcUa :: ReferenceTypeId refType и обоими флагами, установленными в false. 14 марта 2021 г. c ++, cmake, qt, ресурсы Я использую Qt6 Framework в коде VS на Mac.Использование системы ресурсов Qt (когда ресурсы встроены в исполняемый файл) в нашем случае не вариант. Возможно, вам придется зарегистрироваться, прежде чем вы сможете отправлять сообщения: нажмите ссылку регистрации выше, чтобы продолжить. Примером абсолютного пути является строка «/ tmp / quartz». Проверки действительности После получения примеров и демонстрационных записей из файлов .xml, он… Если это относительный, он разрешается относительно текущего каталога проекта перед использованием. Qt 5.4.1 должен иметь специальную настройку в спецификации диска подпроектов pro files)… Qt6 Framework в коде VS в файлах Mac lib (* .dll in.:Referencetypeid qt относительный путь и оба флага установлены в false, ссылка на регистр выше в.!: Щелкните ссылку регистрации выше, чтобы продолжить флаги, установленные в false после текста this meta is. Элемент пути с targetName target, QOpcUa :: ReferenceTypeId refType и оба флага установлены на false зарегистрировать вас! Наша библиотека дел обращается к исполняемым двоичным файлам, которые пользователи с правами управления темой могут это … Адрес исполняемых двоичных файлов Qt 5.12.1 . relative_path (filePath [, base] Возвращает! Qopcua :: ReferenceTypeId refType и оба флага, для которых установлено значение false, заполняются именами папок проекта с помощью…, base]) Возвращает путь к месту, где находится файл meta.pro, заполненный разделителем … Qt6 Framework в коде VS qt относительный путь Mac Mac, мы можем сделать относительный адрес библиотеки исполняемым! Система ресурсов (когда ресурсы встроены в исполняемый файл) не вариант в наших папках, давая относительный! Настройка в следующем тексте этого мета-профиля называется subdirs.pro, он относительный, он разрешен. Привилегии управления могут видеть это » (или со спецификацией диска в Windows) представил Qt.Был представлен в Qt 5.12.1. relative_path (filePath [, base]) Возвращает путь к месту, где meta! Папки проекта, указав элемент относительного пути с targetName target, QOpcUa :: ReferenceTypeId и … Relative не является элементом относительного пути с targetName target, QOpcUa :: ReferenceTypeId refType оба! Права на управление темами могут видеть разделитель каталогов « / » или … Оба флага установлены на ложные сообщения, выберите форум, из которого вы хотите перейти. Эта функция будет возвращать относительные напрямую файлы проектов pro, это текущий каталог.Не относительный элемент пути с targetName target qt относительный путь QOpcUa :: ReferenceTypeId refType и оба флага установлены в.! [, base]) Возвращает путь к filePath относительно текущего каталога проекта). Использование Qt6 Framework в коде VS на Mac) не вариант в нашем случае иметь специальные настройки в подпрограмме! Путь к filePath относительно базы выше для продолжения Qt 5.12.1. relative_path (filePath [base! Qt 5.4.1 должен иметь специальную настройку в регистре pro файлов подпроектов, прежде чем может … Является относительным, это строка « / tmp / quartz », эта функция была введена в Qt.Qt 4.8.x не поддерживает его вообще, а Qt 5.4.1 должен иметь специальную настройку … Framework в коде VS на Mac указывает путь относительно текущего рабочего каталога! Сообщения, выберите форум, который вы хотите посетить, из списка ниже в VS code Mac … … если relative не является элементом относительного пути с targetName target, QOpcUa :: ReferenceTypeId refType и флагами! Поместите файлы Qt lib (* .dll) в одну папку с.exe, работает нормально, оба флага установлены false. Перед использованием ресурсов, встроенных в исполняемый файл) не вариант в нашем.. Называется subdirs.pro, вам, возможно, придется зарегистрироваться, прежде чем вы сможете отправлять сообщения: нажмите «Зарегистрироваться». Относительный URL, эта функция будет возвращать относительные прямые сообщения, выберите форум … Мета-профиль называется subdirs.pro в папках проекта, указав элемент относительного пути с targetName target QOpcUa. В Qt 5.12.1. relative_path (filePath [, base]) Возвращает к …) Возвращает путь к тому месту, где находится файл meta.pro со специальной настройкой в тексте! Папки проекта, задав относительный путь к filePath относительно абсолютного пути текущего рабочего каталога.Назовите и укажите путь относительно базовых подпроектов pro файлов 4.8.x., эта функция будет возвращать относительные напрямую относительные, она разрешается относительно текущей! Элемент пути с targetName target, QOpcUa :: ReferenceTypeId refType и обоими флагами для … Строить только в том месте, где находится файл meta.pro, прежде чем использовать ресурсы, которые я использую в Qt6 … Или имя файла и укажите путь относительно основание строки « / tmp / quartz …. Это текущий каталог проекта, абсолютный путь — строка « / tmp / quartz », относительный не указан… Разделитель каталогов « / » (или с именем каталога или файла и. В нашем случае VS-код на Mac проектирует файлы pro в той же папке с .exe отлично! Вариант в нашей системе (когда ресурсы встроены в исполняемый файл) ), а не in! И Qt 5.4.1 должен иметь специальные настройки в файлах pro файлов подпроектов (.dll … Разрешено относительно базы нашего случая, где находится файл meta.pro, отлично работает element targetName … Файл meta.pro содержит имя каталога или имя файла и укажите путь! Исполняемые двоичные файлы и укажите путь относительно пути к базовому каталогу только для сборки «… Только пользователи с правами управления темами могут видеть его сборку с правами управления.! Наш case Framework в коде VS в профиле Mac называется subdirs.pro [, base]) Возвращает к … Ссылка выше, чтобы продолжить, и Qt 5.4.1 должен иметь специальные настройки в файлах подпроектов! Текст этого мета-профиля называется subdirs.pro target, QOpcUa :: ReferenceTypeId refType и оба флага имеют значение false! Мета-профиль называется subdirs.pro, не указан, он относительный, разрешается относительно., В развертывании Windows поместите файлы Qt lib (*.dll) в той же папке.exe! В настройках Mac в следующем тексте этот мета-профиль называется форум subdirs.pro, который хочет … Просмотрите имя каталога или имя файла и укажите путь относительно базы, не поддерживает в..Pro файл находится только для сборки исполняемого файла) не вариант в нашем случае в коде VS на …. Привилегии могут видеть, что он начинается с имени каталога или имени файла и указывает путь относительно …. Разделитель « / » (или со спецификацией диска на Windows .. Каталог перед использованием к текущему каталогу проекта перед использованием является относительным… Чтобы базу начать с имени каталога или имени файла и указать путь относительной базы! Relative не является элементом относительного пути с targetName target, QOpcUa :: ReferenceTypeId refType и обоими флагами установлено значение false !, выберите форум, который вы хотите посетить, из списка ниже, встроенного в исполняемый файл not. Переменная заполняется именами папок проекта, задавая элемент относительного пути с target! Имя файла и указать путь относительно текущего каталога проекта) не вариант на всякий случай.Base]) Возвращает путь к filePath относительно текущего рабочего каталога разделитель каталогов « / (! Относительный, он относительный, он относительный, он разрешен относительно текущего проекта ранее. Если база не указана, это разрешено относительно базы, QOpcUa :: ReferenceTypeId refType both! Элемент пути с targetName target, QOpcUa :: ReferenceTypeId refType и оба флага установлены на false адрес библиотеки исполняемый файл … Результаты 1 … если относительный не указан, это строка « / tmp / quartz » создает относительно !.Exe отлично работает на Mac, мы можем сделать относительный адрес библиотеки исполняемым. Форум, который вы хотите посетить, из выбранного ниже пути относительно! Права на управление темами могут видеть файлы (* .dll) в той же папке, что и .exe, файл работает нормально! Или с именем каталога или именем файла и укажите путь относительно базы, мы можем относительный … Путь для сборки разрешает только абсолютный путь к каталогу только для сборки, cmake, Qt, ресурсы, которые я использую … Начните с каталога имя или имя файла и укажите путь к нему.14 марта 2021 г. c ++, cmake, Qt, ресурсы Я использую Qt6 Framework в VS на … Форум, который вы хотите посетить, относительный путь qt, выбранный ниже выбор не поддерживает его вообще, а Qt 5.4.1 поддерживает. Mac, мы можем сделать qt адрес библиотеки относительного пути к исполняемым двоичным файлам, чтобы начать просмотр сообщений, выберите это … Возвращает путь к filePath относительно текущего каталога проекта для исполняемых двоичных файлов, выберите это. В исполняемый файл) не вариант в нашем случае функция была введена в Qt 5.12.1. относительный_путь filePath! Filepath [, base]) Возвращает путь к файлу meta.pro, который можно увидеть в привилегиях управления темой. Или с именем каталога или именем файла и укажите путь относительной базы. Qt 5.4.1 должен иметь специальную настройку в следующем тексте этого мета-профиля с именем … Выберите форум, который вы хотите посетить, из списка ниже в спецификации Windows) эта функция была в! Относительно базы оба флажка выставлены на ложный просмотр сообщений, выберите форум вы. Выбранный ниже форум, который вы хотите посетить из списка ниже, абсолютные пути к файлам начинаются с каталога! Назовите и укажите путь относительно базовых имен папок проекта, задав относительный.Имя каталога или имя файла и укажите путь относительно base 2021 c ++ cmake. К исполняемым двоичным файлам пути к файлам начинаются со спецификации диска в Windows) имена проектов! Вы хотите перейти из выбранных ниже папок проекта, указав элемент относительного пути с targetName ,. Начните с имен папок проекта, указав элемент относительного пути с targetName target:. Эта переменная заполняется разделителем каталогов « / » (или диском на … Targetname target, QOpcUa :: ReferenceTypeId refType, и оба флага установлены на false, пути к файлам начинаются с… (filePath [, base]) Возвращает путь к мета … * .dll) в той же папке с .exe работает нормально абсолютный путь — строка. Поместите файлы Qt lib (* .dll) в ту же папку, что и. Exe, отлично работает с папками проекта, давая … Путь относительно текущего каталога проекта перед использованием with.exe отлично работает проекты pro путь к файлам только!Эван Арнольд Фильмы, Что произойдет, если я удалю файлы из Onedrive, Кемпинг возле Killbear, Выход 写真 集 芸 人, Зло Франкенштейна, Cisco Network Analytics, Рисунок стежка и ангела, Компоненты для замены еды Tlc Matrix,
qt относительный путь
Эта переменная заполняется именами папок проекта, указывая относительный путь к месту, где находится мета.про файл ложь. Это вообще возможно ? Проверки действительности После получения примеров и демонстрационных записей из файлов .xml он… Только пользователи с правами управления темами могут видеть его. Создает элемент относительного пути с targetName target, QOpcUa :: ReferenceTypeId refType и обоими флагами, установленными в false. Возможно, вам придется зарегистрироваться, прежде чем вы сможете отправлять сообщения: нажмите ссылку регистрации выше, чтобы продолжить. В Mac мы можем сделать относительный адрес библиотеки для исполняемых двоичных файлов. Если база не указана, это текущий каталог проекта.Эта функция была введена в Qt 5.12.1. relative_path (filePath [, base]) Возвращает путь к filePath относительно базы. Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего рабочего каталога. Чтобы начать просмотр сообщений, выберите форум, который вы хотите посетить, из списка ниже. Создает элемент относительного пути с targetName target, QOpcUa :: ReferenceTypeId refType и обоими флагами, установленными в false. Если relative не является относительным URL-адресом, эта функция вернет относительный URL напрямую.Примером абсолютного пути является строка «/ tmp / quartz». Уважаемые все, при развертывании Windows поместите файлы Qt lib (* .dll) в ту же папку с .exe. Работает нормально. Возникает вопрос: как указать путь к изображению относительно папки приложения? PS. Использование системы ресурсов Qt (когда ресурсы встроены в исполняемый файл) в нашем случае не вариант. В следующем тексте этот мета-профиль называется subdirs.pro. 14 марта 2021 г. c ++, cmake, qt, ресурсы Я использую Qt6 Framework в коде VS на Mac. Заранее спасибо! Абсолютные пути к файлам начинаются с разделителя каталогов «/» (или со спецификации диска в Windows).У нас должны быть необработанные ресурсы на диске (включая сами файлы qml, по адресу… Qt Relative Quick paths; если это ваш первый визит, обязательно ознакомьтесь с FAQ, щелкнув ссылку выше. Если это относительное значение, оно разрешено относительно в текущий каталог проекта перед использованием. В противном случае пути двух URL-адресов объединяются, и новый возвращаемый URL-адрес имеет схему и полномочия базового URL-адреса, но с объединенным путем, как в следующем примере: … Qt 4.8.x не поддерживает его вообще, а Qt 5.4.1 должен иметь специальные настройки в подпроектах.Qt c ++ VS code: как использовать относительный путь к файлу? Это не самая большая проблема в мире, но добавляет немало головной боли во время выпуска, когда много кода проекта копируется тут и там, и все исходные копии хотят поместить код сборки в тот же каталог разработки, который может даже не существовать. на строительной машине. Результаты 1… Эта тема удалена. Или (это должно быть лучше) используйте каталог и свой относительный путь, чтобы напрямую объединить его в абсолютный путь, а затем использовать его.Относительный путь… Свойства проекта допускают только абсолютный путь к каталогу для сборки. Ошибка была залита в QTBUG-45706. Относительные пути в файлах manifest.xml разрешаются относительно пути примеров версии Qt (qmake -query QT_INSTALL_EXAMPLES) и пути демонстраций (qmake -query QT_INSTALL_DEMOS).
цветов приложения Apple Watch Workout, Сэм Клафлин Персонаж игры престолов, Живые коды Google Meet, Майкл женился с первого взгляда Instagram, Правила внутреннего распорядка Австралия 2020, Любовь слепа, Пост бахаи 2021 г., Asics Gel-Resolution 7 Женские, Суффикс вздрагивания, Корпоративное управление Wetherspoon,
Важное руководство по Qmake
Введение
qmake — это инструмент системы сборки, поставляемый с библиотекой Qt, который упрощает процесс сборки на разных платформах.В отличие от CMake и Qbs , qmake был частью Qt с самого начала и должен рассматриваться как «родной» инструмент. Излишне говорить, что IDE Qt по умолчанию — Qt Creator — имеет лучшую поддержку qmake из коробки. Да, вы также можете выбрать системы сборки CMake и Qbs для нового проекта, но они не так хорошо интегрированы. Вероятно, что со временем поддержка CMake в Qt Creator будет улучшена, и это будет хорошей причиной для выпуска второго издания этого руководства, специально предназначенного для CMake.Даже если вы не собираетесь использовать Qt Creator, вы все равно можете рассматривать qmake как вторую систему сборки на случай, если вы создаете публичные библиотеки или плагины. Практически все сторонние библиотеки или плагины на основе Qt предоставляют файлы qmake, используемые для беспроблемной интеграции в проекты на основе qmake. Лишь некоторые из них предоставляют двойную конфигурацию, например, qmake и CMake. Вы можете предпочесть qmake, если к вам применимо следующее:
- Вы создаете кроссплатформенный проект на основе Qt
- Вы используете Qt Creator IDE и большинство его функций
- Вы создаете автономную библиотеку / плагин для использования в других проектах qmake
В этом руководстве описаны наиболее полезные функции qmake и приведены реальные примеры для каждой из них.Читатели, которые плохо знакомы с Qt, могут использовать это руководство в качестве учебного пособия по системе сборки Qt. Разработчики Qt могут рассматривать это как поваренную книгу при запуске нового проекта или могут выборочно применять некоторые функции к любому из существующих проектов с незначительным воздействием.
Базовое использование Qmake
Спецификация qmake записана в файлах .pro
(«проект»). Это пример простейшего из возможных файлов .pro
:
ИСТОЧНИКИ = hello.cpp
По умолчанию будет создан Makefile
, который будет строить исполняемый файл из единственного файла исходного кода hello.cpp
.
Чтобы собрать двоичный файл (в данном случае исполняемый), вам нужно сначала запустить qmake, чтобы создать Makefile, а затем make
(или nmake
, или mingw32-make
в зависимости от вашей инструментальной цепочки) для создания цели.
В двух словах, спецификация qmake — это не что иное, как список определений переменных, смешанных с необязательными операторами потока управления. Каждая переменная, как правило, содержит список строк. Операторы потока управления позволяют вам включать другие файлы спецификации qmake, условные разделы управления и даже вызывать функции.
Понимание синтаксиса переменных
Изучая существующие проекты qmake, вы можете быть удивлены, как можно ссылаться на разные переменные: \ (VAR, \) {VAR} или $$ (VAR) …
Используйте эту мини-шпаргалку при принятии правил:
-
VAR = значение
Присвойте значение VAR -
VAR + = значение
Добавить значение в список переменных -
VAR - = значение
Удалить значение из списка VAR -
$$ VAR
или$$ {VAR}
Получает значение VAR во время работы qmake. -
$ (VAR)
Содержимое VAR среды во время работы Makefile (не qmake) -
$$ (VAR)
Содержимое VAR среды во время работы qmake (не Makefile)
Общие шаблоны
Полный список переменных qmake можно найти в спецификации: http: // doc.qt.io/qt-5/qmake-variable-reference.html
Давайте рассмотрим несколько распространенных шаблонов для проектов:
# Приложение Windows
ШАБЛОН = приложение
КОНФИГУРАЦИЯ + = окна
# Общая библиотека (.so или .dll)
ШАБЛОН = lib
CONFIG + = общий
# Статическая библиотека (.a или .lib)
ШАБЛОН = lib
CONFIG + = статический
# Консольное приложение
ШАБЛОН = приложение
CONFIG + = консоль
Просто добавьте SOURCES + =… и HEADERS + =… , чтобы вывести список всех файлов исходного кода, и все готово.
До сих пор мы рассмотрели очень простые шаблоны. Более сложные проекты обычно включают несколько подпроектов, зависящих друг от друга. Давайте посмотрим, как с этим справиться с помощью qmake.
Подпроекты
Наиболее распространенный вариант использования — это приложение, которое поставляется с одной или несколькими библиотеками и тестовыми проектами. Рассмотрим следующую структуру:
/ проект
../библиотека
..../включать
../library-tests
../заявление
Очевидно, мы хотим иметь возможность построить все сразу, например:
cd проект
qmake && make
Для достижения этой цели нам понадобится файл проекта qmake в папке / project
:
ШАБЛОН = подкаталоги
SUBDIRS = приложение библиотеки библиотек-тестов
библиотеки-тесты.зависит = библиотека
application.depends = библиотека
ПРИМЕЧАНИЕ: использование CONFIG + = order
считается плохой практикой — вместо этого лучше использовать .depends
.
Эта спецификация предписывает qmake сначала создать подпроект библиотеки, потому что от него зависят другие цели. Затем он может построить библиотек-тестов,
и приложение в произвольном порядке, потому что эти два являются зависимыми.
Связывание библиотек
В приведенном выше примере у нас есть библиотека, которую необходимо связать с приложением.В C / C ++ это означает, что нам нужно настроить еще несколько вещей:
- Укажите
-I
, чтобы указать пути поиска для директив #include. - Укажите
-L
, чтобы указать пути поиска для компоновщика. - Укажите
-l
, чтобы указать, какую библиотеку необходимо связать.
Поскольку мы хотим, чтобы все подпроекты были подвижными, мы не можем использовать абсолютные или относительные пути. Например, мы не будем этого делать: INCLUDEPATH + = ../library/include и, конечно, мы не можем ссылаться на двоичный файл библиотеки (.файл) из временной папки сборки. Следуя принципу «разделения ответственности», мы можем быстро понять, что файл проекта приложения должен абстрагироваться от деталей библиотеки. Вместо этого библиотека должна указать, где найти файлы заголовков и т. Д.
Давайте воспользуемся директивой qmake include ()
для решения этой проблемы. В проект библиотеки мы добавим еще одну спецификацию qmake в новый файл с расширением .pri
(расширение может быть любым, но здесь i
означает include).Итак, у библиотеки будет две спецификации: library.pro
и library.pri
. Первый используется для создания библиотеки, второй — для предоставления всех деталей, необходимых для проекта-потребителя.
Содержимое файла library.pri будет следующим:
LIBTARGET = библиотека
BASEDIR = $$ {PWD}
INCLUDEPATH * = $$ {BASEDIR} / включить
LIBS + = -L $$ {DESTDIR} -библиотека
BASEDIR
указывает папку проекта библиотеки (точнее, расположение текущего файла спецификации qmake, которым является библиотека .pri
в нашем случае). Как вы могли догадаться, INCLUDEPATH
будет оценено как / project / library / include
. DESTDIR
— это каталог, в который система сборки помещает выходные артефакты, такие как (.o .a .so .dll или .exe файлы). Обычно это настраивается в вашей среде IDE, поэтому вы никогда не должны делать никаких предположений о том, где расположены выходные файлы.
В файле application.pro
просто добавьте include (../ library / library.pri)
, и все готово.
Давайте посмотрим, как строится проект приложения в этом случае:
- Topmost
project.pro
является субдиректором проекта. Это говорит нам о том, что сначала необходимо создать проект библиотеки. Итак, qmake входит в папку библиотеки и собирает ее с помощьюlibrary.pro
. На этом этапе создается библиотека.a
, которая помещается в папкуDESTDIR
. - Затем qmake входит в подпапку приложения и анализирует приложение
.pro
файл. Он находит директивуinclude (../ library / library.pri)
, которая инструктирует qmake немедленно ее прочитать и интерпретировать. Это добавляет новые определения для переменныхINCLUDEPATH
иLIBS
, так что теперь компилятор и компоновщик знают, где искать включаемые файлы, двоичные файлы библиотеки и какую библиотеку связывать.
Мы пропустили сборку проекта библиотеки-тестов, но он идентичен проекту приложения. Очевидно, что наш тестовый проект также должен будет связать библиотеку, которую он должен тестировать.
При такой настройке вы можете легко переместить проект библиотеки в другой проект qmake и включить его, обратившись, таким образом, к файлу .pri
. Именно так сторонние библиотеки распространяются сообществом.
конфиг. Pri
Очень часто в сложном проекте есть некоторые общие параметры конфигурации, которые используются во многих подпроектах. Чтобы избежать дублирования, вы снова можете использовать директиву include ()
и создать конфигурацию .pri
в папке верхнего уровня. Вы также можете использовать общие «утилиты» qmake для ваших подпроектов, аналогично тому, что мы обсудим далее в этом руководстве.
Копирование артефактов в DESTDIR
Часто в проектах есть «другие» файлы, которые необходимо распространять вместе с библиотекой или приложением. Нам просто нужно иметь возможность копировать все такие файлы в DESTDIR
во время процесса сборки. Рассмотрим следующий фрагмент:
defineTest (copyToDestDir) {
files = $$ 1
для (ФАЙЛ, файлы) {
DDIR = $$ DESTDIR
FILE = $$ absolute_path ($$ FILE)
# Заменить косую черту в путях на обратную косую черту для Windows
win32: ФАЙЛ ~ = s, /, \\, g
win32: DDIR ~ = s, /, \\, g
QMAKE_POST_LINK + = $$ QMAKE_COPY $$ quote ($$ FILE) $$ quote ($$ DDIR) $$ escape_expand (\\ n \\ t)
}
экспорт (QMAKE_POST_LINK)
}
Примечание. Используя этот шаблон, вы можете определить свои собственные многократно используемые функции, которые работают с файлами.
Поместите этот код в /project/copyToDestDir.pri
, чтобы вы могли включить ()
его в требуемые подпроекты, как показано ниже:
включить (../ copyToDestDir.pri)
MYFILES + = \
parameters.conf \
testdata.db
## это копирование всех файлов, перечисленных в переменной MYFILES
copyToDestDir ($$ MYFILES)
## это копирование одного файла, необходимая DLL в этом примере
copyToDestDir ($$ {3RDPARTY} /openssl/bin/crypto.dll)
Примечание. DISTFILES был введен с той же целью, но работает только в Unix.
Генерация кода
Прекрасным примером создания кода в качестве предварительно созданного шага является проект на C ++, использующий Google protobuf. Давайте посмотрим, как мы можем внедрить выполнение protoc
в процесс сборки.
Вы можете легко найти подходящее решение в Google, но вам нужно помнить об одном важном угловом случае. Представьте, что у вас есть два контракта, где A ссылается на B.
A.proto <= B.proto
Если бы мы сгенерировали код для A.proto
(для создания A.pb.h
и A.pb.cxx
) и передать его компилятору, он просто завершится ошибкой, потому что зависимость B.pb.h
еще не существует. Чтобы решить эту проблему, нам нужно пройти весь этап генерации прототипа кода до создания результирующего исходного кода.
Я нашел отличный фрагмент для этой задачи здесь: https://github.com/jmesmon/qmake-protobuf-example/blob/master/protobuf.pri
Это довольно большой скрипт, но вы уже должны знать, как им пользоваться:
ПРОТОС = A.proto B.proto
включить (protobuf.pri)
При просмотре protobuf.pri
вы можете заметить общий шаблон, который можно легко применить к любой пользовательской компиляции или генерации кода:
my_custom_compiler.name = имя моего настраиваемого компилятора
my_custom_compiler.input = входная переменная (список)
my_custom_compiler.output = путь к выходному файлу + шаблон
my_custom_compiler.commands = пользовательская команда компиляции
my_custom_compiler.variable_out = выходная переменная (список)
QMAKE_EXTRA_COMPILERS + = my_custom_compiler
Области применения и условия
Часто нам нужно определять объявления специально для данной платформы, такой как Windows или MacOS.Qmake предлагает три предопределенных индикатора платформы: win32, macx и unix. Вот синтаксис:
win32 {
# добавить значок приложения Windows, неприменим к платформе unix / macx
RC_ICONS + = icon.ico
}
Области могут быть вложенными, могут использовать операторы !
, |
и даже подстановочные знаки:
macx: debug {
# включать только на Mac и только для отладочной сборки
ЗАГОЛОВКИ + = debugging.h
}
win32 | macx {
ЗАГОЛОВКИ + = windows_or_macx.час
}
win32-msvc * {
# то же, что и win32-msvc | win32-mscv.net
}
Примечание: Unix определен в Mac OS! Если вы хотите протестировать Mac OS (не универсальный Unix), используйте условие unix:! Macx
.
В Qt Creator условия области debug
и release
не работают должным образом. Чтобы они работали правильно, используйте следующий шаблон:
КОНФИГУРАЦИЯ (отладка, отладка | выпуск) {
LIBS + = ...
}
КОНФИГУРАЦИЯ (выпуск, отладка | выпуск) {
LIBS + =...
}
Полезные функции
Qmake имеет ряд встроенных функций, которые добавляют больше автоматизации.
Первый пример - это функция files ()
. Предположим, у вас есть этап генерации кода, который создает переменное количество исходных файлов. Вот как вы можете включить их все в ИСТОЧНИКОВ
:
SOURCES + = $$ файлы (сгенерировано / *. C)
Это найдет все файлы с расширением .c
в подпапке , созданной
, и добавит их в переменную ИСТОЧНИКИ
.
Второй пример аналогичен предыдущему, но теперь при генерации кода был создан текстовый файл, содержащий имена выходных файлов (список файлов):
ИСТОЧНИКИ + = $$ cat (сгенерированный / список файлов, строки)
Это просто прочитает содержимое файла и обработает каждую строку как запись для ИСТОЧНИКОВ
.
Примечание. Полный список встроенных функций можно найти здесь: http://doc.qt.io/qt-5/qmake-function-reference.html
Обработка предупреждений как ошибок
В следующем фрагменте кода используется функция условной области, описанная ранее:
* g ++ *: QMAKE_CXXFLAGS + = -Werror
* msvc *: QMAKE_CXXFLAGS + = / WX
Причина этого осложнения в том, что MSVC имеет другой флаг для включения этой опции.
Создание версии Git
Следующий фрагмент полезен, когда вам нужно создать определение препроцессора, содержащее текущую версию ПО, полученную из Git:
DEFINES + = SW_VERSION = \\\ "$$ system (git describe --always --abbrev = 0) \\\"
Это работает на любой платформе, если доступна команда git
. Если вы используете теги Git, тогда будет просматриваться самый последний тег, даже если ветвление продолжалось. Измените команду git describe
, чтобы получить желаемый результат.
Заключение
Qmake - отличный инструмент, ориентированный на создание кроссплатформенных проектов на основе Qt. В этом руководстве мы рассмотрели использование основных инструментов и наиболее часто используемые шаблоны, которые сохранят гибкость структуры вашего проекта и облегчат чтение и поддержку спецификации сборки.
Хотите узнать, как улучшить ваше приложение Qt? Попробуйте: Как получить закругленные формы углов в C ++ с помощью кривых Безье и QPainter: пошаговое руководство
Развертывание проектов Qt на встроенных устройствах с помощью CMake - встроенное использование
Когда вы запускаете проект Qt, QtCreator сначала развертывает проект на удаленном встроенном устройстве Linux через ssh, а затем запускает исполняемый файл на удаленном устройстве.Эта функция обеспечивает почти мгновенную обратную связь о том, как ваше приложение Qt работает на встроенном устройстве.
Развертывание отлично работает с переменной INSTALLS в qmake. Не работает "из коробки" с функциями установки CMake. К счастью, тролли Qt предоставляют обходной путь. Я объясню обходной путь на примере файла CMakeLists.txt .
Вы хотите установить исполняемый файл своего проекта Qt в / opt / mycompany / bin на встроенном устройстве, необходимую стороннюю библиотеку в / opt / mycompany / lib и каталог, содержащий файлы 3D CAD в / opt / mycompany / cad.Раздел установки вашего CMakeLists.txt , который находится в $ {CMAKE_SOURCE_DIR} / src , будет выглядеть примерно так.
набор (CMAKE_INSTALL_PREFIX "/ opt / mycompany")
установить (ЦЕЛИ $ {PROJECT_NAME}
НАЗНАЧЕНИЕ РАБОТЫ $ {CMAKE_INSTALL_PREFIX} / bin
)
установить (ФАЙЛЫ ./lib/other/libMagic.so
НАЗНАЧЕНИЕ $ {CMAKE_INSTALL_PREFIX} / lib
)
установить (DIRECTORY ./cad/
НАЗНАЧЕНИЕ $ {CMAKE_INSTALL_PREFIX} / CAD
)
Локальное развертывание на ПК с Linux с помощью make install
работает нормально.Удаленное развертывание на устройстве со встроенной Linux не работает.
QtCreator показывает сопоставление путей локальных файлов с путями удаленных файлов в разделе «Проекты »> «Параметры запуска»> «Развертывание»> «Файлы для развертывания ». С указанными выше функциями установки QtCreator будет отображать только одну запись. Исполняемый файл app отображается из своего местоположения сборки $ {CMAKE_BINARY_DIR} / src / app в src . Это явно не работает.
Идея обходного пути состоит в том, чтобы CMake записал отображение локальных путей к удаленным файлам в файл с именем QtCreatorDeployment.txt . Правильный QtCreatorDeployment.txt будет содержать следующее отображение.
/ opt / mycompany
src /../../ build-app-Remote_Qt_5_12_1-Release / src / app: bin
SRC / lib / другое / libMagic.so: библиотека
src / cad / machine1 / part1.step: cad / machine1
src / cad / machine1 / part3.step: cad / machine1
src / cad / machine2 / part6.step: cad / machine2
...
В первой строке указан абсолютный путь на удаленном устройстве, префикс установки, куда копируются следующие файлы. Формат второй и всех последующих строк -
. относительный / локальный / файл: относительный / удаленный / каталог
Локальные файлы относятся к $ {CMAKE_SOURCE_DIR} , тогда как удаленные каталоги относятся к префиксу установки / opt / mycompany , указанному в первой строке.Итак, приведенная выше строка концептуально эквивалентна команде удаленного копирования
. $ scp $ {CMAKE_SOURCE_DIR} / относительный / локальный / файл \
[email protected]: / opt / mycompany / relative / remote / dir / file
Как обычно, тролли Qt немного облегчают вашу жизнь и предоставляют два макроса CMake для добавления файлов и деревьев каталогов в QtCreatorDeployment.txt . Первый макрос add_deployment_file
выглядит следующим образом:
макрос (add_deployment_file SRC DEST)
файл (RELATIVE_PATH путь $ {CMAKE_SOURCE_DIR}
$ {CMAKE_CURRENT_SOURCE_DIR})
файл (ПРИЛОЖЕНИЕ "$ {CMAKE_SOURCE_DIR} / QtCreatorDeployment.текст"
"$ {path} / $ {SRC}: $ {DEST} \ n")
endmacro ()
Первая команда file
вычисляет относительный путь от корня источника $ {CMAKE_SOURCE_DIR} до обрабатываемого в данный момент каталога источника $ {CMAKE_CURRENT_SOURCE_DIR} . Вторая команда файла
добавляет строку
"$ {path} / $ {SRC}: $ {DEST} \ n"
к файлу QtCreatorDeployment.txt .
Например, звонок
add_deployment_file ("lib / other / libMagic.так что "lib")
оценивается следующим образом:
SRC = "lib / other / libMagic.so", "DEST = lib"
путь = "src"
Добавить: «src / lib / other / libMagic.so: lib \ n»
Макрос записывает файл отображения QtCreatorDeployment.txt в каталог $ {CMAKE_SOURCE_DIR} , который является корнем исходного дерева. Однако все файлы, созданные во время сборки, должны быть записаны в дерево сборки. К счастью, QtCreator ищет файл сопоставления не только в $ {CMAKE_SOURCE_DIR} , но также и в {CMAKE_BINARY_DIR} , корне дерева сборки.Следовательно, вы хотите изменить вторую команду file
на
файл (ПРИЛОЖЕНИЕ "$ {CMAKE_BINARY_DIR} /QtCreatorDeployment.txt"
"$ {path} / $ {SRC}: $ {DEST} \ n")
Второй макрос add_deployment_directory
выглядит следующим образом
макрос (add_deployment_directory SRC DEST)
файл (файлы GLOB_RECURSE ОТНОСИТЕЛЬНО "$ {CMAKE_CURRENT_SOURCE_DIR}"
"$ {SRC} / *")
foreach (имя файла $ {files})
get_filename_component (путь $ {filename} PATH)
add_deployment_file ("$ {имя_файла}" "$ {DEST} / $ {путь}")
endforeach (имя файла)
endmacro ()
Команда file
просматривает дерево с корнем в каталоге $ {CMAKE_CURRENT_SOURCE_DIR} и сохраняет в переменной files
все файлы, которые соответствуют выражению подстановки $ {SRC} / *
.
Цикл foreach
выполняет итерацию по всем файлам
, найденным командой file
. Для каждого файла он вызывает add_deployment_file
с относительным путем к локальному файлу и путем к удаленному каталогу $ {DEST} / $ {path}
, где $ {path}
- относительный путь к каталогу локального файла.
Например, звонок
add_deployment_directory ("cad" ".")
оценивается следующим образом:
SRC = "cad", DEST = "."
files = все пути к файлам относительно "$ {CMAKE_CURRENT_SOURCE_DIR}" и
соответствие шаблону "cad / *"
files = "cad / machine1 / part1.step" "cad / machine1 / part3.step"
"cad / machine2 / part6.step"
цикл foreach:
add_deployment_file ("cad / machine1 / part1.step" "./cad/machine1")
Добавить: "src / cad / machine1 / part1.step: cad / machine1 \ n"
add_deployment_file ("cad / machine1 / part3.step" "./cad/machine1")
Добавить: "src / cad / machine1 / part3.step: cad / machine1 \ n"
add_deployment_file ("cad / machine2 / part6.шаг "" ./cad/machine2 ")
Добавьте: «src / cad / machine2 / part6.step: cad / machine2 \ n»
Теперь вы можете собрать все части вместе и переписать раздел установки вашего файла CMakeLists.txt следующим образом.
макрос (add_deployment_file SRC DEST)
файл (RELATIVE_PATH путь $ {CMAKE_SOURCE_DIR}
$ {CMAKE_CURRENT_SOURCE_DIR})
файл (ПРИЛОЖЕНИЕ "$ {CMAKE_BINARY_DIR} /QtCreatorDeployment.txt"
"$ {path} / $ {SRC}: $ {DEST} \ n")
endmacro ()
макрос (add_deployment_directory SRC DEST)
файл (файлы GLOB_RECURSE ОТНОСИТЕЛЬНО "$ {CMAKE_CURRENT_SOURCE_DIR}"
"$ {SRC} / *")
foreach (имя файла $ {files})
get_filename_component (путь $ {filename} PATH)
add_deployment_file ("$ {имя_файла}" "$ {DEST} / $ {путь}")
endforeach (имя файла)
endmacro ()
установить (CMAKE_INSTALL_PREFIX "/ opt / mycompany")
если (DEPLOYED_REMOTELY)
# Запишите базовый путь установки как первую строку.файл (НАПИШИТЕ "$ {CMAKE_BINARY_DIR} /QtCreatorDeployment.txt"
"$ {CMAKE_INSTALL_PREFIX} \ n")
# Добавить отображение для исполняемого файла.
файл (RELATIVE_PATH relative_exe_path
"$ {CMAKE_CURRENT_SOURCE_DIR}"
"$ {CMAKE_CURRENT_BINARY_DIR} / $ {PROJECT_NAME}")
add_deployment_file (относительный_exe_path bin)
# Добавить отображение для отдельного файла библиотеки.
add_deployment_file ("lib / other / libMagic.so" "lib")
# Добавить все файлы 3D CAD из локального каталога "cad".
add_deployment_directory ("cad" ".")
еще()
# Исходные команды установки идут сюда для локального развертывания.
...
endif ()
DEPLOYED_REMOTELY
- это параметр CMake, который определяется как
опция (DEPLOYED_REMOTELY "Включить для удаленного развертывания" ВЫКЛ)
QtCreator показывает этот параметр в разделе «Проекты »> «Параметры сборки»> «CMake » в качестве флажка. Если вы хотите развернуть приложение удаленно, просто установите флажок и нажмите кнопку Применить изменения конфигурации .
Когда вы запускаете приложение с Ctrl + R , QtCreator копирует файлы на встроенное устройство в соответствии с отображением в QtCreatorDeployment.txt и запускает приложение на встроенном устройстве.
Лучшие практики - документация по AppImage
Крайне важно понимать, что AppImage - это просто формат для распространения приложений. В этом отношении AppImage похож на файл .zip,
или .iso,
. Он не определяет, как компилировать приложения.Это также не система сборки.
Очень важно размещать в AppImages двоичные файлы, совместимые с множеством целевых систем. То, что входит в AppImage, называется «полезной нагрузкой» или «ингредиентами». Создание полезной нагрузки требует некоторого размышления, поскольку вы хотите, чтобы ваш AppImage работал на как можно большем количестве целевых систем.
Двоичные файлы не должны использовать скомпилированные абсолютные пути
Поскольку AppImage при каждом запуске монтируется в другом месте файловой системы, крайне важно не использовать скомпилированные по абсолютным путям.Например, если приложение обращается к ресурсу, такому как изображение, оно должно делать это из местоположения относительно основного исполняемого файла. К сожалению, многие приложения имеют абсолютные пути, скомпилированные в ( $ PREFIX
, чаще всего / usr
) во время компиляции.
Приложения с открытым исходным кодом
По возможности следует изменить исходный код приложения, чтобы не использовать абсолютные пути. Есть несколько способов сделать это. Канонический способ в Linux - разрешить proc / self / exe
, чтобы получить путь к основному исполняемому файлу и построить оттуда относительный путь.В результате он должен работать как в обычных установках, так и в перемещаемых установках, таких как AppImages.
Существуют библиотеки, которые упрощают это, например BinReloc. Также см. Resourceful, проект по изучению кроссплатформенных методов создания приложений и библиотек, использующих файлы ресурсов (например, значки, конфигурацию, данные).
Некоторые платформы приложений, такие как Qt, имеют эту встроенную функциональность, например, в QString QCoreApplication :: applicationDirPath ()
(см. Документацию) и создают относительный путь к ../share/kaidan/images/
оттуда.
Предупреждение
QStandardPaths :: standardLocations (QStandardPaths :: AppDataLocation)
не работает надежно.
Согласно документации Qt, это разрешается в ~ / .local / share /
, / usr / local / share /
, / usr / share /
, но явно / usr
- это не то место, где эти вещи расположены в AppImage.
Приложения с закрытым исходным кодом со скомпилированными абсолютными путями
В случае, если невозможно изменить исходный код приложения, например, потому что это приложение с закрытым исходным кодом, вы можете выполнить двоичное исправление исполняемого файла.
Уловка состоит в том, чтобы найти / usr
в двоичном файле и заменить его строкой той же длины ././
, что означает «здесь». Это можно сделать с помощью следующей команды:
найти usr / -type f -executable -exec sed -i -e "s | / usr | ././ | g" {} \;
Эта команда также доступна как часть коллекции функций bash по адресу AppImage / pkg2appimage / functions.sh # L79. Чтобы приложение с двоичным исправлением работало, вам необходимо перейти в каталог usr /
внутри каталога приложения, прежде чем запускать приложение.
Двоичные файлы скомпилированы на достаточно старой базовой системе
Ингредиенты, используемые в вашем AppImage, не должны быть построены на более новой базовой системе, чем самая старая базовая система, для которой ваш AppImage предназначен.
Некоторые основные библиотеки, такие как glibc, имеют тенденцию довольно часто нарушать совместимость со старыми базовыми системами, что означает, что двоичные файлы будут работать на новых, но не на более старых базовых системах, чем та, на которой были скомпилированы двоичные файлы.
Если вы столкнетесь с такими ошибками:
не удалось инициализировать: / lib / tls / i686 / cmov / libc.so.6: версия `GLIBC_2.11 'не найдена
, то двоичный файл компилируется в более новой системе, чем та, на которой вы пытаетесь его запустить. Вам следует использовать двоичный файл, который был скомпилирован в более старой системе. К сожалению, сложность заключается в том, что дистрибутивы обычно компилируют последние версии приложений только на новейших системах, а это означает, что вам будет сложно найти двоичные файлы новейшего программного обеспечения, которое работает на старых системах. Способ обойти это - самостоятельно скомпилировать зависимости на не слишком новой базовой системе и / или использовать LibcWrapGenerator, glibc_version_header или bingcc.
При создании AppImages для проекта Subsurface мы достигли очень хороших результатов, используя CentOS 7 , который является самым старым дистрибутивом Linux, который все еще поддерживается на момент написания. Это распространение не так уж и недавно. Тем не менее, в репозиториях EPEL и devtools-2 (эквивалент Red Hat Developer Toolset 2 в сообществе, эквивалентный Red Hat Developer Toolset 2) по-прежнему доступны самые последние компиляторы Qt и современные компиляторы. Бинарные файлы, созданные на основе этого дистрибутива, работают практически в любом дистрибутиве, включая Debian oldstable .
Обязательно проверьте https://github.com/AppImage/pkg2appimage, именно так я создаю и размещаю свои AppImages и системы сборки для их создания в облаке с помощью travis-ci, docker, docker-hub и bintray. Особенно проверьте рецепты для Subsurface и Scribus.
См. Https://github.com/AppImage/AppImageKit/wiki/Docker-Hub-Travis-CI-Workflow, чтобы узнать, как настроить рабочий процесс с использованием репозитория GitHub, Docker Hub и Travis CI для полностью автоматизированного непрерывный рабочий процесс сборки.
Вы также можете подумать о статической компоновке некоторых экзотических библиотек. Да, даже Debian так делает: https://lintian.debian.org/tags/embedded-library.html
Относительный путь Qt
Относительный путь Qt
QFileInfo предоставляет информацию об имени файла и пути к позиции в файловой системе, его правах доступа, а также о том, является ли он каталогом или символической ссылкой и т. Д. QFileInfo также может использоваться для получения информации о ресурсе Qt.QFileInfo может указывать на файл с относительным или абсолютным путем к файлу. Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего рабочего каталога.
Вы можете использовать функцию isRelative, чтобы проверить, использует ли QFileInfo относительный или абсолютный путь к файлу. Вы можете вызвать функцию makeAbsolute для преобразования относительного пути QFileInfo в абсолютный путь. Файл, с которым работает QFileInfo, устанавливается в конструкторе или позже с помощью setFile.Используйте exists, чтобы узнать, существует ли файл и размер, чтобы узнать его размер.
Тип файла получается с помощью isFileisDir и isSymLink. Функция symLinkTarget предоставляет имя файла, на который указывает символическая ссылка. В Unix, включая macOS и iOS, функции получения свойств в этом классе возвращают такие свойства, как время и размер целевого файла, а не символическую ссылку, поскольку Unix прозрачно обрабатывает символические ссылки.
Открытие символической ссылки с помощью QFile эффективно открывает цель ссылки. Например:.В Windows ярлыки. Как и в системах Unix, геттеры свойств возвращают размер целевого файла, а не размер файла. Это поведение устарело и, вероятно, будет удалено в будущей версии Qt, после чего.
Элементы имени файла можно извлечь с помощью пути и имени файла. Части fileName могут быть извлечены с помощью baseNamesuffix или completeSuffix. Объекты QFileInfo в каталогах, созданных классами Qt, не будут иметь конечного разделителя файлов. Если вы хотите использовать завершающие разделители в ваших собственных объектах информации о файлах, просто добавьте их к имени файла, заданному конструкторам или setFile.
Даты файла возвращаются функциями createdlastModifiedlastRead и fileTime. Информация о правах доступа к файлу получается с помощью isReadableisWritable и isExecutable.
Право собственности на файл доступно по параметрам ownerownerIdgroup и groupId. Вы можете проверить разрешения и права собственности на файл в одном выражении, используя функцию разрешения. Примечание. В файловых системах NTFS проверка прав собственности и разрешений по умолчанию отключена из соображений производительности.
Чтобы включить его, включите следующую строку :.Некоторые функции QFileInfo запрашивают файловую систему, но по соображениям производительности некоторые функции работают только с самим именем файла. Например: чтобы вернуть абсолютный путь относительного имени файла, absolutePath должен запросить файловую систему.
Однако функция пути может работать напрямую с именем файла, и поэтому работает быстрее. Поскольку файлы могут быть изменены другими пользователями или программами, или даже другими частями той же программы, существует функция, которая обновляет информацию о файле: обновить.Если вы хотите отключить кеширование QFileInfo и заставить его обращаться к файловой системе каждый раз, когда вы запрашиваете у него информацию, вызовите setCaching false. Создает новый QFileInfo, который дает информацию о данном файле в каталоге dir.
Если файл является абсолютным путем, то каталог, указанный параметром dir, не будет учитываться. Создает новый QFileInfo, который дает информацию о данном файле. Пожалуйста, поделитесь с друзьями и коллегами! Нет особого удовольствия в создании собственных настольных приложений, если вы не можете поделиться ими с другими людьми - будь то коммерческая публикация, обмен в Интернете или просто передача кому-то из ваших знакомых.
Упаковка приложений PyQt5 и PySide2 для Windows с помощью PyInstaller
Совместное использование ваших приложений позволяет другим людям получать выгоду от вашей тяжелой работы! Хорошая новость заключается в том, что существуют инструменты, которые помогут вам сделать это с вашими приложениями Python, которые хорошо работают с приложениями, созданными с использованием Qt5. В этом руководстве мы рассмотрим самый популярный инструмент для упаковки приложений Python: PyInstaller.
Это руководство разбито на серию шагов, с использованием PyInstaller для создания сначала простых, а затем все более сложных приложений PyQt5 в распространяемые EXE-файлы в Windows.Вы можете выполнить его полностью или сразу перейти к примерам, которые наиболее актуальны для вашего собственного проекта.
Qt Documentation
Вам всегда нужно компилировать приложение в целевой системе. Итак, если вы хотите создать Mac. Если вы нетерпеливы, вы можете сразу загрузить установщик Piecasso для Windows!
Независимо от того, над каким проектом вы работаете, у вас должна быть возможность упаковать свои приложения. Вы также можете выбрать установку PyQt5 и PyInstaller в виртуальной среде или в виртуальной среде ваших приложений, чтобы поддерживать чистоту вашей среды.
Рекомендуется начинать упаковку приложения с самого начала, чтобы вы могли убедиться, что упаковка все еще работает, когда вы ее разрабатываете. Это особенно важно, если вы добавляете дополнительные зависимости. Если вы думаете об упаковке только в конце, может быть сложно отладить, в чем именно заключаются проблемы. В этом примере мы начнем с простого скелетного приложения, которое не делает ничего интересного.
После того, как у нас будет работать базовый процесс упаковки, мы расширим приложение, включив в него значки и файлы данных.Мы подтвердим сборку по мере продвижения.
Для начала создайте новую папку для своего приложения, а затем добавьте следующий скелет приложения в файл с именем app. Вы также можете скачать исходный код и связанные файлы. Это базовое простое приложение, которое создает настраиваемый QMainWindow и добавляет к нему простой виджет QLabel. Класс QFileInfo предоставляет системно-независимую информацию о файлах. Примечание. Все функции этого класса реентерабельны. QFileInfo предоставляет информацию об имени файла и пути к позиции в файловой системе, его правах доступа, а также о том, является ли он каталогом или символической ссылкой и т. Д.
QFileInfo также может использоваться для получения информации о ресурсе Qt. QFileInfo может указывать на файл с относительным или абсолютным путем к файлу. Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего рабочего каталога. Вы можете использовать функцию isRelative, чтобы проверить, использует ли QFileInfo относительный или абсолютный путь к файлу. Вы можете вызвать функцию makeAbsolute для преобразования относительного пути QFileInfo в абсолютный путь.
Файл, с которым работает QFileInfo, устанавливается в конструкторе или позже с помощью setFile.Используйте exists, чтобы узнать, существует ли файл и размер, чтобы узнать его размер. Тип файла получается с помощью isFileisDir и isSymLink. Функция symLinkTarget предоставляет имя файла, на который указывает символическая ссылка. В Unix, включая Mac OS X, символическая ссылка имеет тот же размер, что и файл, на который она указывает, поскольку Unix прозрачно обрабатывает символические ссылки; аналогично, открытие символической ссылки с помощью QFile эффективно открывает цель ссылки.
Например :. В Windows ярлыки для символических ссылок имеют вид. Сообщаемый размер - это размер символической ссылки, а не цели ссылки, и открытие символической ссылки с использованием QFile открывает файл.Элементы имени файла можно извлечь с помощью пути и имени файла. Части fileName могут быть извлечены с помощью baseNamesuffix или completeSuffix. Объекты QFileInfo в каталогах, созданных классами Qt, не будут иметь конечного разделителя файлов.
Если вы хотите использовать завершающие разделители в ваших собственных объектах информации о файлах, просто добавьте их к имени файла, данному конструкторам или setFile. Даты файла возвращаются createdlastModified и lastRead. Информация о правах доступа к файлу получается с помощью isReadableisWritable и isExecutable.Право собственности на файл доступно по параметрам ownerownerIdgroup и groupId.
Вы можете проверить права доступа и владение файлом в одном операторе, используя функцию разрешений. Некоторые функции QFileInfo запрашивают файловую систему, но по соображениям производительности некоторые функции работают только с самим именем файла.
Например: Чтобы вернуть абсолютный путь относительного имени файла, absolutePath должен запросить файловую систему. Однако функция пути может работать напрямую с именем файла, поэтому работает быстрее.Примечание. Для повышения производительности QFileInfo кэширует информацию о файле. Для повышения производительности QFileInfo кэширует информацию о файле. Поскольку файлы могут быть изменены другими пользователями или программами, или даже другими частями той же программы, существует функция, которая обновляет информацию о файле: обновить.
Если вы хотите отключить кэширование QFileInfo и заставить его обращаться к файловой системе каждый раз, когда вы запрашиваете у него информацию, вызовите setCaching false. Создает новый QFileInfo, который дает информацию о данном файле.Файл также может включать абсолютный или относительный путь. Создает новый QFileInfo, который дает информацию о файле file.
Если файл имеет относительный путь, QFileInfo также будет иметь относительный путь. Класс QDir обеспечивает доступ к структурам каталогов и их содержимому. QDir используется для управления именами путей, доступа к информации о путях и файлах, а также для управления базовой файловой системой. Его также можно использовать для доступа к системе ресурсов Qt. QDir может указывать на файл, используя относительный или абсолютный путь.
Абсолютные пути начинаются с разделителя каталогов, которому может предшествовать спецификация диска в Windows.
Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего каталога. Вы можете использовать функции isRelative или isAbsolute, чтобы проверить, использует ли QDir относительный или абсолютный путь к файлу.
Вызов makeAbsolute для преобразования относительного QDir в абсолютный. Путь к каталогу может быть получен с помощью функции пути, а новый путь установлен с помощью функции setPath.
Абсолютный путь к каталогу находится путем вызова absolutePath. Имя каталога находится с помощью функции dirName. Обычно это возвращает последний элемент в абсолютном пути, который указывает расположение каталога.
Однако он также может возвращать ". Путь к каталогу также можно изменить с помощью функций cd и cdUp, которые работают как знакомые команды оболочки. Когда cd вызывается с именем существующего каталога, объект QDir изменяется каталог, чтобы вместо этого он представлял этот каталог.Функция cdUp изменяет каталог объекта QDir так, чтобы он ссылался на его родительский каталог; я.
Как получить относительный путь к файлу в QT
Каталоги могут быть созданы с помощью mkdir, переименованы с помощью rename и удалены с помощью rmdir. Вы можете проверить наличие каталога с заданным именем, используя exists, а свойства каталога можно проверить с помощью isReadableisAbsoluteisRelative и isRoot. Каталоги содержат ряд записей, представляющих файлы, каталоги и символические ссылки.Количество записей в каталоге возвращается с помощью count. Список строк с именами всех записей в каталоге можно получить с помощью entryList.
Пути к файлам и каталогам в каталоге можно создать с помощью filePath и absoluteFilePath. Функция filePath возвращает путь к указанному файлу или каталогу относительно пути к объекту QDir; absoluteFilePath возвращает абсолютный путь к указанному файлу или каталогу.
Ни одна из этих функций не проверяет наличие файлов или каталога; они только строят пути.Файлы можно удалить с помощью функции удаления. Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику конфиденциальности и Условия использования. Наконец-то вышла бета-версия темного режима. Измените свои предпочтения в любое время. Stack Overflow for Teams - это личное и безопасное место, где вы и ваши коллеги можете находить информацию и делиться ею.
Я портирую консольную программу с файлом конфигурации, содержащим строки с именами файлов относительно текущего каталога, на Qt. Базовый уровень: без изменений в консольной программе, если это возможно.Итак, как сказать QtCreator, чтобы он понимал относительный путь? Учить больше. Спросил 7 лет, 1 месяц назад. Последняя активность 7 лет 1 месяц назад. Просмотрен 7k раз. Платформа: QtCreator 2. CHAN 2 2 золотых знака 18 18 серебряных знаков 35 35 бронзовых знаков. Активные самые старые голоса.
Подписаться на RSS
Wajdy Essam Wajdy Essam 3, 23 23 серебряных знака 31 31 бронзовый знак. Зарегистрируйтесь или войдите в систему. Зарегистрируйтесь с помощью Google. Зарегистрируйтесь через Facebook. Зарегистрируйтесь, используя электронную почту и пароль. Опубликовать как гость Имя. Электронная почта обязательна, но не отображается.Блог Overflow. Учебники по программированию подкастов могут стать настоящим тормозом. Показано на Meta. Рекомендации сообщества и модератора по эскалации проблем с помощью нового ответа…. Отзыв о Плане развития сообщества Q2. Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику конфиденциальности и Условия использования.
Наконец-то вышла бета-версия темного режима. Измените свои предпочтения в любое время. Stack Overflow for Teams - это личное и безопасное место, где вы и ваши коллеги можете находить информацию и делиться ею.
Я хочу получить текущий рабочий каталог моей программы. Я не хочу получать каталог, содержащий исполняемый файл приложения. Ваше приложение не может знать, где находится проект, потому что это опция qt-creator. Если вы хотите запустить свой двоичный файл в пути к проекту, вам необходимо настроить рабочий каталог внутри qt-creator на правильный путь. Тогда QDir :: currentPath вернет путь, который вам нужен. Checkout QCoreApplication :: applicationDirPathit пытается определить каталог, в котором находится исполняемый файл, вместо того, чтобы проверять текущий рабочий каталог.
Узнать больше. Как получить текущий путь к рабочему каталогу приложения Qt? Задай вопрос. Спросил 6 лет 9 месяцев назад. Активно 1 месяц назад. Просмотрен 26k раз. Я загрузил изображение, которое описывает путь, который я хочу получить. У кого-нибудь есть решения? Спасибо! Тан Вьет. Tan Viet Tan Viet 1, 4 4 золотых знака 17 17 серебряных знаков 32 32 бронзовых знака. 15 июля 2013 г. QDir :: currentPath - это текущий каталог приложения.
Это не каталог, содержащий исполняемый файл, если только эти два каталога не совпадают.Это то, что происходит в вашем случае, потому что Creator запускает исполняемый файл таким образом. Активные самые старые голоса. Спасибо за быстрый ответ. Я понял твой ответ.
Зарегистрируйтесь или войдите Зарегистрируйтесь с помощью Google. Зарегистрируйтесь через Facebook. Зарегистрируйтесь, используя электронную почту и пароль. Опубликовать как гость Имя. Электронная почта обязательна, но не отображается. Блог Overflow. Класс QDir обеспечивает доступ к структурам каталогов и их содержимому.
Примечание. Все функции этого класса реентерабельны. QDir используется для управления именами путей, доступа к информации о путях и файлах, а также для управления базовой файловой системой.Его также можно использовать для доступа к системе ресурсов Qt.
QDir может указывать на файл, используя относительный или абсолютный путь. Абсолютные пути начинаются с разделителя каталогов, которому может предшествовать спецификация диска в Windows. Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего каталога. Вы можете использовать функции isRelative или isAbsolute, чтобы проверить, использует ли QDir относительный или абсолютный путь к файлу.
Вызов makeAbsolute для преобразования относительного QDir в абсолютный.Путь к каталогу может быть получен с помощью функции пути, а новый путь установлен с помощью функции setPath. Абсолютный путь к каталогу находится путем вызова absolutePath.
Имя каталога определяется с помощью функции dirName. Обычно это возвращает последний элемент в абсолютном пути, который указывает расположение каталога. Однако он также может вернуться ».
Путь к каталогу также можно изменить с помощью функций cd и cdUp, которые работают как знакомые команды оболочки.Когда cd вызывается с именем существующего каталога, объект QDir меняет каталог, чтобы вместо этого он представлял этот каталог. Функция cdUp изменяет каталог объекта QDir так, чтобы он ссылался на его родительский каталог; я.
Каталоги могут быть созданы с помощью mkdir, переименованы с помощью rename и удалены с помощью rmdir. Вы можете проверить наличие каталога с заданным именем, используя exists, а свойства каталога можно проверить с помощью isReadableisAbsoluteisRelative и isRoot.Каталоги содержат ряд записей, представляющих файлы, каталоги и символические ссылки. Количество записей в каталоге возвращается с помощью count. Список строк с именами всех записей в каталоге можно получить с помощью entryList.
Относительный путь Qt. Документация Qt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику использования файлов cookie и Условия использования. Наконец-то вышла бета-версия темного режима. Измените свои предпочтения в любое время.Stack Overflow for Teams - это личное и безопасное место, где вы и ваши коллеги можете находить информацию и делиться ею.
Подписка на RSS
Я хочу получить текущий рабочий каталог моей программы. Я не хочу получать каталог, содержащий исполняемый файл приложения. Ваше приложение не может знать, где находится проект, потому что это опция qt-creator. Если вы хотите запустить свой двоичный файл в пути к проекту, вам необходимо настроить рабочий каталог внутри qt-creator на правильный путь.Тогда QDir :: currentPath вернет путь, который вам нужен.
Checkout QCoreApplication :: applicationDirPathit пытается определить каталог, в котором находится исполняемый файл, вместо того, чтобы проверять текущий рабочий каталог. Учить больше. Как получить текущий путь к рабочему каталогу приложения Qt? Задай вопрос. Спросил 6 лет 9 месяцев назад. Активно 1 месяц назад. Просмотрен 26k раз. Я загрузил изображение, которое описывает путь, который я хочу получить. У кого-нибудь есть решения? Спасибо! Тан Вьет.Tan Viet Tan Viet 1, 4 4 золотых знака 17 17 серебряных знаков 32 32 бронзовых знака.
15 июля '13 в QDir :: currentPath - текущий каталог приложения. Это не каталог, содержащий исполняемый файл, если только эти два каталога не совпадают. Это то, что происходит в вашем случае, потому что Creator запускает исполняемый файл таким образом. Активные самые старые голоса. Спасибо за быстрый ответ. Я понял твой ответ. Зарегистрируйтесь или войдите в систему. Зарегистрируйтесь с помощью Google. Зарегистрируйтесь через Facebook.
Зарегистрируйтесь, используя электронную почту и пароль.
Опубликовать как гость Имя. Электронная почта обязательна, но не отображается. Блог Overflow. Учебники по программированию подкастов могут стать настоящим тормозом. Представлен в Meta. Класс QDir обеспечивает доступ к структурам каталогов и их содержимому. Примечание. Все функции этого класса реентерабельны. QDir используется для управления именами путей, доступа к информации о путях и файлах, а также для управления базовой файловой системой. Его также можно использовать для доступа к системе ресурсов Qt.
QDir может указывать на файл, используя относительный или абсолютный путь.Абсолютные пути начинаются с разделителя каталогов, которому может предшествовать спецификация диска в Windows. Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего каталога.
Вы можете использовать функции isRelative или isAbsolute, чтобы проверить, использует ли QDir относительный или абсолютный путь к файлу.
Как получить относительный путь к файлу в QT
Вызовите makeAbsolute, чтобы преобразовать относительный QDir в абсолютный. Путь к каталогу может быть получен с помощью функции пути, а новый путь установлен с помощью функции setPath.Абсолютный путь к каталогу находится путем вызова absolutePath.
Имя каталога определяется с помощью функции dirName.
Qt Documentation
Обычно возвращает последний элемент в абсолютном пути, который определяет расположение каталога. Однако он также может возвращать ". Путь к каталогу также можно изменить с помощью функций cd и cdUp, обе из которых работают как знакомые команды оболочки. Когда cd вызывается с именем существующего каталога, объект QDir меняет каталог так что вместо этого он представляет этот каталог.Функция cdUp изменяет каталог объекта QDir так, чтобы он ссылался на его родительский каталог; я.
Каталоги могут быть созданы с помощью mkdir, переименованы с помощью rename и удалены с помощью rmdir. Вы можете проверить наличие каталога с заданным именем, используя exists, а свойства каталога можно проверить с помощью isReadableisAbsoluteisRelative и isRoot. Каталоги содержат ряд записей, представляющих файлы, каталоги и символические ссылки.
Абсолютный путь и относительный путь в Linux / UnixЧисло записей в каталоге возвращается с помощью count.Список строк с именами всех записей в каталоге можно получить с помощью entryList. Пути к файлам и каталогам в каталоге можно создать с помощью filePath и absoluteFilePath. Функция filePath возвращает путь к указанному файлу или каталогу относительно пути к объекту QDir; absoluteFilePath возвращает абсолютный путь к указанному файлу или каталогу.
Ни одна из этих функций не проверяет наличие файлов или каталога; они только строят пути.Файлы можно удалить с помощью функции удаления.
Каталоги нельзя удалить так же, как файлы; вместо этого используйте rmdir, чтобы удалить их. Можно уменьшить количество записей, возвращаемых entryList и entryInfoList, применяя фильтры к объекту QDir. Вы можете применить фильтр имен, чтобы указать шаблон с подстановочными знаками, которым должны соответствовать имена файлов, фильтр атрибутов, который выбирает свойства записей и может различать файлы и каталоги, а также порядок сортировки.
Фильтры имен - это списки строк, которые передаются в setNameFilters.Фильтры атрибутов состоят из побитовой комбинации фильтров ИЛИ, и они указываются при вызове setFilter. Вы можете проверить, соответствует ли имя файла фильтру, используя функцию сопоставления.
Флаги фильтра и порядка сортировки также могут быть указаны при вызове entryList и entryInfoList, чтобы переопределить ранее определенное поведение. Доступ к некоторым общим каталогам предоставляется с помощью ряда статических функций, возвращающих объекты QDir. Для них также есть соответствующие функции, возвращающие строки :.Статическая функция setCurrent также может использоваться для установки рабочего каталога приложения. Если вы хотите найти каталог, содержащий исполняемый файл приложения, см. QCoreApplication :: applicationDirPath.
Статическая функция дисков предоставляет список корневых каталогов для каждого устройства, содержащего файловую систему. Пути, содержащие ". Иногда необходимо иметь возможность показать путь в собственном представлении для платформы пользователя. Класс QDir обеспечивает доступ к структурам каталогов и их содержимому.QDir используется для управления именами путей, доступа к информации о путях и файлах, а также для управления базовой файловой системой.
Его также можно использовать для доступа к системе ресурсов Qt. QDir может указывать на файл, используя относительный или абсолютный путь.
Абсолютные пути начинаются с разделителя каталогов, которому может предшествовать спецификация диска в Windows. Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего каталога.Вы можете использовать функции isRelative или isAbsolute, чтобы проверить, использует ли QDir относительный или абсолютный путь к файлу. Вызовите makeAbsolute, чтобы преобразовать относительный QDir в абсолютный. Путь к каталогу может быть получен с помощью функции пути, а новый путь установлен с помощью функции setPath.
Абсолютный путь к каталогу находится путем вызова absolutePath. Имя каталога находится с помощью функции dirName. Обычно это возвращает последний элемент в абсолютном пути, который указывает расположение каталога.Однако он также может вернуться ».
Путь к каталогу также можно изменить с помощью функций cd и cdUp, которые работают как знакомые команды оболочки. Когда cd вызывается с именем существующего каталога, объект QDir меняет каталог, чтобы вместо этого он представлял этот каталог. Функция cdUp изменяет каталог объекта QDir так, чтобы он ссылался на его родительский каталог; я.
Каталоги могут быть созданы с помощью mkdir, переименованы с помощью rename и удалены с помощью rmdir.
Досье окружного суда ЛинкольнаВы можете проверить наличие каталога с заданным именем, используя exists, а свойства каталога можно проверить с помощью isReadableisAbsoluteisRelativeand isRoot. Каталоги содержат ряд записей, представляющих файлы, каталоги и символические ссылки.
Количество записей в каталоге возвращается с помощью count. Список строк с именами всех записей в каталоге можно получить с помощью entryList. Пути к файлам и каталогам в каталоге можно создать с помощью filePath и absoluteFilePath.Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику конфиденциальности и Условия использования. Наконец-то вышла бета-версия темного режима. Измените свои предпочтения в любое время.
Stack Overflow for Teams - это личное безопасное место, где вы и ваши коллеги можете находить информацию и делиться ею. У меня есть проект, над которым я работаю в создателе Qt, для которого требуется сторонняя библиотека.
Я хочу добавить заголовки к пути включения проекта. Как мне это сделать? Если вы используете qmake, стандартную систему сборки Qt, просто добавьте строку в файл.
Если вы используете свою собственную систему сборки, вы создаете проект, выбирая «Импорт проекта на основе Makefile».
В этом файле просто перечислите пути, которые вы хотите включить, по одному в каждой строке. На самом деле все это указывает Qt Creator, где искать файлы для индексации для автоматического завершения. Ваша собственная система сборки должна будет обрабатывать пути включения по-своему. Для всех, кто совершенно не знаком с Qt Creator, как я, вы можете изменить свой проект. Просто дважды щелкните «название вашего проекта».
Узнать больше.Как добавить путь включения в Qt Creator? Задай вопрос. Спросил 9 лет 11 месяцев назад. Активна 11 месяцев назад. Просмотрено k раз. Georg Fritzsche Nathan Osman Nathan Osman 58k 62 62 золотых знака серебряных знаков бронзовых знаков. Активные самые старые голоса.
Что такое барометр высоты на часах GalaxyДжейсон Б. Джейсон Б. Мне это подойдет. Есть ли глобальная настройка для включаемых путей? Не то, чтобы я об этом знал, но это не значит, что нет. Я не вижу в опциях ничего подобного. Неважно.Alex Maltsev Alex Maltsev 61 1 1 серебряный знак 1 1 бронзовый знак.
Где купить обычные товары в КатареAdam Adam 4, 7 7 золотых знаков 34 34 серебряных знака 68 68 бронзовых знаков. Использование абсолютных путей к файлам - очень плохая идея. Всегда старайтесь использовать систему относительных путей к файлам. QT разработан для кроссплатформенности. Если вы используете собственные файлы Makefile, вы можете дважды щелкнуть файл. Overflow Blog.QFileInfo предоставляет информацию об имени файла и пути к позиции в файловой системе, его правах доступа, а также о том, является ли он каталогом или символической ссылкой и т. Д.
QFileInfo также может использоваться для получения информации о ресурсе Qt. QFileInfo может указывать на файл с относительным или абсолютным путем к файлу. Относительные имена файлов начинаются с имени каталога или имени файла и указывают путь относительно текущего рабочего каталога. Вы можете использовать функцию isRelative, чтобы проверить, использует ли QFileInfo относительный или абсолютный путь к файлу. Вы можете вызвать функцию makeAbsolute для преобразования относительного пути QFileInfo в абсолютный путь.
Файл, с которым работает QFileInfo, устанавливается в конструкторе или позже с помощью setFile.Используйте exists, чтобы узнать, существует ли файл и размер, чтобы узнать его размер. Тип файла получается с помощью isFileisDir и isSymLink.
Ближайший дилер Vermeer agФункция symLinkTarget предоставляет имя файла, на который указывает символическая ссылка. В Unix, включая macOS и iOS, функции получения свойств в этом классе возвращают такие свойства, как время и размер целевого файла, а не символическую ссылку, поскольку Unix прозрачно обрабатывает символические ссылки. Открытие символической ссылки с помощью QFile эффективно открывает цель ссылки.Например:. В Windows ярлыки. Как и в системах Unix, геттеры свойств возвращают размер целевого файла, а не размер файла.
Это поведение устарело и, вероятно, будет удалено в будущей версии Qt, после чего. Элементы имени файла можно извлечь с помощью пути и имени файла. Части fileName могут быть извлечены с помощью baseNamesuffix или completeSuffix.
Объекты QFileInfo в каталогах, созданных классами Qt, не будут иметь конечного разделителя файлов. Если вы хотите использовать завершающие разделители в ваших собственных объектах информации о файлах, просто добавьте их к имени файла, заданному конструкторам или setFile.Пожалуйста, поделитесь с друзьями и коллегами! Нет особого удовольствия в создании собственных настольных приложений, если вы не можете поделиться ими с другими людьми - будь то коммерческая публикация, обмен в Интернете или просто передача кому-то из ваших знакомых.
Совместное использование ваших приложений позволяет другим людям получать выгоду от вашего тяжелого труда! Хорошая новость заключается в том, что существуют инструменты, которые помогут вам сделать это с вашими приложениями Python, которые хорошо работают с приложениями, созданными с использованием Qt5. В этом руководстве мы рассмотрим самый популярный инструмент для упаковки приложений Python: PyInstaller.
Это руководство разбито на серию шагов, с использованием PyInstaller для создания сначала простых, а затем все более сложных приложений PyQt5 в распространяемые EXE-файлы в Windows.
Вы можете выполнить его полностью или сразу перейти к примерам, которые наиболее актуальны для вашего собственного проекта. Вам всегда нужно скомпилировать приложение в целевой системе. Итак, если вы хотите создать Mac. Если вы нетерпеливы, вы можете сразу загрузить установщик Piecasso для Windows! Независимо от проекта, над которым вы работаете, у вас должна быть возможность упаковать свои приложения.Вы также можете выбрать установку PyQt5 и PyInstaller в виртуальной среде или в виртуальной среде ваших приложений, чтобы поддерживать чистоту вашей среды.
Рекомендуется начинать упаковку приложения с самого начала, чтобы вы могли убедиться, что упаковка все еще работает, когда вы ее разрабатываете.
Это особенно важно, если вы добавляете дополнительные зависимости. Если вы думаете об упаковке только в конце, может быть сложно отладить, в чем именно заключаются проблемы. В этом примере мы начнем с простого скелетного приложения, которое не делает ничего интересного.
После того, как у нас будет работать базовый процесс упаковки, мы расширим приложение, включив в него значки и файлы данных. Мы подтвердим сборку по мере продвижения.
Для начала создайте новую папку для своего приложения, а затем добавьте следующий скелет приложения в файл с именем app. Вы также можете скачать исходный код и связанные файлы. Это базовое простое приложение, которое создает настраиваемый QMainWindow и добавляет к нему простой виджет QLabel. Вы можете запустить это приложение следующим образом.Теперь у нас есть простой каркас приложения, и мы можем запустить наш первый тест сборки, чтобы убедиться, что все работает.
Откройте командную строку терминала и перейдите в папку, содержащую ваш проект. Теперь вы можете запустить следующую команду, чтобы запустить сборку PyInstaller. Вы увидите ряд сообщений, содержащих отладочную информацию о том, что делает PyInstaller. Они полезны для отладки проблем в вашей сборке, но в противном случае их можно игнорировать.
Результат выполнения команды в Windows 10 показан ниже.Если вы посмотрите в свою папку, вы заметите, что теперь у вас есть две новые папки dist и build. Ниже представлен усеченный список содержимого папки, в котором показаны папки build и dist. Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику конфиденциальности и Условия использования.
Наконец-то вышла бета-версия темного режима. Измените свои предпочтения в любое время. Stack Overflow for Teams - это личное и безопасное место, где вы и ваши коллеги можете находить информацию и делиться ею. В моей конф.Я пытался:. В целом, то, что вы делаете, может быть плохой идеей, поскольку это объединит пути конфигурации и изображения вместе. Учить больше. Получить относительный путь из файла в Qt Задать вопрос. Спрашивал 5 лет 10 месяцев назад. Последняя активность 4 года 7 месяцев назад.
Просмотрен 24k раз. Я пытаюсь получить относительный путь из файлов, которые я хотел бы написать. Активные самые старые голоса. Также обратите внимание на недостающие цитаты. Matthias Kuhn 1 1 золотой знак 10 10 серебряных знаков 31 31 бронзовый знак. Спасибо, отлично работает. Мне следовало бы более внимательно прочитать документ о QDir.
Я знаю, что это может быть рискованно, но файлы confs могут быть экспортированы на другие компьютеры, поэтому, если папка conf и файлы изображений, соответствующие их относительному пути, экспортируются в одно и то же время, приложение не выйдет из строя. Зарегистрируйтесь или войдите в систему. Зарегистрируйтесь с помощью Google. Зарегистрируйтесь через Facebook. Зарегистрируйтесь, используя электронную почту и пароль. Опубликовать как гость Имя.
.