#c# #.net #winforms
#c# #.net #winforms
Вопрос:
Я хочу использовать файл данных и прочитать его из приложения WinForms. Если я использую такие методы, как Application.ExecutablePath или Application.StartupPath они ссылаются на папку..bin debug, который отличается в приложении, отличном от размещенного. Я хочу использовать папку из корневой папки и получать ссылку на нее независимо от того, нахожусь ли я в режиме отладки или нет, т. Е. Он всегда работает правильно.
Какой хороший способ это сделать? Я предпочитаю не использовать встроенный файл ресурсов и не использовать жестко закодированные полные пути. Это должен быть относительный путь к корневой папке приложения.
Что-то вроде ~/App_Data в ASP.NET
Добавление:
Я хочу использовать относительный путь от «некоторого пути». «Некоторый путь» — это то, что я ищу, независимо от того, нахожусь ли я в VS в режиме отладки, без режима отладки или если приложение развернуто. Точно так же, как ASP.NET ‘s «~». Неважно, где находится сайт или находитесь ли вы в VS. Я не хочу создавать папку в папке «debug». Это одна и та же папка, несмотря ни на что. «Некоторая папка» также отсутствует в папке приложения VS, потому что приложение будет заархивировано для использования без развертывания или публикации.
Комментарии:
1. Что такое «корневая папка приложения»? Вы не собираетесь отправлять свой проект своему клиенту. На самом деле это Path.GetDirectoryName(StartupPath), он правильно указывает местоположение программы независимо от того, где она находится или как она размещена. Скопируйте свои данные туда же. Поддерживается системой сборки с копированием в выходной каталог.
Ответ №1:
Попробуйте получить доступ к местоположению текущей исполняемой сборки:
string path = System.Reflection.Assembly.GetExecutingAssembly().Location
string fullFilePath = Path.Combine(path, "myfile");
..do something with your data file.
Это дает вам каталог, в котором выполняется ваша сборка EXE / DLL. Затем вы можете создать подкаталог для ваших файлов данных. Иногда это не работает с фреймворком модульных тестов.
Комментарии:
1. Это не сработало бы, если бы программа была установлена на что-то вроде
Program Files..
. У пользователя может не быть необходимых прав на этот каталог2. Он указывает на debug bin, когда я нахожусь в режиме отладки VS. Ничем не отличается от примеров, которые я опубликовал.
Ответ №2:
Мое решение. Перейдите на два уровня папок, а затем в папку с данными:
string appPath = Path.GetDirectoryName(Application.ExecutablePath);
System.IO.DirectoryInfo directoryInfo = System.IO.Directory.GetParent(appPath);
System.IO.DirectoryInfo directoryInfo2 = System.IO.Directory.GetParent(directoryInfo.FullName);
string path = directoryInfo2.FullName @"data";
Комментарии:
1. Я бы не стал использовать каталог установки для файлов данных. Вместо этого используйте папку ApplicationData. Например: Окружающая среда. GetFolderPath(среда. Специальная папка. Среда LocalApplicationData). GetFolderPath(среда. Специальная папка. Среда ApplicationData). GetFolderPath(среда. Специальная папка. CommonApplicationData)
Ответ №3:
ExecutablePath будет работать правильно, пока ваши файлы данных будут находиться в корзине также при выпуске и развертывании продукта. Дело в том, что обычно это не лучшее место для изменения файлов, таких как базы данных, в этом случае, я думаю, вам следует использовать специальные папки, такие как ApplicationData.
Ответ №4:
Вероятно, вы хотите использовать среду.Получите метод folderpath и передайте ему одно из перечислений для различных системных папок с данными. Полный вызов может выглядеть так
return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
Ответ №5:
Я сделал это так. сначала я добавляю локальную базу данных в папку app_data в моем приложении winform, а затем сначала добавляю код EF для существующей базы данных. затем в мой файл app.config была добавлена строка подключения.
<connectionStrings>
<add name="EmployeeDB" connectionString="data source=(LocalDB)v11.0;attachdbfilename=|DataDirectory|Database1.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
когда я пытаюсь подключить свою локальную базу данных с помощью EF для извлечения данных, я получил сообщение об ошибке, потому что моя база данных находилась в папке app_data. итак, я добавляю путь к каталогу данных в домен приложения, после чего проблема была решена.
вот небольшой код.
AppDomain.CurrentDomain.SetData("DataDirectory", AppDomain.CurrentDomain.BaseDirectory "App_Data");
EmployeeDB db = new EmployeeDB();
var data = db.Employees.ToList();
я надеюсь, что мой ответ поможет кому-то в будущем. Спасибо