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

Forms.OpenFileDialog() and Forms.FolderBrowserDialog() initial path behavior

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

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

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

奇怪的是,当调用 OpenFileDialog 时,它从资源管理器中上次选择文件的文件夹开始。 但是 FolderBrowserDialog 无论上次选择什么文件夹,每次都在资源管理器中打开我的电脑。如何为“FolderBrowserDialog”获得相同的行为(记住上次选择的文件夹)?

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

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

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 已经过时了,您根本不应该使用它。根据MSDN for native API (SHBrowseForFolder) 支持它:

For Windows Vista or later, it is recommended that you use IFileDialog with the FOS_PICKFOLDERS option rather than the SHBrowseForFolder function. This uses the Open Files dialog in pick folders mode and is the preferred implementation.

您可能想查看 this question (which in turn links to this page) or this other question 如何在 .NET

中使用 FOS_PICKFOLDERS 实现 IFileDialog