阿不

潜水

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在Linux/Unix系统中,对任何文件路径,文件名,URL地址的处理都是大小写敏感。对于这点设计,让我们长期从事基于Windows平台开发和工作的开发人员情何以堪啊。尽管可能这样设计是有它的特殊目的和出发点,但我直到现在仍然认为这点是一个非常蛋疼的设计。我试图找到一些理由来解释Linux为什么处理这些字符串使用大小写敏感,但是得到的答案都是一些无关痛痒的理由:

  • 大小写敏感后,可以用更短的文件名来表示更多的文件。比如a.txt和A.txt它们是不是一样的文件,但是大小写不敏感后,它们只能表示同一个文件。
  • 大小写敏感,让字符串(文件名)更容易排序。
  • Linux是用C语言写的,在C语言里面,字符串是大小写敏感的。难道C++,C#不是大小写敏感?
  • 大写和小写字符,本身它们的ASCII值就不一样,本来就应该认为它们是不一样的字符?

上面的这些讨论,难道有一个理由可以成为大小写敏感后所带来的不便的替罪羊(请允许我以一个Windows用户的角度来评论这个设计)?在我这段时间的跨平台研究经验中,这个问题已经不再是方不方便的问题了,已经上升到软件兼容层面上的很大问题。你可以说,这是我们自己写程序的的随意性造成的。但是对于长期基于Windows平台开发的开发人员,又有多少程序员会注意到文件路径和文件名的大小写统一问题。在我所遇到的问题中,至少80%以上是由于文件名和路径大小写的不一致所导致的,而这些问题,有时候也是相当长的时间来进行调试后才会察觉出来。下面就来看看,我到目前为止,发现的由大小写敏感所带来的软件的兼容问题吧:

  • 首页一打开,你会发现出现一个404错误。如果运气好的话,那你检查一下是不是把Index.aspx写成index.aspx。尴尬
  • 当你把页面打开之后,你发现怎么页面的样式都乱七八糟的,根本就不是我们正常的显示效果。那我们可能要借助一下Firebug或是其它的HTTP网络请求查看工具来看一下是不是有哪些样式的请求出错了,是不是把L写成l了。哭泣的脸
  • 当你把样式的问题也解决了以后,你可能还会有很多图片,logo没有办法正常显示。如果在Windows下面访问正常的话,那你的第一个反应也是应该检查一下大小写问题。
  • 同样的问题,还会出现在请求脚本文件中。
  • 如果你的程序中,有做文件读写操作的话,80%是可能会运行不正常的,同样是因为你的文件名(路径)大小写不一致引起的,要重点检查。
  • 我们使用MVC,最经常的都是URL,controller,View的名称会是以一种约定的形式存在,并且VS提供了一个很好的脚手架,让我们可以确保Controller和View的大小写基本都能保持一致,但这样就够了吗?在这种请求中,你也许会经常收到各种View无法找到的异常,第一个反应,你就是应该要检查一下文件和路径的大小问题了。但是要解决这个问题,却不是通过修改程序就能解决的。假设有AccountController这个View,在Windows平台下,我们通过account或是Account都可以正常请求,但在Linux下,你通过account是不能正常请求的。不能正常请求,不是因为Controller无法正常处理,因为MVC中,本身对查找controller已经是大小写不敏感了。但是由于你是用account来请求的,那么它此时认为的controllerName是account,它会以account这个字符串去找相应的View,假定我们原本的View是Account,那此时它一定是会找错的。这个问题,基本没有什么好办法,要么从底层的IOMAP来解决,要么就是强制要求URL也大小写敏感。
  • 同样在MVC中,有一个Metadata,叫做UIHit,它可以用来指定某个字段对应的编辑模板的。在这里,我们假设使用了UIHit("password"),但是在EditorTemplates中,存在Password.cshtml,同样的让我们的页面产生一些CSS兼容性问题的错觉。

还好,CSS,Javascript的语法都大小写敏感的,要不然痛苦还会多很多。

以上提到的这些大小写的问题,Mono团队也很早就意识到如果不解决,可能会是Mono更好发展的一个障碍。因此他们提供了一项叫做IOMap的底层映射来屏蔽由文件路径大小不同所带来了兼容性问题。但是,在介绍中,只是提及对基于Apache的配置例子,也许也有针对XSP的支持例子:

MONO_OPTIONS="--debug --profile=iomap" xsp2

但是由于我需要在MonoDevelop中调试更多的其它问题,因此我也需要在MonoDevelop用XSP启动站点调试时开启IOMap的选项,可惜,至今我还没有设置的办法。今晚,我看到了Mono Tools for Visual Studio 2.0 Beta 1调试可以配置这个选项,但为何这个Mono_Tools也可以跨平台呢?莫非它不仅仅是一个Visual Studio的插件?也许奥秘就在这里。希望过几天我就可以解决调试时使用IOMap的问题。这样真的可以减少太多的代码改动了大笑

 

本文结束

关于MonoDevelop的调试大小写问题的官方邮件列表讨论:http://go-mono.com/forums/#nabble-td3606760

posted on 2011-06-15 23:27  阿不  阅读(4313)  评论(30编辑  收藏  举报