本发明属于计算机磁盘分区领域,尤其涉及节省ntfs和fat32文件系统簇管理占用内存的方法。
背景技术
随着计算机磁盘越来越大,文件系统的大小也随之变得更大,甚至有超过2tb的分区,那么此时文件系统的位图也会变得更大,如果使用传统方式直接在内存中创建一个内存位图表示,那么将会增大内存使用的开销,如果在计算机内存不充足时,那么将会导致操作失败甚至程序崩溃。
技术实现要素:
鉴于上述缺陷,本发明提供了一种基于ntfs和fat32文件系统簇管理节省内存的方法,通过该方法对ntfs和fat32文件系统簇处理后,占用内存空间大大缩小,完全克服了采用传统方式直接在内存中创建一个内存位图表示,增大内存使用的开销的缺陷。
为解决上述技术问题,本发明所采用的技术方案是:
一种基于ntfs和fat32文件系统簇管理节省内存的方法,其特征在于:包括如下步骤:
步骤1,从文件系统中获取到位图总大小,然后将文件系统的位图按照固定大小分块读取到内存中;
步骤2,读取成功后,将位图转换成数组,并逐个判断这个数组里面的元素的值;如果是ntfs文件系统则将位图转换成uint64类型的数组,如果是fat32文件系统则将位图转换成int32的数组;
步骤3,按照文件系统的类型作如下处理:
文件系统为ntfs文件系统时分三种情况:
a、元素的值=(uint64)-1,则连续的簇数进行累加;
b、元素的值=0,如果此元素之前存在连续的簇,则生成一条记录,如果次元素之前不存在连续的簇,则直接跳过,不作处理;
c、元素的值不等于0,且不等于(uint64)-1,则对这个元素进行逐位判断并进行记录;
文件系统为fat32文件系统时分两种情况:
ⅰ、元素的值不等于0则将计数器加1;
ⅱ、元素的值等于0,如果此元素之前存在使用的簇,则生成一条记录,如果此元素之前不存在使用的簇,则直接跳过,不作处理。
a中,连续的簇数进行累加的方法具体为:连续的簇数加上这个块的簇数,记着:dwcluscount+=bitsize;bitsize指的是该元素所表示的簇数:bitsize=sizeof(uint64)*8,表示64个簇。
b中,元素的值=0则表示该元素中不包含任何簇,需要先判断dwcluscount是否等于0以确保此元素之前是否存在连续的簇,如果dwcluscount等于0则表示该元素之前也没有连续的簇,则可以直接跳过不作处理,如果dwcluscount不等于0则表示该元素之前有连续的簇,需要将其记录成一条clusinfo记录。
b中,clusinfo记录的具体记录方法如下:
clusinfo.lcn=起始簇号;
clusinfo.count=dwcluscount;//连续的簇数
cluslist.push_back(clusinfo);//将该条记录存储在向量中
记录完成后dwcluscount清0,起始簇号进行累加。
c中,元素的值不等于0,且不等于(uint64)-1则表示该元素所表示的64个簇存在不连续性,此时需要对这个元素进行逐位判断并进行记录,具体方法如下:1、将此uint64类型的元素转换成byte类型的数组;2、逐一检查该数组元素的每一位是否为1,如果为1则表示该簇被占用。
c中,具体算法如下:
int64byteoffset=bitindex/8;//定位bitindex这个簇在数组中位于哪个元素
int64bitoffset=bitindex%8;//定位bitindex这个簇在数组中所在的偏移
bytemask=(byte)(1<<bitoffset);
if(!(m_pbuffer[byteoffset]&mask))//m_pbuffer指的是不等于0且不等于-1的(uint64)这个元素,此时已经被转换成byte类型的数组;
{
returnfalse;
}
returntrue;
如果返回true则表示这位已经被占用,此时需要将dwcluscount加1,如果返回false则表示到这位已经使用的簇已经不再连续,需要将之前连续的簇记录并形成一条记录,然后继续判断该uint64的每一位,直致64位全部检查完毕,凡是遇到连续的就需要将dwcluscount加1,凡是遇到某位为0的情况就需要判断并形成一条记录。
ⅱ中,元素的值等于0则表示该元素中不包含任何簇,需要先判断dwcluscount是否等于0以确保此元素之前是否存在使用的簇,如果dwcluscount等于0则表示该元素之前也没有使用的簇,则可以直接跳过不作处理,如果dwcluscount不等于0则表示该元素之前有使用的簇,需要将其记录成一条clusinfo记录。
ⅱ中,具体记录方法如下:
clusinfo.lcn=起始簇号;
clusinfo.count=dwcluscount;//连续的元素个数
cluslist.push_back(clusinfo);//将该条记录存储在向量中
记录完成后dwcluscount清0,起始簇号进行累加。
本发明相对于现有技术具有如下优点:
本发明对ntfs和fat32文件系统进行了处理,将位图中连续簇和起始簇转换成记录,并且跳过没有被使用的簇,将位图转换成了记录,一条记录仅仅需要12个字节大大缩小了内存占用量,相对于传统方式直接在内存中创建一个内存位图表示来讲,大大降低了内存使用的开销,在计算机内存不充足时,也不会会导致操作失败甚至程序崩溃。
附图说明
图1为ntfs文件系统的位图处理流程图;
图2为fat32文件系统位图处理流程图。
具体实施方式
下面结合实施例对本发明作进一步的描述,所描述的实施例仅仅是本发明一部分实施例,并不是全部的实施例。基于本发明中的实施例,本领域的普通技术人员在没有做出创造性劳动前提下所获得的其他所用实施例,都属于本发明的保护范围。
一种基于ntfs和fat32文件系统簇管理节省内存的方法,其特征在于:
a、从文件系统中获取文件系统的位图总大小,将文件系统的位图按固定大小分块读取到内存中;
b、完成a步骤之后,区分文件系统进行处理,文件系统为ntfs按照如下方式进行处理:
将位图转换成uint64类型的数组,逐个判断这个数组里面的元素;
当元素的值等于(uint64)-1,对连续的簇数进行累加,记着:dwcluscount+=bitsize;bitsize指的是该元素所表示的簇数:bitsize=sizeof(uint64)*8,通常是表示64个簇;
当该元素的值等于0则表示该元素中不包含任何簇,需要先判断dwcluscount是否等于0以确保此元素之前是否存在连续的簇,如果dwcluscount等于0则表示该元素之前也没有连续的簇,则可以直接跳过不作处理,如果dwcluscount不等于0则表示该元素之前有连续的簇,需要将其记录成一条clusinfo记录,具体记录方法如下:
clusinfo.lcn=起始簇号;
clusinfo.count=dwcluscount;//连续的簇数
cluslist.push_back(clusinfo);//将该条记录存储在向量中
记录完成后dwcluscount清0,起始簇号进行累加;
当元素的值既不等于0又不等于(uint64)-1则表示该元素所表示的64个簇存在不连续性,那么此时我们需要对这个元素进行逐位判断并进行记录,具体方法如下:1、将此uint64类型的元素转换成byte类型的数组;2、逐一检查该数组元素的每一位是否为1,如果为1则表示该簇被占用,具体算法如下:
int64byteoffset=bitindex/8;//定位bitindex这个簇在数组中位于哪个元素
int64bitoffset=bitindex%8;//定位bitindex这个簇在数组中所在的偏移
bytemask=(byte)(1<<bitoffset);
if(!(m_pbuffer[byteoffset]&mask))//m_pbuffer指的是不等于0且不等于-1的(uint64)这个元素,此时已经被转换成byte类型的数组;
{
returnfalse;
}
returntrue;
如果返回true则表示这位已经被占用,此时需要将dwcluscount加1,如果返回false则表示到这位已经使用的簇已经不再连续,需要将之前连续的簇记录并形成一条记录,然后继续判断该uint64类型的元素的每一位,直致64位全部检查完毕,凡是遇到连续的就需要将dwcluscount加1,凡是遇到某位为0的情况就需要判断并形成一条记录;
文件系统为fat32按照如下方式进行处理:
将位图转换成int32的数组,并逐个判断这个数组里面的元素;
当该元素的值不等于0则将计数器加1(dwcluscount+=1),以表示该元素中存在已使用的簇;
当元素的值等于0则表示该元素中不包含任何簇,需要先判断dwcluscount是否等于0以确保此元素之前是否存在使用的簇,如果dwcluscount等于0则表示该元素之前也没有使用的簇,则可以直接跳过不作处理,如果dwcluscount不等于0则表示该元素之前有使用的簇,需要将其记录成一条clusinfo记录,具体记录方法如下:
clusinfo.lcn=起始簇号;
clusinfo.count=dwcluscount;//连续的元素个数
cluslist.push_back(clusinfo);//将该条记录存储在向量中
记录完成后dwcluscount清0,起始簇号进行累加。
新型位图记录法的数据结构定义如下:
typedefstructtagclusinfo
{
int64lcn;//起始逻辑簇号
dwordcount;//连续的簇的数目
}clusinfo;
举例说明:
分析一个小于200兆的ntfs空分区,该分区每个簇占有用8个扇区的情况,使用新型存储方式与传统存储方式所占用的内存对比:
如果使用传统位图方式记录ntfs的各个簇的占用情况则需要将该ntfs文件系统占用的55个扇区的位图保存在内存中,需要使用512*55=28160个字节,而使用新型的记录方式则仅需要5条记录60个字节的内存即可,相比传统方法节省内存开销469倍,5条记录分别是:
[0]{lcn=0count=35}
[1]{lcn=44count=1537}
[2]{lcn=7506count=980}
[3]{lcn=8530count=1}
[4]{lcn=8532count=65}
注:以上是举例说明,实际情况可能有所偏差。