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

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

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

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

答案1

该错误不是由尖括号引起的确切地或者有两个——相反,当 1)文件名包含通配符在其名称中,并且 2)通配符将匹配先前查看过的文件,这导致 Windows 认为文件夹搜索没有像它应该的那样向前推进。

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

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

因此,不仅仅是尖括号,而且也" ? *可以用于触发此错误 - 只要它们与另一个要排序的文件名结合使用如果按 Unicode 值(这是 NTFS 强制执行的顺序)进行排序,则使用通配符。

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

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

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

  1. 该目录包含项目 [ foo(, foo*],NTFS 强制执行此精确顺序。
  2. 内核询问 NTFS“获取第一项,从“开始*”。
  3. NTFS 找到并返回foo(
  4. 内核询问 NTFS“获取下一个项目,继续foo(”。
  5. NTFS 找到foo((完全匹配)并返回下一个项目foo*
  6. 内核询问 NTFS“获取下一个项目,继续foo*”。
  7. NTFS 发现foo*- 被识别为通配符并foo(首先匹配,因此下一个项foo*再次是 - 所以引发错误。

与通配符>的处理方式类似*,名为“ ”的文件夹>会通过匹配其自身之前的“ ”项而导致同样的问题<

答案2

字符<>属于“保留字符”组,在Windows中不得用于命名文件或目录。

https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file

The following reserved characters are not valid to name a file or directory:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

答案3

正如另一个答案所述,这些字符属于保留字符组:

https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file

The following reserved characters are not valid to name a file or directory:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

每种情况都有非常具体的原因。有办法解决这些问题,但每种方法在命令处理中都具有基本功能:

  • <(小于)- 来自文件输入
  • >(大于)- 输出到文件
  • :(冒号)- 驱动器标识符(例如,C:
  • “(双引号)- 引用包含空格的文件名
  • /(正斜杠)- POSIX 文件夹/目录分隔符
  • \(反斜杠)-Windows 文件夹/目录分隔符
  • | (竖线或管道)- 使用一个进程的输出作为另一个进程的输入
  • ?(问号)- 单字符通配符
  • *(星号)- 多字符通配符

答案4

这种令人困惑的错误可能有多种形式,例如:

  • 错误代码 0x80070570
  • 错误代码 0x570
  • 错误代码 1392(十六进制 570)
  • 错误文件损坏
  • 消息“文件或目录已损坏且无法读取”

典型的错误信息是:

在此处输入图片描述

在所有情况下,这意味着无法访问该文件或文件夹,尽管它存在于 NTFS 主文件表 (MFT)

其他答案已经很好地解释了文件名中的某些字符是非法的。

如果有人设法创建一个包含这些非法字符的文件(通常是使用 Linux,因为对于 Linux 来说这些字符是合法的),那么就会出现异常:一方面,该文件/文件夹存在于文件表中,但另一方面,任何打开它的尝试都会被拒绝,因为它的名称未通过验证检查。

面对这种矛盾,Windows 内核放弃了,并返回上述错误代码,表示某些内容已损坏,需要用户来修复错误的文件条目。

这个错误信息本来可以表述得更清楚一些,但它的意思是文件表的内容和磁盘上的数据存在矛盾,对于 Windows 来说,这意味着“损坏”。

此消息并不一定意味着包含具有此名称的文件的文件夹已损坏。对于名称包含非法字符的文件和文件夹,将发出此通用消息。

相关内容