在Windows机器上,我有一个文件夹,其名称为四个点,就像一个兔子洞一样-怎么发生的?


198

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

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

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

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

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

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

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

更新资料

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

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


5
下面的答案详细说明了正在发生的事情,如何有意复制它以及如何修复它,但是他们没有提到它发生的原因。由于..可以在路径被用来表示“去了一个文件夹”,我会大胆地猜测沿线某处,某些程序或脚本串联两个字符串创建路径,一个有结束..,而下开始..,和由于它使用了以下提到的一种技术,因此即使缺少它们之间的文件夹分隔符,它也成功创建了路径。
3D1T0R '18 -10-31

6
如果您创建的文件夹名称中仅包含空格,也会发生奇怪的事情
phuclv

7
该服务器在互联网上吗?只是警告您,我经常看到面向Internet的Web服务器上的hack尝试请求:GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini。显然,此漏洞试图利用某个漏洞。
安迪·布朗

4
@AndyBrown更有可能..不是....。只要\winnt起点深度小于9层,它都是一种遍历起点(web根目录)深度的方法。它依赖于以下事实:..从根目录开始将您留在根目录中。
hobbs

5
@hobbs这是Linux上Apache访问日志的复制和粘贴。那里肯定有4个点。记录了其他确实有用的黑客尝试,..这就是为什么我发现这一点很奇怪的原因。
安迪·布朗

Answers:


303

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

结果,每当您尝试访问名为的文件夹时....,该文件夹的名称都会减少为空字符串,然后返回到之前的文件夹。

但是,NT内核确实允许使用此类名称。有多种机制可以绕过Win32 API施加的文件名限制-例如,WSL(Linux的Windows子系统)不在Win32之上运行,并且不受Win32的影响。还有一种\\?\绕过方法,即为知道它们在做什么的程序留有故意的“后门”。即使您不能创建C:\Example\....\,也可以创建\\?\C:\Example\....\

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

各种文件管理器,存档器等可能会使用此\\?\方法,以便能够使用比平常更长的路径名–这样,它们也不受Win32中兼容性代码的影响;它们绕过点剥离以及魔术文件名(如CON或)的翻译NUL

因此可能是您的程序之一:

  1. 总是\\?\用来访问文件,
  2. 意外地尝试创建一个名为....– 的文件夹,但事后确实无法确定。

13
创建此类文件夹的另一种方法是使用备用数据流。在cmd上:echo "" > ....::$INDEX_ALLOCATION。这将创建一个名为....(仍然指向当前文件夹)的文件夹。
WorldSEnder '18


124
Microsoft将此称为“扩展路径前缀”,并将具有该前缀的路径称为“扩展长度路径”。(有趣的是:当您\\?\"在.NET 参考源中搜索时,它会在其服务器上导致运行时错误)。
dlatikay

2
@grawity所以。。。我现在应该如何删除该文件夹?
Shadow503 '18 -10-31

21
我有一个很好奇的“计算机维修”客户端案例,该客户端在任何时候在任何Windows计算机上创建帐户都可以正常工作,但是一旦他登录/重新启动,就不会让他进入自己的帐户,而是为该帐户创建了一个临时帐户。会议。当地的电脑维修店陷入困境(仍然向他收费)。原来他的真实姓名是Con,他总是将自己的名字用作Windows帐户。.....那天,我了解到不仅仅是com1一个神奇的文件名
RozzA

23

除了@grawity的答案外,Win32程序还可以通过直接调用“本机” API来执行此操作。如果我没记错的话,在当前情况下,那将是NtCreateDirectoryObject。如今,这些调用已被很好地记录下来,尤其是它们的内核对应文件(您不能从Win32程序调用),在这种情况下为ZwCreateDirectoryObject。

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


4
那很可能是邪恶的天才材料……
Agi Hammerthief,

1
我已经复制了与此类似的完整目录,以人为填充光盘以进行测试,从而确定何时接近设置的限制。
mickeyf '18

它也可以使用复制Cygwin的mkdir ....
lucidbrot

18

有一种创建目录的简便方法。在命令提示符下键入:

MD ....\

然后按Enter,它将创建一个包含四个点的目录。该目录也可以在资源管理器中查看。

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。

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

回声“测试” >> C:\ test .... \ test.txt

也可以在该文件夹中创建文件。因此,我可以创建一个包含四个点的文件夹,可以向其中添加文件和文件夹,可以获取它的目录列表,但是无法将其插入CD。可以使用某种邪恶的天才吗?如果我偏离路线太远,我会向国防部致歉。


6
这听起来像是Win32 API的缺陷,因为大约20年来命令提示符不再是“ MS-DOS”。
grawity

2
有趣的是,如果我尝试在Windows资源管理器中删除目录,则在使用您的版本创建目录时它会崩溃。当我用cygwin创建它时,它只是失败而已。
lucidbrot

我有一台DOS 3.3和DOS 6.0机器,这些命令都可以在它们上工作。当他们切换到32位时,问题仍然存在。从win95一直到今天,它都可以在CMD窗口中运行,包括所有服务器版本。现在我们切换到Powershell,它不再起作用。在写完该书后,我意识到它确实创建了目录,但没有提供OP所见的效果。如果我尝试将CD插入带有四个点的目录中,那只会让我退缩。
拉里克

在我的Windows 7机器上MD ....` only creates .... \ ....`树-仅递归一步。
托马什Zato

奇怪的是,FAR管理器从任何角度都不认为这很特殊,而是创建/重命名/删除/列出了名为“许多点”的目录的内容,而没有任何问题。
RomanSt

-1

我有同样的问题。就我而言,这是.NET Core发布命令中的错字:

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

它创建了名为“ ....”的目录,我无法删除或重命名该目录。该目录的作用类似于对父目录的引用。如果我进入该文件夹,则仍在父文件夹中,但是路径由“ .... \”附加。

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

我发现,该命令:

rmdir /s /q ....\

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

  • / s-删除已删除目录中的所有内容,
  • / q-未经确认即删除,

父目录保持不变。


您能否阐明第二个命令对您有用的原因?
Burgi

投票是因为您没有给出命令为何起作用或命令起作用的任何解释,例如删除目录,子目录和文件。
Winter Faulk

实际上,这将删除名称为“ ....”的目录。它仅删除对父目录的引用,该目录实际上是“ ....”目录,仅此而已。我尝试了本主题中提到的所有命令,但没有一个起作用。在我的理解中,此命令有效,因为我在父目录中还有其他文件和目录,因此我必须使用可以递归删除所有内容的参数。尽管有命令参数,但父目录保持不变。
Mateusz

我在某种程度上用Visual Studio遇到了同样的情况,经过数小时的挫败之后,这个命令保存了我的培根,试图弄清发生了什么。
NPNelson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.