似乎是大二或者大一吧,UMU 发现了
md U..\ 建立出来的
U. 文件夹无法访问,当时在几个论坛说了这个现象,后来发现有人和 UMU 一样发现了。UMU 不知道他是不是比 UMU 先发现,但可以肯定的是他的解释是错的!
大部分人认为无法访问的原因是文件夹的名字其实是
U..\,关键在于
\ 这个字符。其实这不对,关键是在于
. 是文件基名和后缀名的分隔符号。
首先,要肯定的是,用
md U..\ 建立出来的文件夹就是
U.,而不是
U..\,也不是
U..。有人说原因是:真正的文件夹是
U..,却被当成
U.,访问时,查找了不存在的
U.,所以提示错误,这样的解释也是错的!
为什么
md U..\ 建立出来的文件夹会是
U.?让我们先做个试验,您建立一个文件,然后把后缀删除,比如说“
UMU.”,这样就是没有后缀,但是有一个“点”,结果按了回车先被警告一下,后来发现文件被保存为“
UMU”,而不是“
UMU.”。那么这个
\ 起了什么作用?我们建立文件夹时,输入
md UMU 和
md UMU\ 效果是完全一样的。但在这里就不一样,因为如果文件夹名不用
\ 结尾,那么所有后面的“点”都会被过滤掉,加了
\ 告诉系统不要把
. 弄没,文件名就是
U..,不要×××把它弄成
U 了!继续看,
U.. 是什么意思?它的 BaseName 是
U.,然后是一个分隔符号
.,没有后缀。系统就保存了它的 BaseName,然后记录这家伙没后缀,所以分隔符号
. 没了,就像之前那个没后缀的文件
UMU. 一样!
我们再做个试验,UMU 将提供更多的证据!在命令行下,切换到 D:,输入:
md "\\?\D:\U.",然后我们去 D: 看到一个叫
U. 的文件夹,一样是打不开,事实上这样建立和
md U..\ 完全一样!不信大家可以用
rd U..\ 去删除
md "\\?\D:\U." 建出来的文件夹,或者用
rd "\\?\D:\U." 去删除
md U..\ 建出来的文件夹。结论是他们一模一样!
访问的时候发生了什么?我们在资源管理器里双击
U. 文件夹,结果在传递文件夹名字的时候是
D:\U.,这时候下层 API 又做了一次过滤,把“点”当分隔符号又给去掉了,结果等于访问了
D:\U。同理,访问
D:\U.. 等于访问了
D:\U.。
完整说一遍:在建立文件夹的时候,因为不知道结尾的“点”是什么意思,所以被当做是“分隔符号”过滤掉(
D:\U..\ 变成
D:\U.),读出来的时候因为下层 API 知道这个“点”是文件名的一部分,就没再去掉,上层应用得到了一个以“点”结尾的名字,然后它就老老实实地显示出来(
D:\U.),需要进入这个文件夹的时候,又用下层 API 来检查这个文件夹存在与否,然后传过去的名字是
D:\U.,结果又不知道结尾的“点”是什么意思,再次被当做“分隔符号”过滤掉(
D:\U. 变成
D:\U),结果等于是判断
D:\U 存在与否,如果存在,则进入的其实是
D:\U。
转载于:https://blog.51cto.com/xiong/24499