【旧文章搬运】ntfs中的文件名排序规则~
原文发表于百度空间,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中的文件名排序规则~的更多相关文章
- 关于mysql中字符集和排序规则说明
文章转自 http://blog.csdn.net/smallSBoy/article/details/52997138 数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set ...
- mysql中字符集和排序规则说明
数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation). 一.字符集 字符集,即用于定义字符在数据库中的编码的集合. 常见 ...
- 【旧文章搬运】再谈隐藏进程中的DLL模块
原文发表于百度空间,2009-09-17========================================================================== 相当老的话 ...
- 【旧文章搬运】PsVoid中IrpCreateFile函数在Win7下蓝屏BUG分析及解决
原文发表于百度空间,2010-04-05========================================================================== 这也许是我 ...
- 【旧文章搬运】改PEB中的映像路径可以这样~
原文发表于百度空间,2008-7-26========================================================================== 用常用的几个 ...
- 【旧文章搬运】《从PEB获取内存中模块列表》的补充
原文发表于百度空间,2008-7-26========================================================================== 继续研究PE ...
- 【旧文章搬运】遍历EPROCESS中的ActiveProcessLinks枚举进程
原文发表于百度空间,2008-7-25========================================================================== 前面对PEB ...
- 【旧文章搬运】从PEB获取内存中模块列表
原文发表于百度空间,2008-7-25========================================================================== PEB中的L ...
- 【旧文章搬运】获取并修改PEB中的映像路径,命令行和当前目录
原文发表于百度空间,2008-7-24 当时对UNICODE_STRING的使用还有点问题,导致最终效果图中字符串被截断了======================================= ...
随机推荐
- 免费DNSserver有哪些?
DNS 是上网中极其重要的一环,因为电脑仅仅认识数字组成的 IP 地址,人们发明了域名来帮助记忆 (如 iPlaySoft.com),因此,在訪问不论什么域名时.背后都须要一台 DNS server来 ...
- C#对象实例化
C#常用的对象实例化有以下几种方式: using System; using System.Collections.Generic; using System.Linq; using System.R ...
- SQL获取年月日方法
方法一:利用DATENAME 在SQL数据库中,DATENAME(datetype,date)函数的作用是从日期中提取指定部分数据,其返回类型是nvarchar.datetype类型见附表1. SEL ...
- 基于RFS(robot framework selenium)框架模拟POST/GET请求执行自动化接口测试
打开RIDE添加测试用例 如: Settings Library Collections Library RequestsLibrary Test Cases ...
- sed系列:行或者模式匹配删除特定行
“p” command prints the buffer (remember to use -n option with “p”) “d” command is just opposite, its ...
- 通过路由管理视图间切换 - AngularJS路由解析
模板的视图刷新 ng-view这个指令和路由组合之后就可以将$route对应的视图放入指定的HTML中,这一过程中它会创建自己的作用域并将模板嵌套在内部. ng-view指令的优先级是1000(终极) ...
- Webview页面的控件元素定位
前言 现在有很多App都是Hybrid的,即有原生的页面又有Webview的页面,元素的可以通过uiautomatorviewer工具 进行控件元素的定位,Webview页面的则无法通过此方式定位,而 ...
- bb=Discuz与 Discuz! X ,Discuz!NT区别
没加x的,仅仅是单独的论坛. 加了x的,模块加了很多了,门户,家园,排行榜,群组,都是Discuz! X上的,而Discuz!上没有,所以说Discuz! X更加适用于建设门户网 Discuz! X ...
- 深入理解Java:注解(Annotation)自定义注解入门(转载)
要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...
- 网络爬虫(蜘蛛)Scrapy,Python安装!
Scrapy,Python安装.使用! 1.下载安装Python2.7.6.由于Scrapy还不支持3.x版本号. Latest Python 2 Release - Python 2.7.6,安装时 ...