DIR 命令报告不正确的文件

DIR 命令报告不正确的文件

请注意以下命令和实际反馈。

C:\Temp\AEAPI> dir apb*.*

 Volume in drive C is XXXXXXXX
 Volume Serial Number is XXXX-XXXX
 Directory of C:\Temp\AEAPI

01/08/2009  07:24             9.693 apex_item007.htm
01/08/2009  07:24             6.176 apex_util078.htm
01/08/2009  07:24             5.673 apex_ui_default008.htm
01/08/2009  07:24             8.414 apex_util016.htm
01/08/2009  07:24             5.817 apex_util031.htm
01/08/2009  07:24             5.883 apex_util004.htm
01/08/2009  07:24            10.399 apex_item012.htm
01/08/2009  07:24             6.082 apex_util087.htm
01/08/2009  07:24             5.077 apex_util066.htm
               9 File(s)         63.214 bytes
               0 Dir(s)  42.216.312.832 bytes free

C:\Temp\AEAPI>

为什么它会报告不符合我的搜索参数的文件?

我又做了一些测试,当运行以下任何一个时,它也会回复错误的结果(大约相同数量的文件,但不同的文件):

dir apa*.*   
dir apc*.*   
dir apd*.*   
dir apf*.*   

运行时它可以正常工作(意思是:没有找到文件):

dir apg*.*
dir aph*.*

使用下列操作时将返回正确的文件:

dir ape*.*

这些文件最初位于另一个发现此行为的目录中。我复制了该完整目录(到 C:\temp ),并且也可以在这些文件上重现该问题。此文件夹中没有子文件夹。目录中没有隐藏或只读的文件

我不明白为什么会出现这种情况。
磁盘格式化为 NTFS,操作系统是 win 7 - 64 位,包含所有最新更新

答案1

正如在链接的线程中一样,您的问题是通配符与额外的文件上存在的名称 – 8.3“MS-DOS 兼容”名称。

通常将“名称”部分截断为 6 个字符,然后附加~n数字索引以进行缩短(例如,Program Files变为Progra~1)。

但是,当同一文件夹中有超过 3 个文件具有相同的 6 个字符前缀(和相同的扩展名)时,将使用不同的缩短方法:第一个使用名称的字母,后跟文件名的 CRC 哈希/校验和的四个十六进制数字,后跟后缀~n。这可确保初始 6 个字符的前缀分布得比较均匀。

因此,当您运行时dir apc*.*,这就是文件名的两个字母(“ap”)和 CRC 哈希的一个数字(十六进制数字为 0–9 A–F)。

(旁注:“新式”文件名不再有名称/扩展名划分,因此使用就足够了dir apc*。当 Windows 看到.*通配符末尾时,它会被忽略。)

我从该线程中看到,没有最终的解决方案,因为如果您决定删除 8.3 名称(系统上和所有文件中的机器人),Windows 可能会受到影响,因为一些基本功能在 16 位下仍然可以工作,而这些功能将会失败。

但事实并非如此近二十年– Windows NT 系列的核心一直是完全 32 位系统,8.3 功能仅适用于过时的第三方软件。(事实上,64 位 amd64/x86_64 变体甚至没有能力运行16位软件。

(我还听说最近的 Windows 10 版本不再默认在新安装中激活 8.3 名称生成。或者是新格式化的磁盘?诸如此类。)

如今,在现代系统上删除 8.3 文件名通常是安全的,许多指南建议禁用 8.3 生成以提高文件系统性能(尤其是在百万个文件的文件夹中)。作为第一步,您可以禁用未来一代此类文件名并仅删除 C:\Temp\AEAPI,但保留所有系统文件的现有短名称。

或者,您可以将“AEAPI”文件夹移动到单独的卷(磁盘分区)并禁用 8.3 名称生成仅适用于该卷而不会以任何方式危及系统容量。

或者,为什么 DIR 命令没有一个参数来仅显示“新样式”名称?它有一个强制使用旧样式的参数(/X)

这就是它的默认设置。常规设置dir仅显示“新样式”名称。

问题不在于它显示的内容,而在于它找到的内容。该命令本身并不过滤名称;而是要求操作系统查找与通配符匹配的所有名称。由于额外的 8.3 名称必须在打开文件时起作用,因此它们必须在所有其他操作(包括 FindFirstFile/FindNextFile)中起作用。

那里可能成为一些选择退出标志,但我怀疑它将是整个过程的,而不是可针对单个操作设置的。

相关内容