【旧文章搬运】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的使用还有点问题,导致最终效果图中字符串被截断了======================================= ...
随机推荐
- UVA 12338 - Anti-Rhyme Pairs(后缀数组+RMQ)
UVA 12338 - Anti-Rhyme Pairs 题目链接 题意:给定一些字符串,每次询问求出两个字符串的最长公共前缀的长度 思路:把字符串排序,就能求出height和rank数组,然后利用R ...
- xml实现AOP
1.使用<aop:config></aop:config> 2.首先我们需要配置<aop:aspect></aop:aspect>,就是配置切面 2.1 ...
- Cocos2d-x 3.0的启动流程
Cocos2d-x 3.0变动非常大,包含启动的方式,我看了下对android的启动总结例如以下: Java方面: AppActivity继承Cocos2dxActivity Coco ...
- qemu-kvm编译错误
今天编译了下qemu-kvm,死活编不过,错误信息如下: CC block/qcow2-snapshot.oIn file included from ./qemu-common.h:6:0, ...
- Oracle 索引 简单介绍
1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.&l ...
- JS中小数如何转化为百分数并能四舍五入
<script type="text/javascript">//n表示百分数保留的位数 function toPercent(n){ n = n || 2; retu ...
- iOS8 Push Notifications
本文转载至 http://blog.csdn.net/pjk1129/article/details/39551887 原贴地址:https://parse.com/tutorials/ios-p ...
- 基于XML配置的Sping AOP详解
一.编写基本处理方法 package com.kang.sping.xml.aop; public class Math{ //加 public int add(int n1,int n2){ int ...
- db的操作
'/---------------------------------------------------------------------------------------------- '/ ...
- ABAP 取字段的简短描述
取字段的简短描述: 取字段描述 DATA inttab LIKE STANDARD TABLE OF dfies WITH HEADER LINE. CALL FUNCTION 'DDIF_FIELD ...