Хотите разместить файлы данных для приложения WinForm в папке и получить его путь в коде - PullRequest
3 голосов
/ 31 октября 2011

Я хочу использовать файл данных и читать его из приложения WinForms.Если я использую такие методы, как Application.ExecutablePath или Application.StartupPath, они ссылаются на папку .. \ bin \ debug, которая отличается от приложения, не размещенного на VS.Я хочу использовать папку вне корневой папки и получить ссылку на нее независимо от того, нахожусь ли я в режиме отладки или нет, то есть она всегда работает правильно.

Какой хороший способ сделать это?Я предпочитаю не использовать встроенный файл ресурсов и не использовать жестко закодированные полные пути.Это должен быть относительный путь к корневой папке приложения.

Что-то вроде ~ / App_Data в ASP.NET

Добавление:

Я хочуиспользовать относительный путь от "некоторого пути".«Какой-то путь» - это то, что я ищу, независимо от того, нахожусь ли я в VS в режиме отладки, не в режиме отладки или если приложение развернуто.Как и в ASP.NET "~".Неважно, где сайт или вы в VS.Я не хочу создавать папку в папке «debug».Это та же папка, несмотря ни на что.«Некоторая папка» также находится вне папки приложения VS, поскольку приложение будет упаковано в архив для использования без развертывания или публикации.

Ответы [ 5 ]

1 голос
/ 31 октября 2011

Попробуйте получить доступ к местоположению текущей исполняемой сборки:

string path = System.Reflection.Assembly.GetExecutingAssembly().Location
string fullFilePath = Path.Combine(path, "myfile");
..do something with your data file.

Это дает вам каталог, в котором была выполнена ваша сборка EXE / DLL. Затем вы можете создать подкаталог для ваших файлов данных. Это иногда не работает с платформой модульных тестов.

1 голос
/ 31 октября 2011

Мое решение. Поднимитесь на два уровня папки и затем в папку данных:

    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";
0 голосов
/ 17 ноября 2018

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

вот маленький код.

AppDomain.CurrentDomain.SetData("DataDirectory", AppDomain.CurrentDomain.BaseDirectory + "App_Data");

EmployeeDB db = new EmployeeDB();
var data = db.Employees.ToList();

Я надеюсь, что мой ответ поможет кому-нибудь в будущем. спасибо

0 голосов
/ 02 марта 2012

Возможно, вы захотите использовать метод Environment.GetFolderPath и передать ему одно из перечислений для различных папок с данными системы .Полный вызов может выглядеть как

return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
0 голосов
/ 31 октября 2011

ExecutablePath будет работать правильно до тех пор, пока ваши файлы данных будут в корзине также при выпуске и развертывании.Дело в том, что обычно это не лучшее место для изменения файлов, таких как базы данных, в этом случае, я думаю, вам следует использовать специальные папки, такие как ApplicationData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...