无法删除文件(在 ReFS 卷上,带有前导和尾随句点)

无法删除文件(在 ReFS 卷上,带有前导和尾随句点)

我的 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.txtAFile.txt,请注意文件名后面的空格。如果尝试使用标准 Win32 调用打开第二个文件,则会打开第一个文件。同样,如果文件的名称仅为空格字符,并且您尝试使用标准 Win32 调用打开它,则会打开该文件的父文件夹。在这种情况下,如果尝试更改这些文件的安全设置,则可能无法执行此操作,或者可能会意外更改不同文件的设置。如果出现这种情况,您可能会认为您有权访问实际上具有限制性 ACL 的文件。

所以诀窍是:

>del /S /Q "\\?\D:\Torrents\UTZOO\*"

在哪里

  • /S:从所有子目录中删除指定文件。
  • /Q:安静模式,不询问是否可以删除全局通配符

使用\\?\前缀告诉 Win32 绕过在创建或删除文件时进行的典型 Win32 名称检查。

相关内容