Относительные пути в Visual Studio
-
03-07-2019 - |
Вопрос
Я работаю в Visual Studio 2005 и добавил текстовый файл, который необходимо проанализировать, щелкнув правой кнопкой мыши проект в обозревателе решений и добавив - > новый предмет Это помещает файл .txt в папку проекта. Файл отладки .exe находится в папке / bin / debug. Р>
Как правильно указать на txt-файл из кода, используя относительные пути, которые будут правильно разрешать две папки назад, а также разрешать находиться в той же папке после публикации решения?
Решение
Ознакомьтесь с классом приложений , Он имеет несколько элементов, которые можно использовать для поиска файлов и т. Д. Относительно приложения после его установки.
Например, Application.ExecutablePath сообщает вам, где находится запущенный EXE-файл; затем вы можете использовать относительный путь, чтобы найти файл, например, .. \ .. \ FileToBeParsed.txt. Однако это предполагает, что файлы развертываются в той же структуре папок, что и структура папок проекта, что обычно не происходит.
Рассмотрите такие свойства, как CommonAppDataPath и LocalUserAppDataPath, чтобы найти файлы, связанные с приложением, после развертывания проекта.
Другие советы
Если я правильно понимаю ваш вопрос: выберите файл в " Обозревателе решений " ;. Под свойствами - > Скопировать в выходной каталог, выберите " Копировать всегда " или " Копировать, если новее " ;. Для действия по сборке выберите «Содержимое». Это скопирует файл в папку / bin / debug при сборке. С этого момента вы сможете ссылаться на него из корня проекта.
Альтернативой расположению файла на диске будет включение файла непосредственно в скомпилированную сборку в качестве встроенного ресурса. Для этого щелкните файл правой кнопкой мыши и выберите «Встроенный ресурс». как действие по сборке. Затем вы можете извлечь файл как поток байтов:
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.
Я бы добавил шаг посткомпоновки, который копирует текстовый файл в выходную папку активной конфигурации:
xcopy "$(ProjectDir)*.txt" "$(OutDir)"
Определено несколько макросов, таких как $ (ConfigurationName) "
, $ (ProjectDir)
Перейдите в Свойства проекта - > Свойства конфигурации - > Отладка
Установить " Рабочий каталог " в $ (TargetDir)
Затем вы можете правильно ссылаться на ваш файл, используя относительный путь в вашем коде (например, " .... \ foo.xml ")
Решение Application.ExecutablePath не работает для юнит-тестов. Путь vstesthost.exe будет возвращен
System.Reflection.Assembly.GetExecutingAssembly (). Местоположение будет работать, но дает путь с включенным именем сборки. Р>
Так что это работает:
System.Reflection.Assembly.GetExecutingAssembly (). Расположение + " \ .. \ " + " fileToRead.txt "
Код>
Но просто:
fileToRead.txt
Работает также. Кажется, рабочий каталог является каталогом исполняемой сборки по умолчанию. Р>
Вы можете добавить событие после сборки, чтобы скопировать файл .txt в выходную папку сборки. Тогда ваш код может предположить, что файл находится в той же папке, что и исполняемый файл.