C#具有不同目录的多个OpenFileDialog框

时间:2015-03-20 09:02:15

标签: c# path directory

在我的应用程序中,我有两个OpenFileDialogs,用户在其中选择不同的文件类型。第一个openfiledialog用于选择位于目录A的配置文件,第二个用于选择位于目录B的xml文件。

我的问题是,当我尝试打开其中一个对话框时,它只会将我带到一个目录,该目录是xml文件的目录;永远不会在配置文件的文件夹上。用户必须浏览文件夹才能找到配置文件的文件夹。

我试过了:

openFileDialog1.InitialDirectory = @"C:\Users\uidr3024\Downloads\Tool\cfg";

和此:

openFileDialog2.InitialDirectory = @"C:\Users\uidr3024\Downloads\Tool\XMLs";

它有效。但是,当应用程序在另一台计算机上使用时,我该怎么办,可能有一个不同的文件夹名称为"工具"但仍然是" cfg"的相同文件夹名称;和" XMLs"。

我在考虑GetFullPathGetTempPath,但我不确定。

2 个答案:

答案 0 :(得分:0)

在项目结构中使用相对路径。 或者也许是安装路径。 %程序文件%/ myapp / tools / xml 要么 C:\ Users \用户%USERNAME%\应用程序数据

答案 1 :(得分:0)

如评论中所述,您不应使用绝对路径 .Net框架具有一些功能,可以为您检索变量路径,这些路径将是特定于用户的,而不是将它们用于存储/加载位置。

可以使用Environment.GetFolderPath()方法获取公用文件夹路径。这将返回系统定义的各种位置的位置。这将确保您永远不必处理机器上的目录是否正确或不同,因为您的引用始终是相对的而不是绝对的。
在您的情况下,您可以使用它来访问项目的配置文件特定文件夹

// Use the Environment.GetFolderPath with Environment.SpecialFolder.ApplicationData
// to retrieve the %userprofile%\AppData\Roaming folder for the user
// Also use Path.Combine to link that path to your relative paths.
openFileDialog1.InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"<YourAppName>\Tools\cfg");

openFileDialog1.InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"<YourAppName>\Tools\XML");

由于您在示例代码中使用了Downloads文件夹,您会注意到Downloads目录中没有特殊的文件夹枚举器,该目录已被评论并在SO上询问了几次。
我发现的最佳解决方案,在其他语言设置中使用时也是正确的,可在this answer中找到。

利用您在该答案中找到的代码/类,您可以使用简单代码

检索用户配置文件的Downloads文件夹
openFileDialog1.InitialDirectory = Path.Combine(KnownFolders.GetDefaultPath(KnownFolder.Downloads), @"<YourAppName>\Tools\cfg");
openFileDialog1.InitialDirectory = Path.Combine(KnownFolders.GetDefaultPath(KnownFolder.Downloads), @"<YourAppName>\Tools\XML");

额外信息:

我建议你有一个中心位置来存储&#39;或生成您的文件夹名称。这将确保您只需要添加或更改文件夹名称的位置,而不必搜索整个代码库以查找特定字符串的使用。

您可以为此目的使用/扩展的辅助类的一个小示例:

public static class DirectoryStrings
{
  private const string AppFolderName = "MyAppName";

  public static string ToolsFolderName
  {
    get { return Path.Combine(KnownFolders.GetDefaultPath(KnownFolder.Downloads), AppFolderName, "Tools"); }
  }

  public static string XmlFolderName
  {
    get { return Path.Combine(ToolsFolderName, "XML"); }
  }

  public static string CfgFolderName
  {
    get { return Path.Combine(ToolsFolderName, "cfg"); }
  }
}

然后允许干净的代码

openFileDialog1.InitialDirectory = DirectoryStrings.XmlFolderName;