U..\ 无法正常访问的真正原因

似乎是大二或者大一吧,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。

你可能感兴趣的:(职场,休闲,无法正常访问)