我当时正在看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?
] 的目录会触发这种情况。
因此,如果我理解正确的话,似乎会发生以下情况:
- 该目录包含项目 [
foo(
,foo*
],NTFS 强制执行此精确顺序。 - 内核询问 NTFS“获取第一项,从“开始
*
”。 - NTFS 找到并返回
foo(
。 - 内核询问 NTFS“获取下一个项目,继续
foo(
”。 - NTFS 找到
foo(
(完全匹配)并返回下一个项目foo*
。 - 内核询问 NTFS“获取下一个项目,继续
foo*
”。 - 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 来说,这意味着“损坏”。
此消息并不一定意味着包含具有此名称的文件的文件夹已损坏。对于名称包含非法字符的文件和文件夹,将发出此通用消息。