Как указать путь к файлу в c

Обновлено: 03.07.2024

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

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

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

remove, remove_all

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

rename

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

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

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

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

recursive_directory_iterator
current_path

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

is_directory

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

temp_directory_path

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

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

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

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

file_size

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

resize_file

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

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

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

copy_symlink

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

read_symlink

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

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

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

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

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

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

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

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

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

permissions

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

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

У меня было так

Я открывал этот файл, при необходимости он создавался — и все было бы хорошо, но

И все больше файл открываться не хочет! (и не создается) Я больше ничего не менял в программе — значит виноваты эти строки. Подскажите, плиз.

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"

. << RSDN@Home 1.1.4 stable SR1 rev. 568>>
. опыт приходит во время боя .

Здравствуйте, 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 в качестве ваш относительный путь к значку.

спасибо.

Я думаю, что с помощью этого будет легче

или этот код будет работать на любой машине, если ваша папка находится в корне проекта, если вы хотите изменить его. просто измените этот раздел @"..\"

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