我想知道为什么某些应用程序在其 Windows“另存为”对话框中显示最近访问的目录时会有不同的行为。例如,当我使用 Adobe Photoshop CC 时,我可以选择地址栏右侧的下拉箭头:
将出现一个目录列表,但它不是按最近排列的。它显示的目录几乎是随机的。事实上,有些目录我什至从未从应用程序中保存过,这让我相信不是应用程序在管理列表,而是一些 Windows 功能。
与此相反,其他应用程序(例如 3dsMax)会根据实际访问的目录填充列表,并按照上次访问的时间顺序列出它们:
由于“另存为”窗口的行为方式,我知道这些程序以不同的方式实现“另存为”。在 Photoshop 中,用户可以在地址栏中选择目录路径并从剪贴板粘贴路径(或手动输入)。
相比之下,3dsMax 允许这样做的方式略有不同(顶部的地址栏实际上是应用程序实现的历史记录栏,但用户可以通过下拉式菜单导航目录,或在文件名中粘贴目录名称场地。
这些只是示例(每个示例都有自己的优点和缺点),但是它们表明,在“另存为”窗口中,并不存在适用于所有应用程序的通用行为。
我对所有这些感到困惑,因为当调用“另存为”功能时,似乎所有应用程序都在使用某种形式的 Explorer 外壳。我相信它们使用的是 Explorer shell,因为我们仍然可以在这些窗口中执行复制文件、创建新文件夹、删除文件和撤消操作等资源管理器功能。
这让我想到了我的问题:
当 Windows 应用程序都使用某种形式的 Explorer shell 时,为什么它们在保存到最近访问的目录时会有不同的行为?
这两件事并不相互排斥——可以只嵌入“ShellFolderView”控件(Explorer 使用的图标/列表视图),同时仍然围绕它构建一个完全自定义的对话框,这正是 3dsMax 最有可能做到的。它与嵌入标准“按钮”或“下拉列表框”控件非常相似。
真的,这也是标准的打开/保存对话框的作用。标准对话框也不是资源管理器窗口——它只是被建模为看起来有点像,但实际上它只是一个嵌入了 ShellFolderView 的对话框窗口。(最初在 Windows 95 中,它甚至没有可用的常用“资源管理器”功能;在 Windows 98 中添加了从“打开/保存”对话框中管理文件的功能。)
(这个项目让我想起了一个具体的例子,Office 2000 也带来了它自己的文件打开/保存对话框,具有独特的外观(侧边栏和预览窗格,标准 Windows 对话框当时都没有);整个对话框是自定义构建的,除了具有类似的布局和嵌入标准文件夹视图。)
也可以构建提供几乎相同功能的自定义图标/列表视图控件。任何程序都可以创建新文件夹,但 Explorer 本身提供对其许多功能的编程访问 - 例如,任何程序都可以导致弹出 Explorer 样式的右键单击菜单(带有扩展名),并且任何程序都可以请求删除文件通过资源管理器来完成。
(第三方文件管理器,如 Total Commander 经常这样做;文件列表是自定义的,但如果需要,可以通过 shell 直接进行交互。Total Commander 自行处理文件移动/重命名,因为任何程序都可以重命名文件,但它允许通过资源管理器进行删除,以便文件进入回收站。)