无法读取目录“(名称)”:文件存在

无法读取目录“(名称)”:文件存在

我正在尝试将 Windows 7 安装更新到 Windows 10,但该过程在步骤 MIGRATE_DATA 处反复失败。

在调查可能阻止迁移的原因时,我在启动驱动器(NTFS 格式的 100GB SSD)上发现了两个损坏的文件。损坏的文件在资源管理器下不可见,但在使用duCygwin 查找大型目录时找到了它们:

du:无法读取目录“./Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETPortable/v4.0/S\177ste\344.Ne\247.xml”:文件存在
du:无法读取目录“./Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETPortable/v4.6/Profile/Profile84/S9stem.Nef.Requests.xml”:文件存在

在我尝试的过程中,这两个文件的行为相同。第一个文件如下所列ls -l

$ ls -l /cygdrive/c/Program\ Files\ \(x86\)/Reference\ Assemblies/Microsoft/Framework/.NETPortable/v4.0
总计 6892
(...)
-rwxrwx---+ 1 SYSTEM SYSTEM 362197 2014 年 3 月 12 日 System.xml
drwxr-x--- 1 未知用户 未知组 0 2018 年 12 月 3 日 S?ste?.Ne?.xml
-rwxrwx---+ 1 SYSTEM SYSTEM 235088 2014 年 3 月 14 日 mscorlib.dll(...)

虽然补全功能无法处理其名称,但在rm命令中使用 unicode 字符输入它则没有任何效果,并且strace在命令前面加上:

   46 108762 [主要] rm 8608 path_conv::check: this->path(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\S177ste344.Ne247.xml),has_acls(1)
   42 108804 [main] rm 8608 unlink:取消链接不存在的文件
   45 108849 [main] rm 8608 __set_errno:int unlink(const char*):1054 设置 errno 2
   42 108891 [main] rm 8608 取消链接:-1 = 取消链接(/cygdrive/c/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETPortable/v4.0/S177ste344.Ne247.xml),errno 2

我说“文件”是因为从它们的名称和位置来看,这些元素实际上是文件,而不是目录,正如它们的 ACL 所指示的那样(System.Net.xmlSystem.Net.Requests.xml)。显然在某个时候存在损坏。

只是为了好玩,这是提升权限后cmd对文件所说的内容(用法语,但你明白了,奇怪的日期和计数,而且它恰好是隐藏的):

C:\Program 文件(x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0>dir /ah
 读取 C 驱动器的卷名为 BootSSD
 系列编号为 0EA2-18D0

 目录 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0

13/05/30600 04:58 Ssteõ.Neº.xml
               0 文件 0 八位字节
               1 篇回复 30 887 821 312 个八位字节

这种损坏的问题在于它很稳定:使用chkdsk /f c:对这些文件没有影响。

我没有检查这些文件是否有先前的版本,但我怀疑我无法替换它们,即使可以,这些文件也不会在过程中被删除。

我最好的机会似乎是找到一种方法将文件记录恢复为实际文件而不是目录,但我不知道如何做到这一点。

有任何想法吗?

答案1

这是我自己的问题的一个临时答案。我使用了一个带有 RescueCD 的实时 USB 密钥,并使用 ntfs-3g 安装了分区:

%ntfs-3g / dev / sda1 / mnt / windows
%rm /mnt/windows/Program\ Files\ \(x86\)/Reference\ Assemblies/Microsoft/Framework/.NETPortable/v4.0/S$'\177'steõ.Neº.xml

这两个文件被列为如下类型,并且被删除了,没有出现明显的问题,这在 Windows 下是不可能完成的任务:

-rwxrwxrwx 2 root root 0 2018 年 12 月 3 日 S?steõ.Neº.xml
-rwxrwxrwx 2 root root 161 1983 年 7 月 2 日 S9stem.Nef.Requests.xml

然后我使用了一个非常基本的工具find /mnt/windows -iregex '.*[^a-zA-Z0-9_.() {}#]+',它让我找到了另一个奇怪的文件,该文件位于稍微敏感的区域,但大小为空(通常名称为 commctl32.dll,通用控件库):

-rwxrwxrwx 1 root root 0 2021 年 9 月 6 日 ./windows/winsxs/x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af/cñmcte32.dll

我发布这篇文章是为了尝试清理文件系统。我以前从未使用过 ntfs-3g,这很令人高兴。它是否稳定,时间会证明一切 :)

更新:中还有最后一个“损坏”的文件c:\windows\ehome。此目录是 Media Center 的残留文件,在升级到 Windows 10 后会被卸载。这是导致 Windows 10 升级无法在 FIRST_PASS/MIGRATE_DATA 处成功的最后一个因素。我后来意识到,这是将目录备份Windows到 时的一个非常简单的故障Windows.old。我见过更清晰的错误代码……

相关内容