C# 如何使CommonOpenFileDialog的InitialDirectory成为用户的MyDocuments路径,而不是Libraries\Documents?

C# 如何使CommonOpenFileDialog的InitialDirectory成为用户的MyDocuments路径,而不是Libraries\Documents?,c#,wpf,C#,Wpf,我正在使用Windows API代码包中的CommonOpenFileDialog作为文件夹选择器对话框。我正在将InitialDirectory属性设置为Environment.GetFolderPathEnvironment.SpecialFolder.MyDocuments。但是,当我显示对话框时,地址栏中的路径是Libraries\Documents,而不是我预期的C:\users\craig\my Documents。此外,如果我只按“选择文件夹”按钮,我会看到一个对话框,上面写着“您

我正在使用Windows API代码包中的CommonOpenFileDialog作为文件夹选择器对话框。我正在将InitialDirectory属性设置为Environment.GetFolderPathEnvironment.SpecialFolder.MyDocuments。但是,当我显示对话框时,地址栏中的路径是Libraries\Documents,而不是我预期的C:\users\craig\my Documents。此外,如果我只按“选择文件夹”按钮,我会看到一个对话框,上面写着“您选择了一个库”。请改为选择一个文件夹。“

有人知道为什么我的文件路径被忽略,而选择“库\文档”吗?更重要的是,如何让对话框尊重我传入的InitialDirectory值

我在对话框中使用的代码是:

if (CommonFileDialog.IsPlatformSupported)
{
    var folderSelectorDialog = new CommonOpenFileDialog();
    folderSelectorDialog.EnsureReadOnly = true;
    folderSelectorDialog.IsFolderPicker = true;
    folderSelectorDialog.AllowNonFileSystemItems = false;
    folderSelectorDialog.Multiselect = false;
    folderSelectorDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    folderSelectorDialog.Title = "Project Location";

    if (folderSelectorDialog.ShowDialog() == CommonFileDialogResult.Ok)
    {
      ShellContainer shellContainer = null;

      try
      {
        // Try to get a valid selected item
        shellContainer = folderSelectorDialog.FileAsShellObject as ShellContainer;
      }
      catch
      {
        MessageBox.Show("Could not create a ShellObject from the selected item");
      }

      FilePath = shellContainer != null ? shellContainer.ParsingName : string.Empty;
    }
}
谢谢

-克雷格首先,很抱歉我花了这么长时间才理解你的问题

我在尝试时看到的信息是:

无法在上操作 “库\文档”,因为它是 不是文件系统的一部分

没什么好说的了。库是一个虚拟文件夹,它是各种不同真实文件夹的合并

没有真正的方法可以避免这个错误。您已要求对话框返回文件夹,但用户尚未选择文件夹。因此,对话无法履行其在协议中的职责

如果您进一步进入文件夹结构,进入真实文件夹,则对话框将返回真实值。

而不是

folderSelectorDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
试一试


您从Environment.GetFolderPathEnvironment.SpecialFolder.MyDocuments获得的路径是什么?Libraries/Documents是Win7上的MyDocuments文件夹。它是有效的。@Brent:你得到的路径是C:\users\Craig\My Documents,假设Craig是你的username@Hans:我不反对库\文档指向我的文档。我的问题是,如上所述,尝试选择该文件夹作为初始目录时,会出现一个对话框,显示“您选择了一个库”。请改为选择一个文件夹'。因此,我希望对话框显示文件系统路径,而不是库路径。在Win7上,文件夹不会命名为My Documents。有一个隐藏的重分析点,可以重定向到文档以保持遗留代码正常工作。如果你真的从Environment.GetFolderPath获取了我的文档,那么这台机器就乱七八糟了。基于MyDocuments和Personal是等效的。这主意不错,但不幸的是,它还生成了“你选择了一个库…”对话框。我对友好名称的显示没有异议。但是,该对话框无法将友好名称转换回文件路径,显示“您已选择一个库”。“请选择一个文件夹”对话框。这就是我试图避免的,让它使用文件路径而不是库路径。@Craig最后我想我理解了你的问题@大卫:好的。那么,如果我不能阻止初始目录转换为库路径,有没有办法将返回的库路径转换回文件路径,或者完全捕获它?例如,假设我更改了对话框代码,使AllowOnFileSystemItems设置为true。然后我运行对话框并选择对话框左侧的“Libraries”文件夹,然后按“select folder”(选择文件夹)按钮。返回的“路径”为:{031E4825-7B94-4DC3-B131-E946B44C8DD5}。我怎样才能发现这不是一个文件路径,这样我就可以强迫用户再试一次?@Craig a library是一个虚拟文件夹,它是各种不同真实文件夹的合并。它不是一个文件夹。如果在库中选择一个文件,则会返回实际路径。但是虚拟文件夹没有文件系统名。@David:我明白,但这并不能回答我的问题。正如我指出的,对话框将返回一个字符串,无论我选择的是库还是路径。如果我选择一个库,它将返回我上面提到的GUID。是否有一个函数可以将返回的字符串传递给它,以确认它是否是文件路径?
folderSelectorDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);