在 Windows 系统中,我们经常会见到「目录」和「文件夹」两个名词,但很多人会这两个概念混用,甚至搞不清楚它们的区别,包括写这篇博文的我,之前也是一样。同样表示「文件夹」的概念,为什么会有两个说法?事实上,这两个词不仅仅是在中文中,在英文原文中,也是有两个不同的词汇,Directory 和 Folder。通常,Directory 被翻译成「目录」,而 Folder 被翻译成「文件夹」。但实际的情况是,很多情况下,这两个的翻译都比较混乱,Directory 也经常被翻译为「文件夹」。那么微软使用 Directory 和 Folder 这两个名词到底什么不同的意义和差异呢?这个问题我多年也没搞清楚,直到最近又在网上搜索资料,并自己进行一些测试后,才发现他们的细微差别。
首先,作为一个 Windows 开发人员,注册表、文件关联等都应该是了解的。那么大家应该都知道,在 Windows 的注册表编辑器中的 HKEY_CLASSES_ROOT 节点下面,有 Directory 和 Folder 两个子键,类似其他的 ProgId 子键,支持在其 shell 子键添加自定义的动作和命令。有一天我突发奇想,如果我分别在这两个位置添加一个动作项,系统该如何显示它们?于是我分别在不同的位置单独添加注册表项,然后观察右键菜单,发现了其中的秘密:
仅在 HKEY_CLASSES_ROOT\Directory\shell 下面随便添加一个节点,如 action,我分别在「计算机」、「回收站」、「计算机」中的任意驱动器、普通文件夹上点击右键,只有普通的文件夹右键菜单中出现了 action 这一菜单项。
仅在 HKEY_CLASSES_ROOT\Folder\shell 下面随便添加一个节点,如 action,我分别在「计算机」、「回收站」、「计算机」中的任意驱动器、普通文件夹上点击右键,所有这些项目的右键菜单中均出现了 action 这一菜单项。
仅在 HKEY_CLASSES_ROOT\Drive\shell 下面随便添加一个节点,如 action,我分别在「计算机」、「回收站」、「计算机」中的任意驱动器、普通文件夹上点击右键,只有驱动器盘符右键菜单中出现了 action 这一菜单项。
如此看来,Folder 的范围其实是很大的,它包括了系统中所有可以双击打开并查看其内容的「文件夹」项目,包括「计算机」、「回收站」、「控制面板」等这些虚拟文件夹,以及「计算机」中的所有磁盘驱动器,以及其中的任何文件夹 (Directory)。
而 Directory 的概念则小的很多,它必须是存在于物理磁盘上的一个「文件夹」项目,而「计算机」中的所有磁盘驱动器,如「本地磁盘 (C:)」则不认为是 Directory。
总结:如果是开发外壳扩展 dll,最好根据需要写入到正确的子键下面,不要在 Directory 和 Folder 等子键下乱写一通。虽然有的外壳扩展不支持虚拟文件夹,写在 Directory 下系统也并不会加载,但还是希望各位开发人员能够正确遵守规范。