Вопрос

Я работаю в 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 в выходную папку сборки. Тогда ваш код может предположить, что файл находится в той же папке, что и исполняемый файл.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top