Win32“浏览文件夹”对话框:用户创建新文件夹时返回错误的文件夹
Win32 Browse for folder dialog: wrong folder returned when user creates a new folder
我注意到浏览文件夹对话框中似乎有一个错误:
- 打开带有"新建文件夹"按钮的新样式浏览文件夹对话框。(例如,.NET Framework中的FolderBrowserDialog类,或Win32 C++中的SHBrowseForFolder)
- 单击"创建新文件夹"按钮创建新文件夹
- 键入新文件夹的名称。键入新文件夹名称后,不要按Enter键或单击任何按钮停止编辑
- 当光标仍在闪烁/编辑框仍处于活动状态时,单击"确定"按钮。您必须快速单击"确定"按钮
- 对话框不会将文件夹的新名称返回到程序,而是返回"新文件夹"目录。例如,
C:New Folder
而不是用户键入的内容,例如C:My App Data Files
我的猜测是对话框的OK按钮在按钮的"点击/鼠标向上"事件中从树视图中读取文件夹名称。如果单击速度足够快,对话框将读取旧值"New folder",因为树视图没有足够的时间处理重命名。
最终的结果是,对话框返回一个不再存在的目录的路径(因为它被重命名了),然后应用程序就会失败。
我可以在我的Windows7开发者工作站上复制它,但它并不局限于那台计算机。它已经在我们的生产C++应用程序和原型C#应用程序中复制。
有没有其他人看到过这一点并知道变通方法/修复方法?这种新型对话框自Windows2000以来就一直存在;我不敢相信到目前为止还没有看到/修复,但我找不到详细信息!我知道用户可以通过按Enter键,等待片刻,然后单击"确定"来解决这个问题。但似乎计算机经验较少的用户不知道这一点,这会让他们感到困惑。因此,我正在寻找一个程序化的变通方法/修复方法。
我建议降低你的野心,因为此时你实际上正在尝试错误修复操作系统本身。
请考虑在对话框退出后检查是否为GetFileAttributes(folderName) == INVALID_FILE_ATTRIBUTES
。
如果该表达式为true,则再次显示对话框。这至少可以防止崩溃或其他故障情况。
您可以检查所选文件夹是否存在(无论如何,这是一种很好的做法),如果它不存在,并且被称为"新文件夹",则获取父文件夹,找到当前用户几秒钟前创建的子文件夹,并假设这就是他们想要的文件夹。
这将可能总是有效的,但它不是万无一失的,所以它不能被认为是健壮的。
最稳健的解决方案只是检测条件并强制用户再次选择文件夹。
这是风险和不便之间的权衡。
- 如何在文档文件夹中创建目录
- 如何从Windows控制台调用.exe(C++)以在不同的目录(或任何目录)中创建文件夹?
- 如何使用Windows API C++更改已创建的文件夹/目录安全权限
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 在c++编程中的文件夹中创建文件
- 创建文件夹结构
- 在C++中创建文件夹
- 如何使用 c++ 创建对"everyone"具有共享访问权限的文件夹
- 如何在 C++ 中创建一个适用于 Windwos 和 Linux 的文件夹(目录)
- 如果C 中不存在,如何创建文件夹
- 如何将用于创建文件的文件的路径提供给C++中的其他文件夹
- 如何在%appdata%中创建文件夹,在其中创建.bat文件,然后执行它?
- 无法创建将包含日志文件的文件夹
- Windows 7:MFC ActiveX 控件不会在任何文件夹中创建文件
- 嵌入 LuaJIT - 创建包含文件夹
- C - 创建文件夹方法
- 如何在Visual Studio C 2012中创建文件夹
- 如何以编程方式为应用程序创建文件夹,以使用 BOX REST API 在其中上传内容
- 为什么Qt在Qt内部运行时或调试时不会创建文本文件,而是直接从调试文件夹创建文本文件
- 如何从文件文件夹创建自定义文件类型