Windows中的特殊文件夹那点事儿
事情的起因要追溯到四五年前,和同学摸索出了创建..
文件夹和.
文件夹的方法,并且发现了其具有一些特殊的特性。最近上班摸鱼想起这事来就想复现当时的实现方式,并在此基础之上发现了一些拓展的特性。
..
和.
文件夹
稍微对Linux系统有点了解的都知道,.
文件夹表示的是当前目录,..
文件夹表示的是上级目录,在Windows中亦是如此。
在四五年前所摸索出来的创建.
与..
文件夹实际上并不是.
与..
,而是.
, .
和 ..
, ..
,即在前后有一个空格的,看起来像.
与..
文件夹的文件夹。
感兴趣的读者可以尝试在cmd中进入想要的目录输入以下命令并实际点开看看效果:
mkdir "\ ..\ "
以上命令创建的是 ..
文件夹,即在最前面有一个空格的..
文件夹。第一次进入时可以发现仍然在当前文件夹中,第二次进入时资源管理器会提示位置不可用,并且尝试对其进行删除、重命名操作都会提示操作无法完成。这个命令我推测是四五年前所发现的命令,它与下面这两个更易于理解的命令等价:
mkdir "./ ../"
mkdir " ../"
顺便说一句,如果直接尝试以下命令是不会成功的,推测创建时会截断末尾的dot与空格符号
mkdir " .."
mkdir "./ .."
会提示拒绝访问或者文件名、目录名或卷标语法不正确。
如果想要删除这个文件夹可以使用rmdir
命令。
具有类似特性的还有
文件夹,即空格文件夹。
小结
.
,.
,..
,..
,文件夹
普通方式(即右键新建文件夹方式)无法创建
可使用类似mkdir "./.. /"
方式创建
可使用类似rmdir "./.. /"
方式删除
可使用类似rename "example" "./.. /"
方式将其他文件夹重命名为特殊文件夹,但是本操作是不可逆的,反过来会提示系统找不到指定文件
在资源管理器中对其进行删除、重命名操作会提示操作无法完成,对其进行修改属性操作会无法保存
第一次双击进入文件夹会相当于没进,此时再次双击进入会提示目录不可用或进入一个无法操作的空文件夹
...
文件夹
...
文件夹与..
文件夹的区别在于它是可以实际创建出来的,不需要添加先导与末尾空格,并且...
文件夹与....
、.....
等大于三个.
的文件夹性质相同,与上面类似,使用如下命令创建与删除,ren
的命令特性也相似:
mkdir ".../"
rmdir ".../"
它与..
文件夹在特性上的主要区别在于,..
文件夹打开第二次就到头了(第二次还不一定打得开),而...
系的文件夹可以打开无穷次(其实不一定有无穷次,取决于文件夹路径长度限制),不管打开多少次,始终打开的都是它所在的文件夹。
尝试对其进行删除取决于该文件夹所在位置,可能会导致资源管理器崩溃。如果它在磁盘根目录,相当于对删除磁盘,会提示操作不合法,如果它不在磁盘根目录,会导致资源管理器在检索文件时访问无穷层级导致崩溃。
小结
...
与所有三个.
以上的文件夹
普通方式(即右键新建文件夹方式)无法创建
可使用类似mkdir "./.../"
方式创建
可使用类似rmdir "./.../"
方式删除
可使用类似rename "example" "./.../"
方式将其他文件夹重命名为特殊文件夹,但是本操作是不可逆的,反过来会提示系统找不到指定文件
在资源管理器中对其进行重命名操作会提示操作无法完成,对其进行修改属性操作会无法保存
可以无穷此进入该文件夹,进入的始终是其所在的文件夹
若其不在磁盘根目录,在资源管理器中对其进行删除操作可能会导致资源管理器崩溃,若其在磁盘根目录会提示文件夹不可用(实际的删除操作是对磁盘进行)
example
与example..
文件夹
在这里的example
并不是特指example
这个单词,而是指任意正常文件夹的前缀,下文中均用example
代替。
假设当前文件夹下不存在example
文件夹,若正常右键创建example..
文件夹会被自动重命名为example
文件夹,若使用类似上文中的方法使用mkdir "./example../"
才可以成功创建,当然删除的方法也类似。
当example
文件夹不存在时,在资源管理器中对其的所有操作均是无效的,双击进入会提示位置不可用,对其进行重命名、删除与修改属性均会提示没有找到项目。
当example
文件夹存在时,对其所有操作实际上均是对example
文件夹生效,包括但不限于删除,重命名,修改属性与双击打开,包括在命令行中使用ren进行重命名亦是如此。
小结
example..
文件夹
普通方式(即右键新建文件夹方式)无法创建,会创建成example
文件夹
可使用类似mkdir "./example../"
方式创建
可使用类似rmdir "./example../"
方式删除
可使用类似rename "example" "./example../"
方式将其他文件夹重命名为特殊文件夹,但是本操作是不可逆的,反过来会对example
文件夹进行操作,若其不存在会提示系统找不到指定文件
若example
文件夹不存在,在资源管理器中对其进行重命名、打开、删除、修改属性等操作会提示文件夹不存在
若example
文件夹存在,在资源管理器中对其进行重命名、打开、删除、修改属性等操作会对example
文件夹生效,甚至于在命令行中使用ren
命令亦是如此,使用move
命令则会提示系统找不到指定的文件
设备文件夹
设备文件夹相比以上几种文件夹更为特殊,其是早期dos系统中用于设备的保留字,设备文件夹包括以下几种:CON
, PRN
, AUX
, NUL
, COM1
, COM2
,..., COM9
, LPT1
, LPT2
,..., LPT9
虽然在资源管理器中无法直接创建,但仍可以用与上述类似的方法创建与删除,据说在早期Windows中创建会导致系统蓝屏
根据创建的文件夹名字的不同,包括但可能不限于不存在/函数无效/句柄无效几种类型的特性。
小结
CON
,PRN
,AUX
,NUL
,COM1
,COM2
,...,COM9
,LPT1
,LPT2
,...,LPT9
文件夹
普通方式(即右键新建文件夹方式)无法创建,会提示指定的设备名无效
可使用类似mkdir "./con/"
方式创建
可使用类似rmdir "./con/"
方式删除
对于PRN
,AUX
,COM1
,COM2
,...,COM9
,LPT1
,LPT2
,...,LPT9
文件夹,创建之后对文件夹本身的任何操作会提示没有找到项目、文件不存在等,而在这些文件夹中可以正常地创建文件夹,并且在新创建的文件夹中可以正常地使用与存放文件
对于con
文件夹,对其进行包括打开的任何操作会提示句柄无效或无反应
对于nul
文件夹,对其打开、修改属性操作会提示函数不正确,删除操作无效,重命名操作会提示文件过大
类标识文件夹
这类文件夹相比上述的文件夹,对于正常的系统来说实用性可能就高很多了,并且不需要命令行,直接右键重命名即可创建。
还是以example
文件夹为例,直接右键重命名为example.{645FF040-5081-101B-9F08-00AA002F954E}
文件夹,保存刷新即可。可以看到它变成了回收站的图标,并且打开也是回收站,而且该文件及可以进行正常地重命名、删除、修改属性等操作,此外这种方法还可以与设备文件夹结合使用。
最好用的一点是它可以在cmd中使用ren
命令还原成普通的文件夹,这是与上面几点文件夹相比最具使用价值的优点(指藏东西)。如果在其中放入一个...
文件夹还可以屏蔽对该文件夹的删除操作(导致资源管理器崩溃,删除失败),相信老司机们应该明白这玩意可以怎么用了。
该类文件夹的原理是利用了Windows类标识符来伪装文件夹,类似的类标识符还有:
参考资料:类标识符
我的电脑 {20D04FE0-3AEA-1069-A2D8-08002B30309D}
我的文档 {450D8FBA-AD25-11D0-98A8-0800361B1103}
拨号网络 {992CFFA0-F557-101A-88EC-00DD010CCC48}
控制面板 {21EC2020-3AEA-1069-A2DD-08002B30309D}
计划任务 {D6277990-4C6A-11CF-8D87-00AA0060F5BF}
打印机 {2227A280-3AEA-1069-A2DE-08002B30309D}
记事本 {1FBA04EE-3024-11D2-8F1F-0000F87ABD16}
网络邻居 {208D2C60-3AEA-1069-A2D7-08002B30309D}
回收站 {645FF040-5081-101B-9F08-00AA002F954E}
公文包 {85BBD920-42A0-1069-A2E4-08002B30309D}
字体 {BD84B380-8CA2-1069-AB1D-08000948F534}
Web 文件夹 {BDEADF00-C265-11d0-BCED-00A0C90AB50F
“上帝模式”{ED7BA470-8E54-465E-825C-99712043E01C}
更进一步
就目前来说最具有实用价值的只有类标识文件夹与...
文件夹的结合使用,其他文件夹大多因为在cmd中无法还原为普通文件夹而无法存储文件。
但是
虽然cmd辣鸡,但是我们有无敌的Git Bash啊。
以上所有文件夹在Git Bash中均可以很轻松地进行创建、修改、重命名、访问等操作,由此使得上述所有文件夹均可以还原为普通的文件夹,使其真正具有了隐藏文件的价值。感兴趣的读者可以搜索linux下对文件的基本操作,套用到Git Bash中即可。
Git Bash 永远嘀神