在我的 Windows 机器上,有一个名为四个点的文件夹,它就像某种兔子洞——这是怎么发生的?

在我的 Windows 机器上,有一个名为四个点的文件夹,它就像某种兔子洞——这是怎么发生的?

文件资源管理器中列出的文件夹名称仅有四个点....

当我尝试打开它时,我陷入了某种无尽的兔子洞循环,我一次又一次地打开完全相同的文件夹 - 我可以无休止地这样做。显示路径,如C:\ExamplePath\....\....\....\....\....,等等。

它让我的 TypeScript 编译在一个特定项目中挂起。我花了一年多的时间才找到这个文件夹及其相关问题,因为它深深扎根于嵌套文件夹中。我从未想到会有这样的问题,所以我从未寻找过它。

由于名称特殊,我无法以正常方式删除该文件夹。最后,我可以使用命令行删除它,然后使用 删除父文件夹rd /s /q path

之后,我尝试再次创建该文件夹,但无法使用文件资源管理器和命令行进行创建。

在我使用 Windows 的 20 多年中,我从未见过此错误,因此我可以想象,对于业余用户来说,这确实是一个令人烦恼和困惑的问题。

有人知道这是怎么发生的以及如何重现这个问题吗?

更新

对于感兴趣的人:此路径位于 TFS 文件夹深处。因此,TFS 可能使用旁路方法@grawity 解释(“各种文件管理器、归档器等”

我是否偶然发现了一个罕见的 TFS 错误?

答案1

Win32 不允许您创建名称以 结尾的文件或文件夹.– 末尾的所有点都会被删除。尝试创建test.会改为test显示。(这是为了与旧 DOS/Win9x 时代软件中的 8.3 名称兼容。)

因此,每当您尝试访问名为的文件夹时....,其名称都会简化为空字符串,并且您会返回到之前所在的文件夹。

然而,NT 内核确实允许这样的名称。有各种机制可以绕过 Win32 API 施加的文件名限制 - 例如,WSL(适用于 Linux 的 Windows 子系统)不在 Win32 之上运行,因此不受其影响。还有\\?\绕过方法,故意为知道自己在做什么的程序留有“后门”。即使你不能创建C:\Example\....\,你創造\\?\C:\Example\....\得很好。

同样,您可以使用rmdir \\?\C:\path\...Cmd 删除此类目录(我还没有使用 PowerShell 测试过)。

各种文件管理器、归档器等可能会使用该\\?\方法,以便能够使用比平常更长的路径名 - 并且通过这样做,它们也不会受到 Win32 内兼容性代码的影响;它们会绕过点剥离,以及像 或CON这样的魔术文件名的转换NUL

因此,您的某个程序可能如下:

  1. 总是用来\\?\访问文件,
  2. 意外地尝试创建一个名为....– 的文件夹,但事后不可能真正知道。

答案2

除了 @grawity 的答案之外,Win32 程序还可以通过直接调用“本机”API 来执行此操作。如果我没记错的话,在本例中,那就是 NtCreateDirectoryObject。这些调用现在有相当好的文档记录,尤其是它们的内核对应项(您无法从 Win32 程序调用),在本例中是 ZwCreateDirectoryObject 。

关于“无限深度”,实现此目的的一种简单方法是使用链接。创建一个目录,然后在其中创建一个到它的连接点(mklink /j例如,您可以使用),最终您将得到一个非常深的结构。上次我在 Windows 2000 上执行此操作时,递归有一个结束(您不能“无限挖掘”)。可能在较新的操作系统上,限制更大或被删除,您也可以创建 10 个目录,每个目录都是前一个目录的子目录,然后在第 10 个目录中创建指向第一个目录的链接。

答案3

有一种更简单的方法来创建目录。在命令提示符下输入:

MD ....\

然后按回车键,它将创建一个带有四个点的目录。此目录也可以使用资源管理器查看。

MS-DOS 中有一个缺陷,可以追溯到 1.0 版。MS 早就知道这个缺陷,但无法或不愿修复它。他们已经用 PowerShell 修复了这个问题。

顺便说一句,如果你尝试:

RD ....

删除会失败。您需要使用此特定语法来删除它。

RD ....\

我在我管理的某些服务器上使用此功能。我经常在磁盘的根目录上创建一个用户文件夹,我不希望其他管理员过来删除它。

因此我将进入我的文件夹并创建一个名为 CON、AUX 或 LPT 等的子文件夹...

如果另一个管理员想要删除我的文件夹,他们需要先知道如何删除这个子文件夹。

编辑:我今天早上一直在思考这个讨论,并决定更进一步。我认为版主会决定这是否相关。

我无法将 CD 放入该文件夹。

考虑一下,如果我 MD c:\test 然后 CD C:\test 和 MD ....\ 我最终得到 C:\test....

一切都好。

但是 CD .... 失败并将我踢回 C:\test。(CD ....\ 也会发生同样的情况。)

但是我可以 DIR .... 并获取目录列表。我也可以

MD C:\test....\temp 并且它在...中创建该子目录。

我还可以 CD C:\test....\temp 并进入该子目录。

但是在 C:\test....\temp 中,如果我 CD .. 我会回到 C:\test。

我无法进入该目录,但我可以通过创建子文件夹来操作该文件夹,有趣的是

ECHO "测试" >> C:\test.....\test.txt

也可以工作并在该文件夹中创建一个文件。因此,我可以创建一个带有四个点的文件夹,可以向其中添加文件和文件夹,可以获取其中的目录列表,但我无法通过 CD 进入其中。是否有某种邪恶的天才会使用这种方法?如果我偏离主题太远,我向版主道歉。

答案4

我也遇到了同样的问题。就我而言,这是 .NET Core 发布命令中的拼写错误:

dotnet publish "Api.csproj" --output "....\output\"

它创建了名为“....”的目录,我无法删除或重命名该目录。此目录充当对父目录的引用。如果我进入该文件夹,我仍然在父文件夹中,但路径附加了“....\”。

我尝试了本主题中提到的所有命令,但都不起作用。据我所知,它之所以这样做,是因为我在父目录中还有其他文件和目录,所以我不得不使用可以递归删除所有内容的参数。

我发现这个命令:

rmdir /s /q ....\

可以删除“....”目录。它只会删除对父目录的引用,而这个“....”目录实际上是父目录,仅此而已。尽管命令参数如下:

  • /s-删除已删除目录中的所有内容,
  • /q – 删除而不确认,

父目录保持不变。

相关内容