Как указать путь к файлу в c
Я использую StreamReader для динамической замены содержимого в шаблоне HTML. HTML-файл был импортирован в мой проект.
Прямо сейчас мне приходится ссылаться на HTML-файл в статическом месте на моем устройстве dev, потому что я не могу найти правильный синтаксис для ссылки на него после его импорта в мой проект VS.
Как мне обратиться к файлу без использования абсолютного пути?
Текущая реализация для справки:
4 ответа
Я нашел два решения для этого:
Если вам все равно, виден ли внешний файл в каталоге сборки / installdir вашего приложения:
Если вы хотите, чтобы ваш внешний файл был невидимым после компиляции:
Обратите внимание, что второе решение требует добавления внешнего файла и изменения действия сборки на «Встроенный ресурс» в меню свойств этого файла в Visual Studio.
Вы можете добавить его как встроенный ресурс и извлечь его таким образом.
За ваш комментарий
Есть два основных способа сделать это. В настольном приложении текущий каталог .exe устанавливается в каталог, из которого он запускается по умолчанию. Если это не изменилось путем запуска .exe с помощью ярлыка со специальными настройками или с помощью другого процесса, использующего специальную функцию, это должно быть значение по умолчанию. Если это так, вы можете просто использовать относительный путь. Например, если у вас есть файл с именем «data.txt» в папке с именем «вещи» внутри папки с именем «вещи» в том же каталоге, что и ваше приложение, вы можете просто указать относительный путь «вещи / вещи / данные». txt "напрямую, и Windows решит это за вас.
Если по какой-то причине вам нужно подняться «вверх» из каталога приложения, вы можете использовать «..» для представления этой родительской папки каталога. Поэтому «../data.txt» будет искать в папке, в которой содержится , текущий каталог для файла с именем «data.txt».
Вы также можете изменить текущий каталог приложения, когда он станет каталогом .exe, и затем ссылаться на все по относительному пути, как в первом примере.
Одна распространенная вещь, которую я видел, - это поместить местоположение файла в файл конфигурации. Это позволяет изменить местоположение файла по желанию без перекомпиляции.
Относительный путь
Троекратное использование ../ означает то, что нам нужно подняться на три уровня выше по иерархии (до корневой директории), затем посетить директорию etc и, находящуюся в ней, директорию mc . Если нужно указать файл или папку в текущей директории, то используется ./ :
Полный путь
Полный путь всегда определяется от корневой директории (вне зависимости от текущей выбранной папки). Полный путь к файлам mc.menu и 1.mp3 будет выглядеть следующим образом:
class path
Для того, чтобы представить путь в файловой системе используются объекты класса path . Пути неявно преобразуются в std::basic_string , что позволяет использовать их в качестве аргументов, например, для std::ifstream::open .
Класс path обладает большим количеством методов. Ниже приводятся некоторые из них:
Директория. Класс directory_iterator
Рассмотрим подробнее функции библиотеки для работы с директориями.
create_directory, create_directories
Создает директорию или директории в пути. Возвращают булевский тип успешности операции ( true , если создание директории в пути разрешено).
Копирует файлы и директории. copy_options устанавливает параметры копирования.
Параметры копирования. copy_options
Константа | Описание |
---|---|
skip_existing | Сохранить, но не сообщать об ошибках |
overwrite_existing | Заменить существующий файл |
update_existing | Замените существующий файл, только если он старше, чем копируемый файл |
recursive | Рекурсивно копировать поддиректории и их содержимое |
copy_symlinks | Копировать только символические ссылки, а не файлы, на которые они указывают |
skip_symlinks | Игнорировать символические ссылки |
directories_only | Копировать только структуру директорий, а не файлы относящиеся к директориям |
create_symlinks | Вместо создания копий файлов создавать символические ссылки, указывающие на оригиналы. Примечание: исходный путь должен быть абсолютным, если путь назначения не находится в текущей директории |
create_hard_links | Вместо создания копий файлов создаются жесткие ссылки |
Несколько опций можно объединить битовой маской с помощью побитовых операций operator& , operator| , operator^ , operator
, operator&= , operator|= , и operator^= :
remove, remove_all
1. Удаляет файл, директорию и символическую ссылку (но не цель). Возвращает булевский тип ( true , если файл был удален, false , если он не существует).
2. Рекурсивно удаляет содержимое p (если это директория) и содержимое всех его поддиректорий, а затем удаляет и сам p . Возвращает количество файлов и директорий, которые были удалены (или 0 , если p не существует).
rename
Перемещает или переименовывает объект файловой системы, идентифицируемый old_p , в new_p .
directory_iterator
Константа | Описание |
---|---|
follow_directory_symlink | Не пропускать символические ссылки |
skip_permission_denied | Пропускать директории в которых установленные привилегии могут привести к ошибкам |
В программе ниже покажем содержимое директории проекта.
Обратите внимание, что в процессе работы итератора текущая директория будет изменяться. Узнать какая директория в данный момент выбрана можно с помощью функции current_path (см. ниже).
recursive_directory_iterator
current_path
1. Возвращает абсолютный путь текущего рабочего каталога.
2. Изменяет текущий рабочий каталог на p .
is_directory
Проверяет, соответствует ли данный статус файла или путь директории.
1. Эквивалент s.type() == file_type::directory .
2. Эквивалентно is_directory(status(p)) или is_directory(status(p, ec)) , соответственно.
temp_directory_path
В процессе работы приложения часто требуется создавать временные файлы. Чтобы автоматизировать этот процесс нужно знать, где находится системная директория для временных файлов. Функция temp_directory_path возвращает расположение подходящей директории для временных файлов.
Файлы и ссылки
Проверка типа файла
copy_file
Копирует один файл из from в to , используя параметры копирования. Поведение не определено, если в copy_options присутствует несколько опций.
file_size
Возвращает размер файла. Будет следовать символической ссылке. Попытка определения размера директории определяется реализацией.
resize_file
Изменяет размер обычного файла. Если размер файла был больше, чем new_size , оставшаяся часть файла отбрасывается. Если файл ранее был меньше, чем new_size , размер файла увеличивается, и новая область заполняется нулями.
Символические ссылки. create_symlink
Версия символической ссылки для директории существует для совместимости, так как в системах POSIX разницы в символических ссылках на файл и директорию не существует. Целевой путь может быть недействительным.
copy_symlink
Копирует символическую ссылку в другое место.
read_symlink
Возвращает путь цели символической ссылки или ошибку, если p не является символической ссылкой или путь не символичеcкая ссылка. При ошибке возвращается пустой путь.
Жесткая ссылка. create_hard_link
hard_link_count
Возвращает количество жестких ссылок для объекта файловой системы, идентифицированного путем p.
Права на файлы и директории
Символические ссылки, файлы и директории имеют в UNIX-подобных ОС три вида прав доступа к ресурсу:
- Право на чтение ( r )
- Право на запись ( w )
- Право на исполнение ( x )
- Владелец
- Группа владельца
- Все остальные
Помимо прав в формате rwxrwxrwx существуют дополнительные биты SGID , SUID и sticky bit . Использование битов SUID или SGID позволяют запускать файл на выполнение с правами владельца файла или группы соответственно. sticky bit ( t -бит) используется только с директориями. Когда t -бит для директории не установлен, файл в данной директории может удалить (переименовать) любой пользователь, имеющий доступ на запись к данной директории. Устанавливая t -бит на директорию, можно изменить это правило так, что удалить (переименовать) файл мог только владелец этого файла.
Класс перечисление perms содержит константы, определяющие права на файлы и директории.
Тип perms удовлетворяет требованиям BitmaskType , т. е. определены побитовые операции operator& , operator| , operator^ , operator
, operator&= , operator|= и operator^= .
Класс perm_options предоставляет параметры, которые управляют поведением функции permissions (см. ниже). perm_options удовлетворяет требованиям BitmaskType (т. е. определены побитовые операции перечисленные выше).
Константа | Описание |
---|---|
replace | Права будут полностью заменены аргументом для permissions() (поведение по умолчанию) |
add | Права будут заменены на аргументы perms с побитовым ИЛИ и текущим разрешением |
remove | Права будут заменены на аргументы perms с побитовым И для отрицания и текущим разрешением |
nofollow | Права будут изменены для самой символической ссылки, а не для файла, на который она ссылается |
permissions
Изменяет права доступа к файлу, к которому разрешает путь p . Переход по символическим ссылкам, если perm_options::nofollow не установлен в opts .
Для того, чтобы показать права на все файлы в домашней директории воспользуемся итераторами по директории. Чтобы пути выводились без кавычек, будем конвертировать путь в строку, а затем небольшими манипуляциями произведем выравнивание:
У меня было так
Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
03.03.06 22:54: Перенесено модератором из 'C/C++' — Павел Кузнецов Здравствуйте, AlexDav, Вы писали:AD>У меня было так
AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
Попробуй путь взять в кавычки. У тебя есть пробел в пути к файлу
Здравствуйте, AlexDav, Вы писали:
AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
А зачем двойные слеши? Должно быть или "c:\\program files\\. ", или "c:/program files/. "
Здравствуйте, AlexDav, Вы писали:
AD>У меня было так
AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
1. Либо "C://set.ds" либо "C:/set.ds" — двойной слэш — это лишний символ в строке, хотя большинством фунций "глотается" нормально.
2. Чтобы ответить, все таки, что не так, нужно видеть, как используется эта строка.
Вполне возможно, что проблема в пробелах, которые присутствуют во втором варианте и которых нет в первом.
Здравствуйте, HiSH, Вы писали:
HSH>А зачем двойные слеши? Должно быть или "c:\\program files\\. ", или "c:/program files/. "
Так вот зачем эти странные палочки?! И точно работает
R>1. Либо "C://set.ds" либо "C:/set.ds" — двойной слэш — это лишний символ в строке, хотя большинством фунций "глотается" нормально.
Написал не то, что хотел, надо было так:
Здравствуйте, AlexDav, Вы писали:
AD>У меня было так
AD>
AD>Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но
AD>Я заменил на
AD>
AD>И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.
А так не пробовал?
"c:\\Folder One\\Folder Two\\file.ext"
. опыт приходит во время боя .
Здравствуйте, LuciferMoscow, Вы писали:
LM>Попробуй путь взять в кавычки. У тебя есть пробел в пути к файлу
LM>
я попробовал такой путь "C:/Data/set.ds" работает — т.е. ты (можно на ты?) это пробелы, но как ты написал тоже не прокатывает?? Что Делать.
Здравствуйте, AlexDav, Вы писали:
AD>я попробовал такой путь "C:/Data/set.ds" работает — т.е. ты (можно на ты?) это пробелы, но как ты написал тоже не прокатывает?? Что Делать.
Покажи где ты ее используешь и на каком варианте строки ты сейчас остановился.
It is always bad to give advices, but you will be never forgiven for a good one.Oscar Wilde
Здравствуйте, ekamaloff, Вы писали:
E>Покажи где ты ее используешь и на каком варианте строки ты сейчас остановился.
Прошу прощения за MFC
Хотите верти — хотите нет, но
просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Здравствуйте, AlexDav, Вы писали:
AD>Хотите верти — хотите нет, но
AD>
AD>просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Впервоначальном варианте у тебя все слэши были двойные. А петерь вместо них одинарные бэк-слэши (литерал "\\" автоматически преобразуется в одинарный бэк-слэш). Значит, какая то из функций не могла вынести присутствия лишних символов в строке.
Здравствуйте, AlexDav, Вы писали:
AD>Хотите верти — хотите нет, но
AD>
AD>просто начала работать и все! Зуб даю кроме этой строчки в программе ничего не менял!
Тебе ведь так и сказали — нужно либо одинарный прямой слэш, либо двойной обратный.
Ты бы хоть разобрался, зачем тут двойной слэш, чтоб больше не путаться.
Здравствуйте, i-maverick, Вы писали:
IM>Тебе ведь так и сказали — нужно либо одинарный прямой слэш, либо двойной обратный.
IM>Ты бы хоть разобрался, зачем тут двойной слэш, чтоб больше не путаться.
Ну ладно ругать то сразу — никто же не сказал что надо весь проект перекомпилить что бы подхватил эту дефайну
Я пытаюсь получить путь к файлу изображения, который я добавил в Обозреватель решений в Visual Studio, но я не мог получить относительный путь к этому изображению. H-это файловая структура моего проекта:
Я могу получить изображение, как это :
но я должен быть в состоянии сделать что-то вроде :
Я думаю, что я не знаю точный синтаксис этого, поэтому я не могу получить изображение. : (
когда вы хотите использовать какой-либо внешний файл, есть, конечно, способ поместить их в папку внутри вашего проекта, но не так действителен, как получение их из ресурсов. В обычном проекте Visual Studio, вы должны иметь под Properties раздел, если нет, вы можете легко добавить свой собственный . И добавьте в него любой файл, вы можете перейти к пошаговому руководству по добавлению файлов ресурсов в свой проект здесь.
после имея файлы ресурсов в вашем проекте, вызывать их легко следующим образом:
конечно, вы должны добавить using Properties оператор как это:
Я немного опоздал, и я не уверен, что это то, что вы ищете, но я подумал, что добавлю его на всякий случай, если кто-то еще найдет его полезным.
предположим, что это ваша файловая структура:
нужно написать свой путь относительно . Итак, вы хотите получить доступ Folder.ico в своем Main.cs вы можете использовать:
это, казалось, работало для меня!
\ ничего не значит с точки зрения файловой системы. Единственное место, которое я видел, что правильно используется в веб-приложении, где ASP.NET заменяет Тильду абсолютным путем к корню приложения.
обычно можно предположить, что пути относятся к папке, в которой находится EXE. Кроме того, убедитесь, что изображение указано как "содержимое" и "копировать, если новее"/ "копировать всегда" на вкладке свойств в Visual Студия.
Я также встретил ту же проблему, и я был в состоянии получить его до конца. Поэтому позвольте мне объяснить шаги, которые я применил. Я объясню это по вашему сценарию.
согласно моему методу нам нужно использовать класс "Path" и класс "Assembly", чтобы получить относительный путь.
Итак, первый импорт System.IO и система.Отражение в использовании операторов.
введите приведенный ниже код.
на самом деле выше данной строки хранится путь выходной каталог вашего проекта.(Здесь каталог 'output' относится к Debug папка вашего проекта).
Теперь скопируйте каталог FolderIcon в папку отладки. Затем введите нижеприведенную строку.
Теперь эта переменная 'iconPath' содержит весь путь к вашей папке.ico. Теперь все, что вам нужно сделать, это хранить в строковой переменной. Используйте ниже данной строки для этого.
Теперь вы можете использовать эту строковую переменную icon_path в качестве ваш относительный путь к значку.
спасибо.
Я думаю, что с помощью этого будет легче
или этот код будет работать на любой машине, если ваша папка находится в корне проекта, если вы хотите изменить его. просто измените этот раздел @"..\"
Читайте также: