Как указать файл из ресурсов

Обновлено: 07.07.2024

В Java, как мне получить абсолютный путь к файлу, пожалуйста?

Вы хотите написать плагин для Maven? Или вы хотите получить доступ к файлу во время выполнения вашей программы?

Вы можете использовать ClassLoader.getResource метод, чтобы получить правильный ресурс.

Хотя это может работать не все время, более простое решение -

Вы можете создать File объект и использовать getAbsolutePath метод:

Совет ограниченного использования, так как он полагается на рабочий каталог как на корень maven. И даже в этом случае вам лучше использовать target/classes/abc.txt ссылку на файл, поскольку это каноническое место, куда Maven помещает файлы ресурсов после обработки (например, плагин maven-resources мог выполнить подстановку свойств в abc.txt). Намного лучше использовать abc.txt через getResource () из пути к классам. Что делать, если конечный пользователь запускает ваше приложение как исполняемый файл JAR? Тогда физического Файла вообще не будет. Это еще одна причина, по которой вы должны использовать getResource () и, например, открывать для него входной поток в зависимости от того, что вы хотите с ним делать. Можно ли это убрать как правильный ответ? @Karol S ответил ниже - это должен быть правильный ответ (отсюда расхождение в голосовании) Неверный ответ. Пожалуйста, обратитесь к ответу @Karol ниже

Правильный способ, который действительно работает:

Теперь не имеет значения, где физически находится файл в пути к классам, он будет найден, если ресурс на самом деле является файлом, а не записью JAR.

(Кажущееся очевидным new File(resource.getPath()) не работает для всех путей! Путь все еще закодирован в URL!)

Или, предположительно, вы могли бы просто сделать: new File(resource.toURI()).getAbsolutePath(); (т.е. я не думаю, что вам нужен объект Path?) Хороший совет о toURI (), это позволяет избежать пробелов на вашем пути, выходящих как% 20! Благодарность! У меня это почти сработало. Но мне пришлось внести одно изменение: YourClass.class.getClassLoader (). GetResource ("abc"); Вы могли бы поступить иначе, new File(YourClass.class.getResource("abc").toURI().getPath()) если бы захотели. Я не понимаю, как это сработало для стольких людей без начального слэша: .getResource("/abc")

Вам нужно указать путь, начинающийся с /

Создайте экземпляр classLoader нужного вам класса, тогда вы сможете легко получить доступ к файлам или ресурсам. теперь вы получаете доступ к пути, используя getPath() метод этого класса.

Чтобы вернуть файл или путь к файлу

На нашем пути к абсолютному пути есть две проблемы:

  1. Найденное место размещения будет не там, где лежат исходные файлы, а там, где сохранен класс. И папка ресурсов почти наверняка будет где-то в исходной папке проекта.
  2. Те же функции для получения ресурса работают по-разному, если класс выполняется в подключаемом модуле или в пакете непосредственно в рабочей области.

Следующий код даст нам все полезные пути:

Здесь исследуются обе функции, которые можно использовать для локализации папки ресурсов. Что касается class , его можно получить как статически, так и динамически.

Если проекта нет в подключаемом модуле, код при запуске в JUnit напечатает:

Итак, чтобы добраться до src / rest / resources, мы должны перемещаться вверх и вниз по дереву файлов. Можно использовать оба метода. Обратите внимание, мы не можем использовать getResource(resourceFolderName) , потому что эта папка не находится в целевой папке. Надеюсь, никто не кладет ресурсы в созданные папки.

Если класс находится в пакете, который находится в плагине, результат того же теста будет:

Итак, мы снова должны идти вверх и вниз по дереву папок.

Наиболее интересен случай, когда пакет запускается в плагине. В качестве теста плагина JUnit для нашего примера. Результат:

Здесь мы можем получить абсолютный путь, только объединив результаты обеих функций. И этого мало. Между ними мы должны поместить локальный путь к месту, где находятся пакеты классов, относительно папки плагина. Возможно, вам придется что-то вставить как src или src/test/resource сюда.

У меня в ресурсах находится Excelевский файл. При его открытии я должен указать путь . И тут загвоздка. Хелп плз.

Пришлось пока конкретный путь прописывать к файлу.

Путь к картинке в ресурсах
Как прописать путь к картинке которая находится в ресурсах, импортированная как обычно в solution.

Файл: Получить полный путь к файлу и записать этот путь в отдельную переменную.
Доброго времени суток.Столкнулся с проблемой в ходе выполнения задачи. Мне нужно получить полный.

Как указать путь к картинке которая расположена в ресурсах, а не на диске
Как указать путь к картинке которая расположена в ресурсах, а не на диске? Вот так я присваиваю.

Значение Nothing при обращении к файлу Access в ресурсах
В ресурсах находится файл System.mdb, при: Dim Base As Object Base =.

если кинуть в 1 папку и написать просто "Blank.xls" он ругается, что не может найти. Нужно полный путь Можешь поместить свой файл в ресурсы. Доступ к ресурсам получить просто:
где WindowsFormsApplication1 - пространство имен по умолачнию. просят получить именно путь. у меня та же проблема, я хочу запускать процесс, исполнительный файл которого хочу поместить в ресурсы (вшить в екзе, ILMerge не подходит). а классу Process нужно указывать именно путь Значит надо брать файл из ресурсов и сохранять его куда-нибудь во временную папку.
Этот код создаёт файл с именем newFile.xls из массива байтов. А ресурсы в пргограмме в виде массива байтов и хранятся. А потом уже можно запускать его методом Process.Start().


Как программно получить путь к файлу конфигураций программы (файлу user.config)?
Задался целью программно очистить параметры программы, которые сохраняются в файле user.config.

Разбить путь к файлу на части - путь, файл и расширение
Как разбить путь к файлу на части - путь, файл и расширение? Например: c:\kuku\part1\name.txt .


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


Путь к файлу
Добрый день. Есть такая структура проекта app --db_connector.py settings.

Мне требуется поместить в ресурсы файл (например, файл локальной базы данных или файл xml) без необходимости его изменения в рантайме.

Файл при этом должен быть зашит в бинарник.

Как это сделать, я знаю. Добавляю файл в проект, выбираю действие при сборке - Resource и Копировать в выходной каталог - Не копировать. Но как в коде достать его в Stream?

5,818 1 1 золотой знак 17 17 серебряных знаков 50 50 бронзовых знаков @Grundy, а мне что нужно было искать? Как достать из ресурсов текстовый файл? Но у меня не текстовый файл. Я бы назвал это не дубликатом, а обобщением Тип файла не имеет значения: код в обоих ответах одинаков. Дубликаты как раз и призваны улучшить поиск вопросов с одинаковыми ответами @Grundy, тогда я не понял, что мне делать с этой информацией "Возможный дубликат вопроса: Как прочитать txt-файл из ресурсов?" Два варианта: согласиться что это дубликат (что ты уже сделал), либо можно было ничего не делать, и вопрос так и остался бы как есть, либо по результатам голосования его так же закрыли как дубликат, либо не закрыли

Для помещения в ресурс, необходимо выставить свойство Build Action в Embeded Resource.

Для того, что бы вытащить ресурс в поток, нужно указать его полное имя (Qualified Name) что включает в себя имя сборки и директории внутри проекта, если они есть. Например, сборка называется Project, а в ней есть директория Data, а в ней ресурс Resource.xml, следовательно, полное имя будет Project.Data.Resource.xml

Добовляете ресурс в проект

введите сюда описание изображения

и через код получаете доступ к ресурсу.


3,434 2 2 золотых знака 24 24 серебряных знака 39 39 бронзовых знаков Или просто так: var emptyDbStream = new MemoryStream((byte[])Properties.Resources.empty);

Чтобы добавить файл в проект как внедренный ресурс, выполните следующие действия (для примера - текстовый файл и картинка).

Каждое серьезное приложение с графическим пользовательским интерфейсом (и не только) использует файлы ресурсов. При этом у вас есть два варианта: либо подключать ресурсы по относительным путям файловой системы, либо поместить их прямо внутрь бинарного файла приложения или библиотеки. У каждого из этих подходов есть свои преимущества и недостатки.

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

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

С учетом всех плюсов и минусов последний вариант в большинстве случаев является предпочтительным. О нем мы и поговорим.

Реклама

Создание файла с описанием ресурсов

Первым делом создайте файл с описанием тех ресурсов, которые собираетесь использовать. Он имеет следующий вид (назовем его res.qrc ):

В приведенном примере мы определили один префикс: /images . Его можно считать логическим каталогом ресурсов. Таких префиксов может быть сколько угодно. Например, если в вашем приложении есть звуковые эффекты, то вы можете добавить префикс /sounds . Для создания более глубокой иерархии используйте префиксы вида /some/long/prefix .

В тег <qresource> вложены определения файлов, относящихся к соответствующему префиксу. В примере включено единственное изображение logo.jpg , но вы можете указать столько файлов, сколько необходимо. Используйте относительные пути к файлам, беря в качестве каталога отсчета - тот, в котором находится qrc -файл.

Имеет смысл явным образом распределять ресурсы по подкаталогам в файловой системе проекта. Например, изображение logo.jpg поместите в images/ . Тогда запись приобретает вид:

В этом случае логический путь к файлу logo.jpg вновь имеет вид: /images/logo.jpg .

Для краткости можно использовать псевдонимы следующим образом:

Файл доступен по логическому пути /myprefix/logo.jpg .

Затем нужно привязать заполненный qrc -файл к проекту. Для этого добавьте в ваш pro -файл строку вида:

В примере выше qrc -файл расположен на одном уровне с pro -файлом. Если вы применяете более сложную схему размещения файлов, то воспользуйтесь относительным путем.

Обратите внимание, что в QtCreator предусмотрен довольно удобный GUI-интерфейс для работы с файлами ресурсов. Чтобы создать новый qrc -файл, щелкните в контекстном меню для нужного проекта на пункт Add New. . В появившемся диалоговом окне перейдите в группу Qt и выберите Qt Resource file . После успешного создания файла ресурсов в панели проекта вы увидите новую группу Resources , появившуюся рядом с Headers и Sources . Открыв qrc -файл вы попадете в редактор ресурсов, который вполне интуитивно позволяет выполнить те же самые действия, которые мы выполняли вручную.

Реклама

Использование ресурсов в приложении

Итак, qrc -файл готов и подключен к проекту. Осталось только воспользоваться преимуществами от его использования. И сделать это совсем не сложно:

Ключевым здесь является способ обращения к изображению (или любому другому файлу) из ресурсов. Путь строится следующим образом: сначала ставится двоеточие : , затем префикс /images , который мы сами выбрали, и наконец путь к файлу (или псевдоним) logo.jpg . В остальном все то же самое, что и при работе с обычными файлами, предназначенными только для чтения.

Заключение

Использовать файлы ресурсов в Qt-проектах очень просто, поэтому если вам понадобилось добавить изображения, музыку или что-то еще в свое приложение, то теперь вы знаете, что нужно делать.

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