Forms.OpenFileDialog()和Forms.FolderBrowserDialog()初始路径行为

时间:2016-02-23 17:35:45

标签: c# openfiledialog folderbrowserdialog

在我的应用程序中,我在按钮点击处理程序上同时使用OpenFileDialogFolderBrowserDialog

var fileDialog = new System.Windows.Forms.OpenFileDialog();

var folderDialog = new System.Windows.Forms.FolderBrowserDialog();

奇怪的是,当调用OpenFileDialog时,它会从上次选择文件的文件夹中的资源管理器中启动。 但无论上次选择哪个文件夹,FolderBrowserDialog每次都会在资源管理器中打开MyComputer。如何为“FolderBrowserDialog'”获得相同的行为(记住最后选择的文件夹)?

在OpenFileDialog' OpenFileDialog'存储最后选择的文件的文件夹? Windows是否为每个应用程序存储它?

1 个答案:

答案 0 :(得分:5)

您可以在打开前使用FolderBrowserDialog属性设置SelectedPath所选文件夹:

var folderDialog = new System.Windows.Forms.FolderBrowserDialog();
folderDialog.RootFolder = System.Environment.SpecialFolder.MyComputer;
folderDialog.SelectedPath = <variable_where_you_stored_the_last_path>;

例如:

private string _lastFolderDialog = null;
// ...
var folderDialog = new System.Windows.Forms.FolderBrowserDialog();
folderDialog.SelectedPath = _lastFolderDialog;
if(folderDialog.ShowDialog() == DialogResult.OK)
{
  _lastFolderDialog = folderDialog.SelectedPath;
}

对于OpenFileDialog,我认为你的意思是:

fileDialog.InitialDirectory =
               Environment.GetFolderPath(System.Environment.SpecialFolder.MyComputer);

然而,由于MyComputer没有路径,因此无法工作。试试这个:

fileDialog.InitialDirectory = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"

您可以在HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID

下的注册表中检查其他CLSID

正如您已经发现的,如果InitialDirectory设置为null,它会记住上次打开的文件夹。 FolderBrowserDialog虽然

,却不会发生这种情况

所有这一切,正如我在评论中所说,FolderBrowserDialog已经过时,你根本不应该使用它。根据支持它的原生API(SHBrowseForFolder)的MSDN

  

对于Windows Vista或更高版本,建议您将IFileDialog与FOS_PICKFOLDERS选项一起使用,而不是使用SHBrowseForFolder函数。这在选择文件夹模式下使用“打开文件”对话框,是首选实现。

您可能需要检查this question(反过来链接到this page)或this other question,了解如何在.NET中使用IFileDialog实现FOS_PICKFOLDERS < / p>