想要将WinForm应用程序的数据文件放在文件夹中,并在代码中获取其路径

本文关键字:文件夹 代码 路径 获取 WinForm 应用程序 文件 数据 | 更新日期: 2023-09-27 18:12:44

我想使用一个数据文件并从WinForms应用程序中读取它。如果我使用Application.ExecutablePath或Application.StartupPath之类的方法,它们会引用文件夹。。''bin''debug,这在非VS托管的应用程序中是不同的。无论我是否处于调试模式,我都想使用根文件夹之外的文件夹并获得对它的引用,即它总是正常工作。

做这件事的好方法是什么?我不喜欢使用嵌入式资源文件,也不喜欢使用硬编码的完整路径。它需要是应用程序根文件夹的相对路径。

类似于ASP.NET 中的~/App_Data

添加:

我想使用一个相对路径离开"某些路径"。无论我是在VS的调试模式、非调试模式还是部署了应用程序,我都在寻找"某些路径"。就像ASP.NET的"~"。它不在乎网站在哪里,也不在乎你是否在VS中。我不想在"调试"文件夹下创建文件夹。不管怎样都是同一个文件夹。"某些文件夹"也不在VS的应用程序文件夹中,因为该应用程序将被压缩以在不部署或发布的情况下使用。

想要将WinForm应用程序的数据文件放在文件夹中,并在代码中获取其路径

尝试访问当前执行程序集的位置:

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

这将为您提供执行EXE/DLL程序集的目录。然后可以为数据文件创建一个子目录。这种情况有时不适用于单元测试框架。

我的解决方案。转到两个文件夹级别,然后转到数据文件夹:

    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";

ExecutablePath将正常工作,只要您的数据文件在发布和产品部署中也在bin中。重点是,通常这不是更改数据库等文件的最佳位置。在这种情况下,我认为您应该使用ApplicationData等SpecialFolders。

您可能想要使用Environment.GetFolderPath方法,并将其作为各种系统数据文件夹的枚举之一。完整的通话可能看起来像

return Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);

我是这样做的。首先,我在winform应用程序的appdata文件夹中添加本地数据库,然后首先为现有数据库添加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连接我的本地数据库以获取数据时,我遇到了错误,因为我的数据库在appdata文件夹中。所以我将DataDirectory路径添加到应用程序域,然后问题就解决了。

这是小代码。

AppDomain.CurrentDomain.SetData("DataDirectory", AppDomain.CurrentDomain.BaseDirectory + "App_Data");
EmployeeDB db = new EmployeeDB();
var data = db.Employees.ToList();

我希望我的回答能对将来的某个人有所帮助。感谢