我的 Windows 机器上有几千个文件(14,000 个),所有文件都名为.TARDIRPERMS.
我无法删除:
我可以在 Windows 资源管理器和命令行中看到它们,但无法删除这些文件。
显然我不知道原因,但可能相关的一些有趣的观点是:
- 它是一个 ReFS 卷(这意味着我无法使用
chkdsk
它) - 文件是开始和结尾带有句点 (IEU+002E 句号)
- 我尝试删除父文件夹(以及父文件夹的父文件夹)-结果相同
- 我试过了
del /S /F /Q *
——结果一样 - 我试过了
del ".tardirperms."
——结果一样 - 我试过了
del "\?.TARDIRPERMS."
- 结果相同 - 我试过了
rd /s "\?UTZOO"
- 结果相同 - 我试过了
PS D:\Torrents> Remove-Item
\?\D:\Torrents\UTZOO-Recurse
- 结果相同 - 我试过了
del *.tardirperms.
——结果一样 - 我试过了
del *.tardi*
——结果一样
答案1
简洁版本
>del /S /Q "\\?\D:\Torrents\UTZOO\*"
对于文件 I/O,\\?\路径字符串的前缀告诉 Windows API 禁用所有字符串解析并发送其后的字符串直接进入文件系统。
长版本
文件名.TARDIRPERMS.
是有效的 NT 文件名,但不是有效的 Win32 文件名。您可以告诉 Win32 函数忽略正常的 Win32 命名限制,并将文件名原样传递给相应的底层创建文件函数,通过在文件名前加上前缀\\?\
:
- 失败:
D:\Torrents\UTZOO\.TARDIRPERMS.
- 好的:
\\?\D:\Torrents\UTZOO\.TARDIRPERMS.
微软在文章标题中概括了无法删除文件的各种原因无法删除 NTFS 文件系统卷上的文件或文件夹。
我感兴趣的是原因 6:
原因 6:文件名包含 Win32 命名空间中的无效名称
如果文件名包含无效名称,则无法删除文件。例如,文件名末尾有空格或句点,或者文件名仅由空格组成。要解决此问题,请使用使用适当内部语法的工具来删除文件。您可以将语法
"\\?\"
与某些工具结合使用来操作这些文件。以下是示例:del "\\?\c:\<path_to_file_that contains a trailing space.txt>"
此问题的原因类似于原因 4。如果使用典型的 Win32 语法打开名称中带有尾随空格或尾随句点的文件,则在打开实际文件之前会删除尾随空格或句点。例如,同一个文件夹中有两个文件,分别名为
AFile.txt
和AFile.txt
,请注意文件名后面的空格。如果尝试使用标准 Win32 调用打开第二个文件,则会打开第一个文件。同样,如果文件的名称仅为空格字符,并且您尝试使用标准 Win32 调用打开它,则会打开该文件的父文件夹。在这种情况下,如果尝试更改这些文件的安全设置,则可能无法执行此操作,或者可能会意外更改不同文件的设置。如果出现这种情况,您可能会认为您有权访问实际上具有限制性 ACL 的文件。
所以诀窍是:
>del /S /Q "\\?\D:\Torrents\UTZOO\*"
在哪里
/S
:从所有子目录中删除指定文件。/Q
:安静模式,不询问是否可以删除全局通配符
使用\\?\
前缀告诉 Win32 绕过在创建或删除文件时进行的典型 Win32 名称检查。