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

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

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

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

之后,我尝试再次创建该文件夹,但是File Explorer和命令行。

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

有人知道这是怎么回事以及如何重现此问题吗?

更新

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

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

评论

下面的答案详细说明了正在发生的事情,如何有意复制它以及如何修复它,但是他们没有提到它发生的原因。由于..可以在路径中使用以表示“上一个文件夹”,因此我可能会冒昧地猜测到,在该行的某个位置,某些程序或脚本将两个字符串连接起来以创建路径,一个以..结尾,而下一个以。开头,并且由于使用了下面提到的一种技术,因此即使缺少它们之间的文件夹分隔符,它也成功创建了路径。

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

该服务器在互联网上吗?只是警告您,我经常看到面向Internet的Web服务器上的黑客尝试请求:GET / .... \\ .... \\ .... \\ .... \\ .... \\ .. .. \\ .... \\ .... \\ .... \\ winnt \\ win.ini。显然,此漏洞试图在某个地方存在/存在一些漏洞。

@AndyBrown更有可能是..而不是...只要起点深度小于9级,它就是遍历\ winnt的一种方法,而不管起点(网络根)的深度如何。它依赖于以下事实:从根目录转到..会使您留在根目录中。

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

#1 楼

Win32不允许您创建名称以.结尾的文件或文件夹-所有点都从结尾处去除。尝试创建test.会使test出现。 (这是为了与旧的DOS / Win9x时代软件中的8.3名称兼容​​。)因此,每当您尝试访问名为....的文件夹时,其名称都会减少为空字符串,并且您返回到之前的文件夹。

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

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

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

所以可能是您的程序之一:


始终使用\?\要访问文件,
偶然尝试创建一个名为....的文件夹-但事后确实无法确定。


评论


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

–WorldSEnder
18-10-31在12:53

@DirkBoer我发现了这一点:docs.microsoft.com/en-us/dotnet/standard/io/…

–user31389
18-10-31在13:17

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

– dlatikay
18-10-31在13:29



@grawity所以。 。 。我现在应该如何删除该文件夹?

–Shadow503
18-10-31在13:56

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

– RozzA
18年2月2日在5:26

#2 楼

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

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

评论


那很可能是邪恶的天才材料...

– Agi Hammerthief
18年11月1日在14:35

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

– MickeyfAgain_BeforeExitOfSO
18年1月1日在16:08

也可以使用cygwin的mkdir ...复制。

–lucidbrot
18年2月2日,11:20

您还可以将文件夹安装到NTFS分区中的子文件夹之一,然后它将变为无限递归

–phuclv
20 Mar 31 '14:43

#3 楼

创建目录的方法比较简单。
从命令提示符键入:

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 。

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

ECHO“ Testing” >> C:\ test。 ... \ test.txt

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

评论


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

–user1686
18年2月2日在5:39

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

–lucidbrot
18年2月2日,11:26

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

–拉里克(Larryc)
18年11月2日在21:33



在我的Windows 7机器上,MD ....`只创建.... \ ....`树-只有一步递归。

–TomášZato-恢复莫妮卡
18年11月7日在16:07

奇怪的是,FAR管理器不会以任何方式认为这是特殊的,而是创建/重命名/删除/列出了名为“许多点”的目录的内容,完全没有问题。

–RomanSt
18年11月11日在11:41

#4 楼

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

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


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

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

我发现,该命令:

rmdir /s /q ....\


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


/ s-删除已删除目录中的所有内容,
/ q-无需确认即删除,

父目录保持不变。

评论


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

– Burgi
19年4月4日在13:29

投票表决是因为您没有给出任何说明该命令为什么起作用或起作用的原因,例如删除目录,子目录和文件。

–冬季福克
19年4月4日在14:31

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

–Mateusz
19年4月4日在14:39

我在某种程度上用Visual Studio遇到了同样的情况,经过数小时的挫败之后,该命令保存了我的培根,试图弄清发生了什么。

–NPNelson
19年6月15日在11:49