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

Dir*_*oer 196 windows filesystems

文件夹名称列在文件资源管理器中,只有简单的四个点....

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

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

由于名称特殊,我无法以正常方式删除文件夹。最后,我可以通过使用命令行并删除带有rd /s /q path.

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

在我使用 Windows 的 20 多年中,我以前从未见过这个错误,所以我可以想象这对于业余用户来说真的是一个令人讨厌和困惑的问题。

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

更新

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

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

use*_*686 303

Win32 不允许您创建名称以 结尾的文件或文件夹.——所有的点都从末尾去掉。尝试创建test.使test出现。(这是为了兼容旧的 DOS/Win9x 时代软件中的 8.3 名称。)

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

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

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

各种文件管理器、存档器等可能会使用该\\?\方法,以便能够使用比平常更长的路径名——并且这样做,它们也不受 Win32 中的兼容性代码的影响;它们绕过点剥离,以及像CONNUL.

所以它可能是你的程序之一:

  1. 总是\\?\用来访问文件,
  2. 不小心尝试创建一个名为的文件夹....- 但事后确实不可能确定。

  • Microsoft 将此称为“扩展路径前缀”,具有该前缀的路径称为“扩展长度路径”。(搞笑:当你在.NET [参考源](https://referencesource.microsoft.com/#q=%5C%5C%3F%5C%22)中搜索`\\?\"`时,会导致他们的服务器上的运行时错误)。 (126认同)
  • 我有一个奇怪的“计算机维修”客户案例,其中任何时候客户在任何 Windows 机器上创建一个帐户,它都可以正常工作,但是一旦他登录/重新启动它就不会让他进入他的帐户,而是为他创建一个临时帐户会议。当地的电脑维修店被难住了(仍然向他收费)。原来他的真实姓名是 Con,他总是用他的名字作为他的 Windows 帐户.....那天我了解到不仅仅是“com1”作为一个神奇的文件名 (21认同)
  • 创建此类文件夹的另一种方法是使用备用数据流。在 cmd 上:`echo "" > ....::$INDEX_ALLOCATION`。这将创建一个名为 `....` 的文件夹(仍然指向当前文件夹)。 (13认同)
  • @DirkBoer 我发现了这个:https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#skiping-normalization (2认同)
  • @grawity 所以。. . 我现在应该如何删除这个文件夹? (2认同)
  • @RozzA - 有趣。这是关于同一问题的 SU 问题:https://superuser.com/questions/915779/cannot-create-user-account-named-con-under-windows-7 (2认同)
  • 我想 [NtCreateFile()](https://docs.microsoft.com/en-us/windows/desktop/api/winternl/nf-winternl-ntcreatefile) 函数可以毫无问题地创建此文件夹。 (2认同)

use*_*080 21

除了@grawity 的回答之外,Win32 程序也可以通过直接调用“本机”API 来做到这一点。如果我没记错的话,在本例中,就是 NtCreateDirectoryObject。这些调用现在已经得到了很好的记录,特别是它们的内核对应物(你不能从 Win32 程序调用),在这种情况下, ZwCreateDirectoryObject 。

关于“无尽的深度”,实现这一目标的一种简单方法是使用链接。创建一个目录,然后在其中创建一个到它的连接(mklink /j例如,您可以使用),您最终会得到一个非常深的结构。上次我在 Windows 2000 上这样做时,虽然递归结束了(你不能“无限挖掘”)。可能在较新的操作系统上,限制更大或被删除,您也可以创建假设 10 个目录,每个目录都是前一个目录的子目录,并在第 10 个目录中创建一个返回第一个目录的链接。

  • 那里很可能是邪恶的天才材料…… (4认同)

Lar*_*ryc 18

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

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。

我无法 cd 进入该目录,但我可以通过创建子文件夹来操作该文件夹,并且很有趣,例如

ECHO“测试”>> C:\test....\test.txt

也可以工作并在该文件夹中创建一个文件。所以我可以创建一个带有四个点的文件夹,我可以向其中添加文件和文件夹,我可以获得它的目录列表,但我无法将其 CD 放入其中。会不会有什么邪恶的天才用在这上面?如果我偏离路线太远,我向模组道歉。

  • 这听起来更像是一个 Win32 API 缺陷,因为命令提示符已经不再是“MS-DOS”了大约 20 年了。 (6认同)
  • 有趣的是,如果我尝试删除 Windows 资源管理器中的目录,当我使用您的版本创建它时它会崩溃。当我用 cygwin 创建它时,它只是失败并说明了这一点。 (2认同)