У меня есть проект VS 2022 с EXE-файлом. Когда EXE запускается, он хочет открыть файлы в папках ./data/ и ./saves/.
Проблема в том, что когда VS собирает проект, он помещает выходные данные в myProject\bin\Debug\net8.0
; следовательно, мой EXE-файл не может найти ./data/ и ./saves/.
Установка «Базового пути вывода» не помогает, потому что он все равно будет добавлять .\Debug\net8.0
ко всему, что я туда вставил.
Использование «события после сборки» не помогает, потому что, хотя мой EXE-файл копируется в нужное место, нажатие «Выполнить из VS» запускает копию в каталоге Debug\net8.0
.
Уродливый обходной путь — поместить копии ./data/ и ./save/ в каждый из .\Debug\net8.0
и .\Release\net8.0
.
Кто-нибудь решил эту загадку?
Используйте относительные пути к папкам и идите дальше по иерархии. Вместо ./data
используйте ../../data
, который ищет его на два уровня выше в дереве (которое будет в myProject
). Каждый ..
означает up one level in the folder tree
.
Возможно я неправильно посчитал уровни. Возможно, вам понадобится ../../../data
. Кажется, я забыл указать папку bin
.
вы можете создать жесткие ссылки на папки, например. с mklink /D data ..\..\..\data
для каждой отладки и выпуска
@yacc, это хорошее предложение. Однако небольшая поправка: это мягкая/символическая ссылка, а не жесткая ссылка.
При создании простых инструментов командной строки проще всего копировать необходимые файлы в папку bin, но использование параметров командной строки для указания пути является гораздо лучшим (гибким) вариантом, а в последней версии VS есть хорошая поддержка для отладки приложений с настраиваемыми аргументами. Для более сложных приложений, таких как ваше, для которых требуется определенная структура папок (вероятно, организованная установщиком), вы все равно можете использовать параметры. Хотя более распространенным является предположение, что отладочные сборки используются локально (публикуются только релизные сборки), поэтому любые #if DEBUG/#endif
могут помочь изменить пути в вашем случае.
Я знаю 2 подхода:
Принудительно укажите выходной путь:
<PropertyGroup>
<OutputPath>your\output\path\</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
</PropertyGroup>
Скопируйте ресурсы в выходной путь:
<ItemGroup>
<None Update = "data\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update = "saves\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Решение №1 работает отлично. Спасибо!
Вы можете перемещаться по дереву каталогов от каталога работающего приложения до тех пор, пока не найдете нужные каталоги. Что-то вроде
while (!Directory.Exists(Path.Combine(dataBasePath,"data"))) dataBasePath = Directory.GetParent(dataBasePath);