Относительные пути в Visual Studio - PullRequest
9 голосов
/ 03 октября 2008

Я работаю в Visual Studio 2005 и добавил текстовый файл, который необходимо проанализировать, щелкнув правой кнопкой мыши проект в обозревателе решений и добавив -> новый элемент. Это помещает файл .txt в папку проекта. Файл отладки .exe находится в папке / bin / debug.

Как правильно указать на txt-файл из кода, используя относительные пути, которые правильно разрешат две папки назад, а также будут находиться в той же папке после публикации решения?

Ответы [ 7 ]

10 голосов
/ 03 октября 2008

Если я правильно понял ваш вопрос: выберите файл в «Обозревателе решений». В свойствах -> Копировать в выходной каталог выберите «Копировать всегда» или «Копировать, если новее». Для действия сборки выберите «Содержимое». Это скопирует файл в папку / bin / debug при сборке. После этого вы сможете ссылаться на него из корня проекта.

5 голосов
/ 03 октября 2008

Проверьте Класс приложения . Он имеет несколько элементов, которые можно использовать для поиска файлов и т. Д. Относительно приложения после его установки.

Например, Application.ExecutablePath сообщает вам, где находится исполняемый EXE-файл; затем вы можете использовать относительный путь, чтобы найти файл, например, .. \ .. \ FileToBeParsed.txt. Однако это предполагает, что файлы развертываются в той же структуре папок, что и структура папок проекта, что обычно не происходит.

Рассмотрите такие свойства, как CommonAppDataPath и LocalUserAppDataPath, чтобы найти файлы, связанные с приложением, после развертывания проекта.

4 голосов
/ 03 октября 2008

Альтернативой расположению файла на диске может быть включение файла непосредственно в скомпилированную сборку в качестве встроенного ресурса. Для этого щелкните файл правой кнопкой мыши и выберите «Встроенный ресурс» в качестве действия по сборке. Затем вы можете получить файл в виде потока байтов:

Assembly thisAssembly = Assembly.GetExecutingAssembly();
Stream stream = thisAssembly.GetManifestResourceStream("Namespace.Folder.Filename.Ext");
byte[] data = new byte[stream.Length];
stream.Read(data, 0, (int)stream.Length);

Более подробную информацию о встроенных ресурсах можно найти здесь и здесь .

Если вы создаете приложение для собственного использования, лучше всего подойдет предложение Дэвида Крепа: просто скопируйте файл в выходной каталог. Если вы собираете сборку, которая будет повторно использоваться или распространяться, то предпочтительнее использовать параметр встроенного ресурса, поскольку он будет упаковывать все в один файл .dll.

3 голосов
/ 03 октября 2008

Я бы добавил шаг посткомпоновки, который копирует текстовый файл в выходную папку активной конфигурации:

xcopy "$(ProjectDir)*.txt" "$(OutDir)"

Существует несколько макросов, таких как "$(ConfigurationName)", $(ProjectDir)

2 голосов
/ 09 декабря 2010

Решение Application.ExecutablePath не работает для юнит-тестов. Путь vstesthost.exe будет возвращен

System.

Так что это работает:
System.Reflection.Assembly.GetExecutingAssembly().Location + "\..\" + "fileToRead.txt"

Но только:

fileToRead.txt

Работает также. Кажется, рабочий каталог является каталогом исполняемой сборки по умолчанию.

2 голосов
/ 19 июня 2009

Перейдите в Свойства проекта -> Свойства конфигурации -> Отладка

Установите для "Рабочего каталога" значение $ (TargetDir)

Тогда вы можете правильно ссылаться на ваш файл, используя относительный путь в вашем коде (например, ".... \ foo.xml")

1 голос
/ 03 октября 2008

Вы можете добавить событие после сборки, чтобы скопировать TXT-файл в выходную папку сборки. Тогда ваш код может предположить, что файл находится в той же папке, что и исполняемый файл.

...