Windows 下文件名中有冒号的文件操作

磁盘上有个目录,是 Linux 备份数据时生成的,现在不用了要删除,屡屡失败,开始以为是权限问题,最后发现是目录/文件名中存在半角英文冒号导致的。由于冒号在 Windows 下,在路径中通常用于盘符识别,所以出现在目录或者文件名中是非法的。但在命令提示符下,或者资源管理器里,只是无法操作,而看上去都很正常,难道没有什么办法迂回一下?

既然是 Linux 的锅,那在 Windows 下的第一反应显然是 WSL。到 WSL 下一看,它连原生的 Windows 环境都不如,连是个目录还是文件都辨识不出来,属性列里一串问号。很明显,它作为一个子系统,向核心系统检索信息就没能够收到正常反馈。

接下来把希望寄托在 native 层面的接口上。Windows 层的 API,删除一个空目录是 RemoveDirectory,多年不在 Windows 环境下编程了,一开始想当然存在一个 NtRemoveDirectory 的 native 方法,然而并没有。于是把目光转向 NtDeleteFile,为了短平快,在网上搜到以下代码(略有修改):

上述代码使用 Visual Studio 2022 编译为 64 位程序通过。首先用一个正常文件和一个正常目录,证实了 NtDeleteFile 确实可以工作于这两者,然后才针对哪个带冒号的目录进行操作,答案是“不行”,当然,在代码中,唯一正确的路径格式是加上“\??\”前缀的那个。

最后的尝试,是使用工具打开硬盘,找到该目录的元信息所在,把冒号改称为其他合法字符,然后尝试删除。运行 HxD,时间关系,没有再去学习如何在磁盘上定位分析 $MFT 文件,启用暴力搜索,找到了位置,但再改后无法保存,提示访问拒绝,熟悉的错误码 5。

这几个目录的后续命运,随缘。如果我哪天启动到了 Linux 而又恰巧想起了这个事,我就会顺手把它们删掉,如果它们运气好,就还可以拖延一阵,以待我在 Windows 下看还有没有别的什么办法来尝试对付它们。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注