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

时间:2012-01-09 17:33:35

标签: c# c++ windows winapi

我注意到浏览文件夹对话框中的错误似乎是什么:

  1. 打开具有“新建文件夹”按钮的文件夹对话框的新样式浏览。 (例如,.NET Framework中的FolderBrowserDialog类,或Win32 C ++中的SHBrowseForFolder)。
  2. 单击“创建新文件夹”按钮以创建新文件夹。
  3. 键入新文件夹的名称。完成输入后,请勿按Enter键或单击任何内容以停止编辑新文件夹名称。
  4. 当光标仍然闪烁/编辑框仍处于活动状态时,单击“确定”按钮。您必须非常快速地单击“确定”按钮。
  5. 对话框返回“新文件夹”目录,而不是将文件夹的新名称返回给程序。例如,C:\New Folder而不是用户输入的内容,例如C:\My App Data Files
  6. 我的猜测是对话框的OK按钮从按钮的“click / mouse-up”事件中的树视图中读取文件夹名称。如果您足够快地单击它,对话框将读取旧值“新文件夹”,因为树视图没有足够的时间来处理重命名。

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

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

    还有其他人看过这个并知道解决方法/修复方法吗?自Windows 2000以来,这种新式对话已经存在;我不敢相信现在还没有看到/修复,但我找不到细节!我知道用户可以通过例如解决方法解决这个问题。按Enter键,等待片刻,然后单击“确定”。但似乎具有较少计算机经验的用户不知道这一点,并且它会绊倒它们。所以我正在寻找程序化的解决方法/修复。

2 个答案:

答案 0 :(得分:3)

我建议您将目标设定得很低,因为此时您正在努力修复操作系统本身。

在对话框退出后,请考虑检查GetFileAttributes(folderName) == INVALID_FILE_ATTRIBUTES是否正确。

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

答案 1 :(得分:2)

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

可能总是有效,但它不是万无一失的,所以它不能被认为是健全的。

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

这是风险和不便之间的权衡。