阿不

在腾讯微博和新浪微博 @hjf1223 ,最新的技术观点在那

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  211 随笔 :: 0 文章 :: 3000 评论 :: 75 引用

在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

阿不 http://hjf1223.cnblogs.com
posted on 2011-06-15 23:27 阿不 阅读(1999) 评论(30) 编辑 收藏

评论

#1楼 2011-06-16 00:09 麦舒      
为什么非得要在 Mono 下运行呢?
 回复 引用 查看   

KooBoo用户设计领域模型那一块能支持多对多以及其他的复杂关系吗?我记得原来好像智能支持一对多对吗?
 回复 引用 查看   

#3楼 2011-06-16 08:02 大石头      
非常非常的赞同楼主阿不的观点,我是恨死了大小写敏感,它是我一直很排斥Linux的主要原因!

软件就是做出来给人用的,你这也限制那也限制,还用个球呀!
最少最少,也要弄一个系统级的全局设置吧,爱敏感的继续敏感,不爱敏感的就不敏感。

在Oracle和MySql上,就有大小写敏感设置。
 回复 引用 查看   

#4楼 2011-06-16 08:37 allentranks      
大小写可以配置的
 回复 引用 查看   

#5楼 2011-06-16 08:39 阿干@NET      
确实很蛋疼,文件名大小写敏感还好理解,URL就非常蛋疼了,来访问的用户怎么知道你的大小写规则是怎么样的,要是你蛋疼的搞个iNdEx.hTMl这种首页,那岂不是不用让人访问了
 回复 引用 查看   

#6楼 2011-06-16 08:42 xiaotie      
@大石头
linux是开放的,想写可以自己写一个嘛
 回复 引用 查看   

#7楼 2011-06-16 09:25 无尽思绪      
MVC支持在mono上运行?
 回复 引用 查看   

#8楼[楼主] 2011-06-16 09:47 阿不      
引用我是一头快乐的小毛驴-(Zealot Yin):KooBoo用户设计领域模型那一块能支持多对多以及其他的复杂关系吗?我记得原来好像智能支持一对多对吗?

一对多,多对多都可以支持。总体上,有以前没有很大的差别,有兴趣可以去看一下。
 回复 引用 查看   

#9楼[楼主] 2011-06-16 09:48 阿不      
引用allentranks:大小写可以配置的

哪里配置?
 回复 引用 查看   

#10楼[楼主] 2011-06-16 09:48 阿不      
引用阿干@NET:确实很蛋疼,文件名大小写敏感还好理解,URL就非常蛋疼了,来访问的用户怎么知道你的大小写规则是怎么样的,要是你蛋疼的搞个iNdEx.hTMl这种首页,那岂不是不用让人访问了

Http标准的URL也是大小写敏感,只是我们习惯了不敏感的用法。
 回复 引用 查看   

#11楼[楼主] 2011-06-16 09:48 阿不      
引用xiaotie:
@大石头
linux是开放的,想写可以自己写一个嘛

这个,有点。。。。
 回复 引用 查看   

#12楼[楼主] 2011-06-16 09:49 阿不      
引用无尽思绪:MVC支持在mono上运行?

支持,mono 2.10.2已经支持MVC3
 回复 引用 查看   

#13楼 2011-06-16 09:50 无尽思绪      
引用阿不:
引用无尽思绪:MVC支持在mono上运行?

支持,mono 2.10.2已经支持MVC3

想问下,mono下,数据库你用什么?
 回复 引用 查看   

#14楼 2011-06-16 09:51 allentranks      
引用阿不:
引用allentranks:大小写可以配置的

哪里配置?

看你用的是什么,Apache和httplight都可以,网上搜下就有解决方案。Good Luck
 回复 引用 查看   

#15楼[楼主] 2011-06-16 09:55 阿不      
引用allentranks:
引用阿不:
引用allentranks:大小写可以配置的

哪里配置?

看你用的是什么,Apache和httplight都可以,网上搜下就有解决方案。Good Luck

这已经不是apache层面上的,而是mono层面上的大小写敏感。
 回复 引用 查看   

#16楼[楼主] 2011-06-16 09:56 阿不      
引用无尽思绪:
引用阿不:
引用无尽思绪:MVC支持在mono上运行?

支持,mono 2.10.2已经支持MVC3

想问下,mono下,数据库你用什么?

我目前是用XML文件的存储。因为Kooboo CMS支持 XML,SQLServer,SQLCe,MongoDb,Ravendb。我只是用XML的存储来测试。
 回复 引用 查看   

#17楼 2011-06-16 10:04 无尽思绪      
引用阿不:
引用无尽思绪:
引用阿不:
引用无尽思绪:MVC支持在mono上运行?

支持,mono 2.10.2已经支持MVC3

想问下,mono下,数据库你用什么?

我目前是用XML文件的存储。因为Kooboo CMS支持 XML,SQLServer,SQLCe,MongoDb,Ravendb。我只是用XML的存储来测试。


那mono下的数据库解决方案一般是?
MySQL? PostgreSQL?

Kooboo支持MongoDb,倒是一个意外,
有时间也要看看这个CMS,
DNN对这个倒是不支持。
 回复 引用 查看   

#18楼[楼主] 2011-06-16 10:27 阿不      
@无尽思绪
Kooboo CMS也支持MySQL。

Mono好像有支持PostgreSQL.
 回复 引用 查看   

#19楼 2011-06-16 10:31 无尽思绪      
引用阿不:
@无尽思绪
Kooboo CMS也支持MySQL。

Mono好像有支持PostgreSQL.

到Kooboo.com转了一圈, 你也是其中的一个开发人员吧?
 回复 引用 查看   

#20楼[楼主] 2011-06-16 10:48 阿不      
@无尽思绪
 回复 引用 查看   

#21楼 2011-06-16 11:14 doylecnn      
在我看来,在用一个大小写敏感的语言时,不考虑大小写敏感问题,才是奇怪的
这也是为何我讨厌VB那个大小写不敏感的语言的原因之一.
顺带一提,我是用着windows的linux粉
 回复 引用 查看   

#22楼 2011-06-16 11:15 aisk      
大小写敏感是文件系统的问题吧

顺便一提之前Mono了很久,最后还是转到Java上了
 回复 引用 查看   

#23楼 2011-06-16 12:50 weishao      
欢迎大家加入 .net开源交流群 69594961
 回复 引用 查看   

#24楼 2011-06-16 12:51 weishao      
唉,中国是应该盗版所以现在还有一些中小型企业用.net开发, 不然……
看来linux确实好, .net下面也只有mono了 ,唉 不过用的少
 回复 引用 查看   

#25楼 2011-06-16 13:28 猫之良品      
我更喜欢LINUX的文件系统,很讨厌WINDOWS的C: D: E:
 回复 引用 查看   

#26楼[楼主] 2011-06-16 14:00 阿不      
@doylecnn
我们写程序都是大小写敏感,这没有问题。但是在像文件名这种地方,经常用的功能,而且是普通用户经常出错的地方。大小敏感确实有很大障碍,不是一直都是说用户体验吗?这应该是一个很大的用户体验问题了。
 回复 引用 查看   

#27楼[楼主] 2011-06-16 14:01 阿不      
@猫之良品
相反,我不喜欢Linux只有一个根据的情况。我要重新了系统会怎么样?我的数据会不会好管理?
 回复 引用 查看   

#28楼[楼主] 2011-06-16 14:01 阿不      
@weishao
这个,确实。。。。
 回复 引用 查看   

#29楼 2011-06-16 15:55 猫之良品      
@阿不
WINDOWS的文件管理其实也不是很好,是因为你习惯而已。抛开旧经验,从新去审视各种系统的操作性,你会觉得很多更优秀的东西。
 回复 引用 查看   

#30楼[楼主] 2011-06-16 16:59 阿不      
引用猫之良品:
@阿不
WINDOWS的文件管理其实也不是很好,是因为你习惯而已。抛开旧经验,从新去审视各种系统的操作性,你会觉得很多更优秀的东西。

有道理,
 回复 引用 查看