当我列出文件$Recycle.Bin
夹中的文件时,已删除的文件的文件名如下:
C:\$Recycle.Bin\S-1-5-21-3704213190-1981809790-211521205-1000\.���000200000008af358fa920f8faa779cf
Windows 如何将这些映射到原始文件的名称和路径?
我用 Google 搜索了这个问题,但没有找到答案,不知道该搜索什么。
答案1
这些文件(.���...
和.����...
)实际上并不是在回收站的正常运行期间由 Windows 放置在那里的(回收站会产生 HelpingHand 的答案中提到的 $I 和 $R 文件)。
当文件无法删除时(例如,因为它正在使用中,但可以在 POSIX 语义下删除),它们分别由 Cygwin 和 MSYS2 放置在那里。
无效字符包括cyg
和msys
转置到 Unicode 低代理区域,生成无效的 UTF-16 文件名, 因为某些原因。
可能是无效的 UTF-16 向用户隐藏了它们,但大多数情况下它只会破坏工具,因为许多跨平台工具和语言在交互无效的 UTF-16 文件名时存在问题,因为他们希望能够使用 UTF-8 在内部管理文件名。
从在 Windows 10 1809 或更高版本上运行的 Cygwin 3 开始,我了解到您唯一会看到这种行为的时候是当 msys/cygwin 可执行文件试图删除正在运行的可执行文件(例如它自己)时;除了这种情况之外,Windows 现在实现了足够的 POSIX 语义来删除(例如,打开的文档),正如 Cygwin 所期望的那样。
据推测,Cygwin/MSYS2 依赖于 Windows 在清空回收站时从回收站中删除所有文件,因为它们似乎没有任何东西可以自动清理文件本身,并且文件名与您使用 Windows API 删除内容时 Windows 使用的文件名不匹配。
因此,回答您的问题,Windows 无法将它们映射回原始路径,因为它没有将它们放在那里。文件名仅包含原始路径的 inode 编号和哈希值,因此也没有保留足够的信息来手动进行映射。