为什么“<”和“>”字符似乎会损坏 Windows 文件夹?

iny*_*445 26 ntfs files-folders

我在观看FlyTech 的视频时,当他制作了一对非法文件夹(一个名为“<”,另一个名为“">”)时,Windows 认为包含它们的文件夹已损坏。对于任何其他包含非法字符的文件夹,似乎没有发生此行为。

我想知道为什么这个特定组合会让 Windows 认为包含的文件夹已损坏。我搜索了一下,但找不到原因。有人能解释一下吗?

use*_*686 46

该错误并不是由尖括号引起的或者是由其中两个 \xe2\x80\x93 引起的,而是在以下情况下发生:1) 文件名在其名称中包含通配符,并且 2) 通配符与之前看到的通配符相匹配file,这会导致 Windows 认为文件夹搜索没有像应有的那样向前推进。

\n

首先,据我了解,在 Windows 上列出目录是通过通配符扩展来完成的(与 Linux 上的方式相反)。要扩展通配符模式,首先使用初始模式调用 FindFirstFile(),然后在 NTFS 逐一查找匹配文件时重复 FindNextFile()。要列出整个目录,请执行与*模式相同的操作。

\n

其次,在 Windows 文件处理代码 \xe2\x80\x93 的深层部分中,<>(以及)实际上都被视为通配符,它​​们的行为类似于历史上MS-DOS 通配符变体和。(例如,又名 DOS_STAR 匹配文件扩展名之前的所有字符。)公开可用的.NET 源代码包含该算法的描述,该描述与泄露的 Windows NT 内核源代码中的描述相同。"*?>

\n\n\n

因此,不仅仅是尖括号,而且只要它们与将在通配符之前" ? *排序的另一个文件名结合使用,也可以用来触发此错误 \xe2\x80\x93,如果排序是按 Unicode 值(这是 NTFS 强制执行的顺序)完成的。

\n

例如,如果您有名为foo(和 的项目,您还会收到“文件夹已损坏”错误foo*。这里没有什么特别的(,除了它*在 Unicode \xe2\x80\x93 中排在前面,而排序在后面的字符*(例如)foo+不会触发错误。(如果您想查看这些字符的 Unicode 位置,可以通过 charmap.exe 打开“字符映射表”。)

\n

foo<同样,包含 [ , foo=] 或 [ foo?, ]的目录fooo不会触发这种情况,但包含 [ foo=, foo>] 或 [ foo+, foo?] 的目录会触发这种情况。

\n

因此,如果我正确理解一切,似乎会发生以下情况:

\n
    \n
  1. 该目录包含项目 [ foo(, foo*],NTFS 强制执行此确切顺序。
  2. \n
  3. 内核询问 NTFS“获取第一项,从”开始*
  4. \n
  5. NTFS 找到并返回foo(.
  6. \n
  7. 内核询问 NTFS“获取下一项,继续foo(”。
  8. \n
  9. NTFS 找到foo((完全匹配)并返回下一项foo*
  10. \n
  11. 内核询问 NTFS“获取下一项,继续foo*”。
  12. \n
  13. NTFS 发现foo*\xe2\x80\x93 被识别为通配符并foo(首先匹配,因此下一项foo*又是 \xe2\x80\x93,因此会引发错误。
  14. \n
\n

与通配符>的处理方式类似*,名为“ ”的文件夹通过匹配其前面的前一个“ ”项目>会导致相同的问题。<

\n

  • @user1686虽然你的解释可能总体上是正确的(我不知道是这样),但我非常怀疑这实际上是一个内核问题。虽然 Win32 API 具有 FindFirst 和 FindNext MS-DOS 风格的调用,但从我的角度来看,本机 API 和内核 API 中的情况并非如此。请参阅 https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-zwquerydirectoryfile 通常,您不希望为每个文件不断进出内核。您还可以查看 NtQueryDirectoryFile ,它是 ZwQueryDirectoryFile 的本机 API 等效项。 (4认同)
  • 这里还有一个额外的限制,必须通过 POSIX 文件名命名空间(允许文件名中使用除“/”、空字节或尾随空格之外的任何字符)创建文件,因为在通过 Win32 文件名创建文件时明确禁止使用它们命名空间(强制执行通常的 Windows 保留字符列表,加上上述有关空字节或尾随空格的限制)。实际上,这意味着使用“经典”Win32 API 的工具无法创建导致此问题的文件。 (3认同)
  • POSIX 文件名:MacOS X 确实允许尾随空格。它不允许的只是空字节和斜杠字符,而且我很确定它需要是有效的 UTF-8。由于历史/歇斯底里的原因,冒号和斜线在用户界面中被交换。因此,您可以创建一个显然名为 test/test 的文件夹,但 ls 将其列为 test:test。 (2认同)
  • 这看起来很像“什么鬼”类型的错误。如果我天真地根据“NtQueryDirectoryFile”(它必须工作,因为 POSIX API)实现“FindFirstFile”、“FindNextFile”和“FindClose”,这样的错误将没有空间存在。 (2认同)