Не удается найти XML-файлы в опубликованном проекте C #

#c# #visual-studio #winforms #visual-studio-code #visual-studio-2019

#c# #visual-studio #winforms #visual-studio-code #visual-studio-2019

Вопрос:

Итак, я создал приложение Windows Forms на C # с помощью Visual Studio. Приложение сохраняет данные в XML-файлах в C:UsersMesourcereposMyAppMyAppbinDebug (расположение по умолчанию) и отлично работает при сборке внутри VS.

Моя программа использует простые выражения LINQ для чтения из файла .xml:

 XDocument.Load("myfile.xml");
// do something with it
  

Однако, когда я пытаюсь опубликовать приложение и запустить его как отдельный файл манифеста приложения, я получаю следующую ошибку при попытке прочитать один из XML-файлов:

 Unhandled Exception: System.IO.FileNotFoundException: Could not find file 'C:UsersMeAppDataLocalApps.......
  

Очевидно, что это вызвано неправильным путем к файлу, но как это исправить? Я пробовал различные методы в Интернете, но, похоже, ничего не работает. Я не могу переместить XML-файлы из папки debug, не нарушая сборку. Я думаю, мне нужно что-то сделать в свойствах сборки?

Спасибо!

Комментарии:

1. Можете ли вы опубликовать свой код?

2. @TontonVelu мой код просто выполняет функцию чтения XML-файла с помощью LINQ. Он ссылается на файл с помощью XDocument. Загрузить («file.xml «). Я не буду включать код, поскольку не думаю, что это поможет объяснить мою проблему, этот вопрос больше касается того, как Visual Studio изменяет структуру файлов после публикации и, следовательно, нарушает мою программу. Спасибо

Ответ №1:

Как вы заметили, автономное приложение запускается из вашей папки AppData (exe-файл фактически «разархивирован» и запускается из этого временного расположения).

Вы можете использовать этот пример кода, чтобы получить путь, по которому запускается ваше приложение (расположение .exe):

 var processModule = Process.GetCurrentProcess().MainModule;
if (processModule == null)
{
    Environment.Exit(-1);
}
var baseDirectory = Path.GetDirectoryName(processModule.FileName);
const string settingsFile = "myfile.xml";
string fullSettingsPath = Path.Combine(baseDirectory, settingsFile);
XDocument.Load(fullSettingsPath);
  

Чтобы ваш XML-файл не стал частью автономного приложения, вам необходимо добавить его в свой файл .csproj:

   <ItemGroup>
    <None Update="myfile.xml">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    </None>
  </ItemGroup>
  

Ответ №2:

Не удалось найти файл ‘C:UsersMeAppDataLocalApps ……

Вы опубликовали приложение через ClickOnce?

Если это так, вы можете включить xml в Application Files... .

введите описание изображения здесь

И получите доступ к адресу файла с помощью следующего оператора.

 string filepath = ApplicationDeployment.CurrentDeployment.DataDirectory   @"myfile.xml";