Win32浏览文件夹对话框:当用户创build一个新文件夹时返回错误的文件夹

我已经注意到浏览文件夹对话框中似乎是一个错误:

  1. 打开具有“新build文件夹”button的新样​​式文件夹对话框。 (例如,.NET Framework中的FolderBrowserDialog类,或者Win32 C ++中的SHBrowseForFolder)。
  2. 点击“创build新文件夹”button创build一个新的文件夹。
  3. input新文件夹的名称。 不要按Enter或点击任何东西来停止编辑新的文件夹名称。
  4. 光标仍在闪烁时,编辑框仍处于活动状态,请单击确定button。 您必须非常快速地单击确定button。
  5. 而不是将新文件夹的名称返回到程序,对话框将返回“新build文件夹”目录。 例如, C:\New Folder而不是用户input的内容,例如C:\My App Data Files

我的猜测是对话框的OKbutton从button的“click / mouse-up”事件中的树视图中读取文件夹名称。 如果点击速度足够快,对话框将读取旧值“新build文件夹”,因为树视图没有足够的时间来处理重命名。

最终的结果是,对话框返回到不再存在的目录(因为它已被重命名),然后应用程序失败。

我可以在我的Windows 7开发人员工作站上重现这一点,但不限于该计算机。 它在我们生产的C ++应用程序和原型C#应用程序中都得到了重现。

有没有其他人看到这个,知道一个解决方法/修复? 自Windows 2000以来,这种新型的对话框就已经出现了。 我不能相信这个现在还没有被看到/固定,但我找不到细节! 我知道它可以由用户通过例如按Enter键,等待片刻,然后单击确定。 但是,似乎用户较less的计算机使用经验并不知道这一点,而是让他们绊倒了他们。 所以我正在寻找一个程序化的解决方法/修复。

我建议设置你的野心低,因为你有效地试图修复操作系统本身在这一点上。

考虑在退出对话框后检查GetFileAttributes(folderName) == INVALID_FILE_ATTRIBUTES

如果该表达式为真,则再次显示该对话框。 这至少可以防止崩溃或其他故障情况。

您可以检查选定文件夹的存在(无论如何,一个好的做法),如果它不存在,被称为“新建文件夹”,获取父文件夹,找到几秒前由当前创建的子文件夹用户,并假设这是他们想要的。

可能会一直工作,但它不是万无一失的,所以它不能被认为是健壮的。

最强大的解决方案只是检测条件,并强制用户再次选择文件夹。

这是风险和不便之间的折衷。