请注意以下命令和实际反馈。
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)中起作用。
那里可能成为一些选择退出标志,但我怀疑它将是整个过程的,而不是可针对单个操作设置的。