原文发表于百度空间,2011-04-05
==========================================================================

在分析ntfs的B+树时,不可避免地要进行文件名大小的比较,经过观察发现通常我们在资源管理器中看到的文件排序和ntfs中有很大不同。
比如,有下面一些文件,在资源管理器中排序如下:

可以看到对汉字是按其汉语拼音排序的。
而在ntfs的目录索引中排序如下:

观察发现,由于ntfs存储的是Unicode文件名,所以比较时是按首字符的Unicode编码来比较的。实际分析如下:

在ntfs的INDX中的实际顺序(后面是第一个Unicode字符的编码):

12.doc    0x0031
xxx.doc   0x0078
yyy.doc   0x0079
~1.doc    0x007E
刘.doc    0x5218
孙.doc    0x5B59
康.doc    0x5EB7
张.doc    0x5F20
李.doc    0x674E
王.doc    0x738B
赵.doc    0x8D75
钱.doc    0x94B1
齐.doc    0x9F50

为了验证这个结果,我在ntfs的源代码中找到了答案:

FSRTL_COMPARISON_RESULT  NtfsCollateNames (
IN PWCH UpcaseTable,
IN ULONG UpcaseTableSize,
IN PUNICODE_STRING Expression,
IN PUNICODE_STRING Name,
IN FSRTL_COMPARISON_RESULT WildIs,
IN BOOLEAN IgnoreCase )
{
WCHAR ConstantChar;
WCHAR ExpressionChar;
ULONG i;
ULONG Length; if (Expression->Length < Name->Length) {
Length = Expression->Length / sizeof(WCHAR);
} else {
Length = Name->Length / sizeof(WCHAR);
} for (i = ; i < Length; i += ) {
ConstantChar= Name->Buffer[i];//取原始字符
ExpressionChar= Expression->Buffer[i];
if ( IgnoreCase ) {//根据是否区分大小写进行判断,Windows的文件名不区分大小写,所以这里通常是TRUE
//UpcaseTable可以直接读取ntfs根目录下的$Upcase得到
if (ConstantChar < UpcaseTableSize) {
ConstantChar = UpcaseTable[(ULONG)ConstantChar];//取UpcaseTable中的对应字符
}
if (ExpressionChar < UpcaseTableSize) {
ExpressionChar = UpcaseTable[(ULONG)ExpressionChar];//取UpcaseTable中的对应字符
}
} //判断字符是否无效 if ( FsRtlIsUnicodeCharacterWild(ExpressionChar) ) {
DebugTrace( -, Dbg, ("NtfsCollateNames -> %08lx (Wild)\n", WildIs) );
return WildIs;
} //进行比较 if ( ExpressionChar < ConstantChar ) {
DebugTrace( -, Dbg, ("NtfsCollateNames -> LessThan\n") );
return LessThan;
} if ( ExpressionChar > ConstantChar ) {
DebugTrace( -, Dbg, ("NtfsCollateNames -> GreaterThan\n") );
return GreaterThan;
} } ....//省略部分代码 DebugTrace( -, Dbg, ("NtfsCollateNames -> EqualTo\n") );
return EqualTo; }

这回对ntfs中文件名的排序和比较有个清楚的了解了,不过呢,这个结果看起来有一点怪怪的~~

【旧文章搬运】ntfs中的文件名排序规则~的更多相关文章

  1. 关于mysql中字符集和排序规则说明

    文章转自 http://blog.csdn.net/smallSBoy/article/details/52997138 数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set ...

  2. mysql中字符集和排序规则说明

    数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation). 一.字符集 字符集,即用于定义字符在数据库中的编码的集合. 常见 ...

  3. 【旧文章搬运】再谈隐藏进程中的DLL模块

    原文发表于百度空间,2009-09-17========================================================================== 相当老的话 ...

  4. 【旧文章搬运】PsVoid中IrpCreateFile函数在Win7下蓝屏BUG分析及解决

    原文发表于百度空间,2010-04-05========================================================================== 这也许是我 ...

  5. 【旧文章搬运】改PEB中的映像路径可以这样~

    原文发表于百度空间,2008-7-26========================================================================== 用常用的几个 ...

  6. 【旧文章搬运】《从PEB获取内存中模块列表》的补充

    原文发表于百度空间,2008-7-26========================================================================== 继续研究PE ...

  7. 【旧文章搬运】遍历EPROCESS中的ActiveProcessLinks枚举进程

    原文发表于百度空间,2008-7-25========================================================================== 前面对PEB ...

  8. 【旧文章搬运】从PEB获取内存中模块列表

    原文发表于百度空间,2008-7-25========================================================================== PEB中的L ...

  9. 【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录

    原文发表于百度空间,2008-7-24 当时对UNICODE_STRING的使用还有点问题,导致最终效果图中字符串被截断了======================================= ...

随机推荐

  1. 免费DNSserver有哪些?

    DNS 是上网中极其重要的一环,因为电脑仅仅认识数字组成的 IP 地址,人们发明了域名来帮助记忆 (如 iPlaySoft.com),因此,在訪问不论什么域名时.背后都须要一台 DNS server来 ...

  2. C#对象实例化

    C#常用的对象实例化有以下几种方式: using System; using System.Collections.Generic; using System.Linq; using System.R ...

  3. SQL获取年月日方法

    方法一:利用DATENAME 在SQL数据库中,DATENAME(datetype,date)函数的作用是从日期中提取指定部分数据,其返回类型是nvarchar.datetype类型见附表1. SEL ...

  4. 基于RFS(robot framework selenium)框架模拟POST/GET请求执行自动化接口测试

    打开RIDE添加测试用例 如: Settings         Library Collections       Library RequestsLibrary       Test Cases ...

  5. sed系列:行或者模式匹配删除特定行

    “p” command prints the buffer (remember to use -n option with “p”) “d” command is just opposite, its ...

  6. 通过路由管理视图间切换 - AngularJS路由解析

    模板的视图刷新 ng-view这个指令和路由组合之后就可以将$route对应的视图放入指定的HTML中,这一过程中它会创建自己的作用域并将模板嵌套在内部. ng-view指令的优先级是1000(终极) ...

  7. Webview页面的控件元素定位

    前言 现在有很多App都是Hybrid的,即有原生的页面又有Webview的页面,元素的可以通过uiautomatorviewer工具 进行控件元素的定位,Webview页面的则无法通过此方式定位,而 ...

  8. bb=Discuz与 Discuz! X ,Discuz!NT区别

    没加x的,仅仅是单独的论坛. 加了x的,模块加了很多了,门户,家园,排行榜,群组,都是Discuz! X上的,而Discuz!上没有,所以说Discuz! X更加适用于建设门户网 Discuz! X ...

  9. 深入理解Java:注解(Annotation)自定义注解入门(转载)

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  10. 网络爬虫(蜘蛛)Scrapy,Python安装!

    Scrapy,Python安装.使用! 1.下载安装Python2.7.6.由于Scrapy还不支持3.x版本号. Latest Python 2 Release - Python 2.7.6,安装时 ...