Относительные пути в Visual Studio

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

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


person caschw    schedule 03.10.2008    source источник
comment
Я тоже хотел бы это знать. Я всегда был разочарован, но строгие пути кода в VS. Особенно, когда у вас есть файлы сборки nant.   -  person flukus    schedule 03.10.2008


Ответы (7)


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

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

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

person Matt    schedule 03.10.2008

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

person David Kreps    schedule 03.10.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.

person Seth Petry-Johnson    schedule 03.10.2008

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

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

Определено несколько макросов, таких как "$(ConfigurationName)", $(ProjectDir)

person Mitch Wheat    schedule 03.10.2008

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

Установите «Рабочий каталог» на $(TargetDir)

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

person Community    schedule 19.06.2009

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

System.Reflection.Assembly.GetExecutingAssembly(). Location будет работать, но дает путь с включенным именем сборки.

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

Но просто :

fileToRead.txt

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

person Peter    schedule 09.12.2010

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

person Aidan Ryan    schedule 03.10.2008