NTFS文件系统中目录和文件大小的统计方法及统计装置与流程

文档序号:26445872发布日期:2021-08-27 13:46阅读:431来源:国知局
NTFS文件系统中目录和文件大小的统计方法及统计装置与流程

本发明涉及计算机磁盘空间管理技术领域,具体涉及一种ntfs文件系统文件和目录大小的统计方法、统计装置、电子设备和可读存储介质。



背景技术:

几乎所有的主流文件系统都不会专门保存目录的大小(实际大小或占用空间),要实现获取目录的大小必须想办法获取其子目录项的大小。

现有技术一般是通过操作系统提供的接口,如findfirstfile等来进行递归扫描,叠加所有子文件(夹)的大小,这种方案兼容性较强,在扫描的过程中不需要关注各个文件系统的差异,实现起来比较简单。但是这种方法的特点是需要在磁盘的不同位置多次读取数据,每次只能读取少量信息,由于磁盘的io性能远比内存差,因此这种方法需要消耗较多的时间,严重占用磁盘的io。

ntfs文件系统是现代windows操作系统中的主流文件格式,它具有较多的特性,例如ntfs的mft元文件表中包含分区中所有的文件的“文件记录”,这些文件记录保存了目录和文件的名字、大小、占用空间、父目录等。但父目录和子目录之间的分布并不是树形的,甚至子目录可能出现在父目录前面很远的位置。由于ntfs文件系统没有提供统计目录和文件大小的功能,为了满足用户了解文件和目录大小的需求,亟需开发人员利用ntfs文件系统的特性开发出操作系统没有提供的功能,即实现目录及文件大小的统计。



技术实现要素:

有鉴于此,本申请提供一种ntfs文件系统中目录和文件大小的统计方法、统计装置、电子设备和可读存储介质,通过遍历、解析和整理ntfs文件系统的mft元文件的信息,即可得到所有目录和文件的大小,且由于mft元文件在磁盘上的分布比较集中,可以一次性读取大量数据进行处理,也最大限度的减少了io瓶颈。本申请提供的技术方案是:

一种ntfs文件系统中目录和文件大小的统计方法,包括:

获取mft元文件的起始位置和自身文件记录大小;

根据所述mft元文件的起始位置和自身文件记录大小读取并解析mft元文件的自身文件记录,得到mft元文件的全部datarun集合;

根据所述mft元文件的全部datarun集合,依次解析并整理mft元文件中各个文件记录提供的信息,得到全部目录和文件的大小。

可选的,所述根据所述mft元文件的起始位置和自身文件记录大小读取并解析mft元文件的自身文件记录,得到mft元文件的全部datarun集合,包括:

跳转到所述mft元文件的起始位置,根据所述mft元文件的自身文件记录大小读取mft元文件的自身文件记录中的全部属性并解析,

当解析出0x80属性时,得到第一datarun集合,

若解析出0x20属性,则解析出0x20属性中是否有0x80属性,若没有0x80属性,则第二datarun集合为空,若有0x80属性,则得到第二datarun集合,若未解析出0x20属性,则第二datarun集合为空;

将第一datarun集合和第二datarun集合合并得到全部datarun集合。

可选的,所述根据所述mft元文件的全部datarun集合,依次解析并整理mft元文件中各个文件记录提供的信息,得到全部目录和文件的大小,包括:

解析当前文件记录的全部属性,得到与预设属性相同的属性提供的属性信息;

根据得到的属性信息寻找文件或目录的父目录并将大小递归累加到其父目录中;

判断当前文件记录是否为最后一个文件记录,若否则跳转到下一个文件记录后返回第一步,若是则流程结束,得到全部目录和文件的大小。

可选的,所述解析当前文件记录的全部属性,得到与预设属性相同的属性提供的属性信息,包括:

所述预设属性包括文件记录头、0x10属性、0x20属性、0x30属性和0x80属性;

解析文件记录头的信息得到目录标识和id,解析0x10属性的信息得到主记录标识,解析0x20属性的信息得到属性记录id列表,解析0x30属性的信息得到父目录id列表,解析0x80属性的信息得到大小;

将得到的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小分别存储到文件记录对应的预设信息结构体的对应字段中。

可选的,所述根据得到的属性信息寻找文件或目录的父目录并将大小递归累加到其父目录中,包括:

初始化第一映射表和第二映射表,所述第一映射表和第二映射表均由键值对组成,所述第一映射表的键为主记录id,值为主记录id对应的信息结构体,第二映射表的键为属性记录id,值为属性记录id对应的主记录id和属性记录id对应的信息结构体;

对每个文件记录的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小执行以下步骤:

读取文件记录的主记录标识,若主记录标识为是,则该文件记录为主记录,进入主记录处理流程,若主记录标识为否,则该文件记录为属性记录,进入属性记录处理流程;

主记录处理流程:

读取主记录的属性记录id列表,将属性记录id列表中各个属性记录的大小累加到主记录的大小中并将各个属性记录的父目录id列表补充到主记录的父目录id列表中;

判断主记录的目录标识是否为是,若目录标识为否,则读取主记录的父目录id列表,将主记录的大小递归累加到主记录的父目录id列表中各个父目录的大小中,再在第一映射表中添加一个键值对,键为主记录id,值为主记录id对应的空的信息结构体,再将主记录的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小填入信息结构体对应的字段中;

若目录标识为是,则以主记录id为键,在第一映射表中查找是否有相同的主记录id,若未找到相同的主记录id,则在第一映射表中添加一个键值对,键为主记录id,值为主记录id对应的空的信息结构体,再将主记录的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小填入信息结构体对应的字段中;若找到相同的主记录id,则将主记录提供的父目录id列表补充到第一映射表中主记录id对应的父目录id列表中,再将主记录的大小递归累加到第一映射表中主记录id对应的父目录id列表中各个父目录的大小中;

属性记录处理流程:

以属性记录id为键,在第二映射表中查找是否有相同的属性记录id,若没有找到相同的属性记录id,则在第二映射表中添加一个键值对,键为属性记录id,值为属性记录对应的空的主记录id和属性记录对应的空的信息结构体,再将属性记录的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小填入信息结构体对应的字段中;若找到相同的属性记录id,则取出第二映射表中属性记录id对应的主记录id,以主记录id为键,在第一映射表中找到主记录id,将第二映射表中属性记录id对应的大小递归累加到第一映射表中主记录id对应的父目录id列表中各个父目录的大小中,再将第二映射表中属性记录id的大小累加到第一映射表中主记录id对应的大小中,再将第一映射表中主记录id对应的大小递归累加到第二映射表中属性记录id对应的父目录id列表中各个父目录的大小中,最后将第二映射表中属性记录id对应的父目录id列表补充到第一映射表中主记录id对应的父目录id列表中。

可选的,所述将属性记录id列表中各个属性记录的大小累加到主记录的大小中并将各个属性记录的父目录id列表补充到主记录的父目录id列表中,包括:

判断主记录的属性记录id列表的大小是否为0,

若属性记录id列表的大小不为0,则遍历属性记录id列表中的全部属性记录id,以各个属性记录id为键,在第二映射表中查找是否有相同的属性记录id;若找到相同的属性记录id,则将该属性记录id对应的大小累加到主记录的大小中,然后将该属性记录id对应的父目录id列表补充到主记录的父目录id列表中;若未找到相同的属性记录id,则在第二映射表中添加一个键值对,键为属性记录id,值为主记录id和该属性记录对应的空的信息结构体;

若属性记录id列表的大小为0,则不动作。

可选的,所述将主记录的大小递归累加到主记录的父目录id列表中各个父目录的大小中,包括:

判断主记录的父目录id列表的大小是否为0,若父目录id列表的大小为0,则不动作,若父目录id列表的大小不为0,则进入下一步,

遍历父目录id列表中的全部父目录id,以各个父目录id为键,在第一映射表中查找是否有相同的父目录id;若未找到相同的父目录id,则在第一映射表中添加一个键值对,键为该父目录id,值为该父目录id对应的空的信息结构体,再设置该父目录id对应的信息结构体的大小为主记录的大小;

若找到相同的父目录id,则将主记录的大小累加到第一映射表中该父目录id对应的大小中,再判断第一映射表中该父目录id对应的父目录id列表大小是否为0,若为0,则流程结束,若不为0,则返回上一步。

本申请还提供一种ntfs文件系统中目录和文件大小的统计装置,包括:

mft元文件信息定位模块,用于获取mft元文件的起始位置和自身文件记录大小;

mft元文件信息收集模块,用于根据所述mft元文件的起始位置和自身文件记录大小读取并解析mft元文件的自身文件记录,得到mft元文件的全部datarun集合;

mft元文件信息解析模块,用于根据所述mft元文件的全部datarun集合,依次解析并整理mft元文件中各个文件记录提供的信息,得到全部目录和文件的大小。

本申请还提供一种电子设备,包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序以实现上述ntfs文件系统中目录和文件大小的统计方法的步骤。

本申请还提供一种可读存储介质,所述可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上述ntfs文件系统中目录和文件大小的统计方法的步骤。

本申请提供了一种ntfs文件系统中目录和文件大小的统计方法,包括:获取mft元文件的起始位置和自身文件记录大小;根据mft元文件的起始位置和自身文件记录大小读取并解析mft元文件的自身文件记录,得到mft元文件的全部datarun集合;根据mft元文件的全部datarun集合,依次解析并整理mft元文件中各个文件记录提供的信息,得到全部目录和文件的大小。

可见,本申请通过获取mft元文件的起始位置和自身文件记录大小读取并解析mft元文件的自身文件记录,得到了完整的mft元文件,再依次解析完整的mft元文件中各个文件记录,得到了分区中全部目录和文件的大小,即本申请采用了直接扫描mft元文件并整理mft元文件提供的信息的方式来获取目录和文件的大小,实现了高效快速地对目录和文件大小的统计,且io占用极少。

附图说明

为了更清楚地说明本发明实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图得到其他的附图。

图1为本申请实施例提供的一种ntfs文件系统中目录和文件大小的统计方法的流程图;

图2为本申请实施例提供的一种根据mft元文件的全部datarun集合依次解析并整理mft元文件中各个文件记录提供的信息得到全部目录和文件的大小的方法的流程图;

图3为本申请实施例提供的一种ntfs文件系统中目录和文件大小的统计装置的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下,所得到的所有其他实施例,都属于本发明保护范围。

为了使本领域的技术人员更好地理解本发明的技术方案,下面结合附图和具体实施例对本发明作进一步的详细说明。

下面对本申请涉及的一些专有名字进行解释,以便于理解本申请的技术方案:

$mft(mft元文件):ntfs文件系统的一个元文件,由文件系统自己维护,其中记录着当前分区的所有文件和目录的文件记录;

文件记录:$mft的组成单元,一个文件记录由文件记录头和若干属性组成,这些属性分别描述了文件或目录的不同参数,如名字、占用空间等;

文件记录属性:文件记录中用于描述文件或目录不同参数的单元,按类型有0x10属性、0x30、0x80等,本发明并不需要关心全部的属性类型;

数据运行(datarun):用于表示文件实际所在位置的项,数据运行由两部分组成:起始虚拟簇号、簇数;

0x10属性:文件记录的标准属性,含有此属性的文件记录对应一个文件或目录,不含此属性的文件记录是某个其它文件记录的属性记录;

0x20属性:当一个文件记录含有非常多的属性时,这些属性无法被存储到同一个文件记录里面,此时需要将一些属性存放到别的文件记录中,0x20属性用于指明哪些属性存放到了哪些文件记录中;

0x30属性:存有文件的文件名;

0x80属性:存有文件的占用空间和实际大小。

ntfs文件系统的mft元文件中包含分区中所有的文件的“文件记录”,这些文件记录保存了目录和文件的名字、大小、占用空间、父目录等。但父目录和子目录之间的分布并不是树形的,甚至子目录可能出现在父目录前面很远的位置。如果采用读取到了子目录再根据子目录的文件记录中提取到的父目录文件记录号去读取父目录的文件记录,那么这种方案就无法利用mft元文件物理连续性较好的优势,退化成了基于操作系统提供的接口来实现的方法。

因此,要实现基于mft元文件占用空间快速扫描,必须要解决的问题有:一是寻找一种方法,使得不管父目录出现在子目录前或后,子目录最终都能正确地找到其所属的父目录。二是要能实现对文件记录的解析,在遇到各种复杂的情况时仍然能正确获取文件的相关信息,最终实现对ntfs文件系统中文件和目录的大小(实际大小和占用空间)的快速计算。基于上述技术问题,本申请提供一种ntfs文件系统中目录和文件大小的统计方法。

具体请参考图1,图1为本申请实施例提供的一种ntfs文件系统中目录和文件大小的统计方法的流程图,具体包括:

s11:获取mft元文件的起始位置和自身文件记录大小。

本实施例是针对ntfs文件系统提供一种目录和文件大小的统计方法,即通过扫描ntfs文件系统中的mft元文件来实现,那么首先要通过引导扇区计算出两个值:mft元文件的起始位置和自身文件记录大小,具体获得mft元文件的起始位置和自身文件记录大小的步骤是:读取引导扇区偏移0x40位置的信息得到mft元文件的自身文件记录大小,读取引导扇区偏移0x30位置的信息得到mft元文件的起始逻辑簇号。

进一步的,在获取mft元文件的起始位置和自身文件记录大小步骤前,还可以包括判断文件系统是否为ntfs系统的步骤,具体的方法是:读取磁盘的引导扇区,如果是ntfs文件系统,那么引导扇区的前三个字节是跳转指令,第四到第七个字节是魔法数0x5346544e(即字符串”ntfs”的ascii码),那么根据第四到第七个字节的魔法数即可确定是否为ntfs文件系统。

s12:根据mft元文件的起始位置和自身文件记录大小读取并解析mft元文件的自身文件记录,得到mft元文件的全部datarun集合。

进一步的,根据mft元文件的起始位置和自身文件记录大小读取并解析mft元文件的自身文件记录,得到mft元文件的全部datarun集合,包括:

跳转到mft元文件的起始位置,根据mft元文件的自身文件记录大小读取mft元文件的自身文件记录中的全部属性并解析,

当解析出0x80属性时,得到第一datarun集合,

若解析出0x20属性,则解析出0x20属性中是否有0x80属性,若没有0x80属性,则第二datarun集合为空,若有0x80属性,则得到第二datarun集合,若未解析出0x20属性,则第二datarun集合为空;

将第一datarun集合和第二datarun集合合并得到全部datarun集合。

需要说明的是,本实施例中软件跳转到mft元文件所在位置,即mft元文件的起始逻辑簇号,根据mft元文件的自身文件记录大小读取一个文件记录,这个文件记录就是mft元文件的自身文件记录,通过对这个自身文件记录进行分析,以获得mft元文件的全部datarun集合。具体的分析方法包括:(1)解析mft元文件的0x80属性,得到一个mft元文件的datarun集合,这个datarun集合可能是完整的,也可能不是,(2)判断是否有0x20属性,如果没有则不需要特殊处理,即根据0x80属性即得到全部datarun,如果有0x20属性,且0x20属性中包含0x80属性,则需要解析0x20属性,将其中的0x80属性提取出来,追加到原有的0x80属性后,这样才能获得完整的datarun集合。

具体的,文件记录的头部有字段用来记录这个文件记录中第一个属性的偏移位置,每个属性又记录了它们自身的大小,所以可以实现遍历文件记录的所有属性,并通过获取属性的id来判断是否是0x20属性。

具体的,解析mft元文件自身文件记录的0x80属性,得到一个mft元文件的datarun集合的方法包括:遍历mft元文件的自身文件记录的所有属性,直到遇到0x80属性,0x80属性中会记录0x80属性到datarun集合的偏移量,同时0x80属性也会记录自身的大小,通过两个值可以算出datarun部分的长度,然后每个datarun由这样的规则组成:datarun序列由一系列的16进制数所组成,每个datarun结点由三部分组成,第一部分占1个字节、第二部分是datarun的簇数、第三部分则是datarun的起始簇号,其中第二、三部分的长度由第一部分所指示,这一字节的低4位代表簇数的长度,高4位代表起始簇号的长度,比如第一部分是0x31,则代表其后紧邻的1个字节表示占用簇数,再后面3个字节表示起始簇号,如0x12,2表示0x12后有2个字节用来表示datarun的占用簇数,1表示占用扇区后有1个字节用于表示datarun的起始簇号,所以该datarun一共占用1+2+1个字节,根据这种方式不断遍历,直到用完长度为止,获取全部的datarun集合。

s13:根据mft元文件的全部datarun集合,依次解析并整理mft元文件中各个文件记录提供的信息,得到全部目录和文件的大小。

进一步的,如图2所示,根据mft元文件的全部datarun集合,依次解析并整理mft元文件中各个文件记录提供的信息,得到全部目录和文件的大小,包括:

s131:解析当前文件记录的全部属性,得到与预设属性相同的属性提供的属性信息;

s132:根据得到的属性信息寻找文件或目录的父目录并将大小递归累加到其父目录中;

s133:判断当前文件记录是否为最后一个文件记录,若否则跳转到下一个文件记录后返回s131,若是则流程结束,得到全部目录和文件的大小。

进一步的,s131解析当前文件记录的全部属性,得到与预设属性相同的属性提供的属性信息,包括:

预设属性包括文件记录头、0x10属性、0x20属性、0x30属性和0x80属性;

解析文件记录头的信息得到目录标识和id,解析0x10属性的信息得到主记录标识,解析0x20属性的信息得到属性记录id列表,解析0x30属性的信息得到父目录id列表,解析0x80属性的信息得到大小;

将得到的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小分别存储到文件记录对应的预设信息结构体的对应字段中。

优选的,解析当前文件记录的全部属性,得到与预设属性相同的属性提供的属性信息,还可以包括:

判断当前文件记录是否在使用中,若是,则进入解析当前文件记录的全部属性,得到与预设属性相同的属性提供的属性信息步骤,若否,则流程结束。

具体的,判断当前文件记录是否在使用中的方法包括:读取当前文件记录的0x16偏移处的一个字节,如果该字节与1进行按位与运算后的结果为1,则表明该文件记录在使用中。

以下进行具体说明,文件记录由标准文件记录头+若干属性组成,文件记录头占据了文件记录最前面的部分,其中偏移0x16位置有一个2字节的整数,用于表示此文件记录是否使用中,是目录或文件,值为0x1表示是文件,为0x3表示是目录。偏移0x14处有一个2字节的整数,代表到第一个属性的偏移量,跳转到这个偏移处即可开始解析属性。偏移0x0c位置有一个4字节的整数记录了此文件记录的id。属性由两部分组成,标准属性头和属性体,其中属性体可能是实际的信息,也可能是实际信息的datarun,如果是前一种情况,则叫做常驻属性,后一种叫非常驻属性。属性头偏移0处有4字节整数指示属性的类型,如果属性类型为0xffffffff则表示后面没有更多的属性了,对文件记录的解析到此结束,偏移0x8处有1字节指示是否是常驻属性(为1表示非常驻,0表示常驻),偏移0x9处有1个字节表示本属性的名字的长度,0xa处则有2个字节表示到名字的偏移量。偏移0x10处有一个4字节整数,代表了这个属性的整体长度,在属性头位置增加这个整体长度的偏移量,就能跳转到下一个属性,0x14位置有一个2字节的整数,代表到属性体的偏移量,属性头开始位置加上此偏移量,即可开始解析属性体。

在本实施例中需要被解析的属性只有0x10属性、0x20属性、0x30属性和0x80属性,解析时遇到一个属性就看它的属性类型,如果不是这几类预设属性则直接跳过。每个属性中含有不同的信息,有不同的解析方法,本申请只是保护解析出这几个属性的软件流程方法,并不限定解析出这几个属性的信息的具体方法,具体解析方法可以参考ntfs相关文档。

进一步的,s132根据得到的属性信息寻找文件或目录的父目录并将大小递归累加到其父目录中,包括:

初始化第一映射表和第二映射表,第一映射表和第二映射表均由键值对组成,第一映射表的键为主记录id,值为主记录id对应的信息结构体,第二映射表的键为属性记录id,值为属性记录id对应的主记录id和属性记录id对应的信息结构体;

对每个文件记录的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小执行以下步骤:

读取文件记录的主记录标识,若主记录标识为是,则该文件记录为主记录,进入主记录处理流程,若主记录标识为否,则该文件记录为属性记录,进入属性记录处理流程;

主记录处理流程:

读取主记录的属性记录id列表,将属性记录id列表中各个属性记录的大小累加到主记录的大小中并将各个属性记录的父目录id列表补充到主记录的父目录id列表中;

判断主记录的目录标识是否为是,若目录标识为否,则读取主记录的父目录id列表,将主记录的大小递归累加到主记录的父目录id列表中各个父目录的大小中,再在第一映射表中添加一个键值对,键为主记录id,值为主记录id对应的空的信息结构体,再将主记录的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小填入信息结构体对应的字段中;

若目录标识为是,则以主记录id为键,在第一映射表中查找是否有相同的主记录id,若未找到相同的主记录id,则在第一映射表中添加一个键值对,键为主记录id,值为主记录id对应的空的信息结构体,再将主记录的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小填入信息结构体对应的字段中;若找到相同的主记录id,则将主记录提供的父目录id列表补充到第一映射表中主记录id对应的父目录id列表中,将主记录的大小递归累加到第一映射表中主记录id对应的父目录id列表中各个父目录的大小中;

属性记录处理流程:

以属性记录id为键,在第二映射表中查找是否有相同的属性记录id,若没有找到相同的属性记录id,则在第二映射表中添加一个键值对,键为属性记录id,值为属性记录对应的空的主记录id和属性记录对应的空的信息结构体,再将属性记录的目录标识、id、主记录标识、属性记录id列表、父目录id列表和大小填入信息结构体对应的字段中;若找到相同的属性记录id,则取出第二映射表中属性记录id对应的主记录id,以主记录id为键,在第一映射表中找到主记录id,将第二映射表中属性记录id对应的大小递归累加到第一映射表中主记录id对应的父目录id列表中各个父目录的大小中,再将第二映射表中属性记录id的大小累加到第一映射表中主记录id对应的大小中,再将第一映射表中主记录id对应的大小递归累加到第二映射表中属性记录id对应的父目录id列表中各个父目录的大小中,最后将第二映射表中属性记录id对应的父目录id列表补充到第一映射表中主记录id对应的父目录id列表中。

优选的,将属性记录id列表中各个属性记录的大小累加到主记录的大小中并将各个属性记录的父目录id列表补充到主记录的父目录id列表中,包括:

判断主记录的属性记录id列表的大小是否为0,

若属性记录id列表的大小不为0,则遍历属性记录id列表中的全部属性记录id,以各个属性记录id为键,在第二映射表中查找是否有相同的属性记录id;若找到相同的属性记录id,则将该属性记录id对应的大小累加到主记录的大小中,然后将该属性记录id对应的父目录id列表补充到主记录的父目录id列表中;若未找到相同的属性记录id,则在第二映射表中添加一个键值对,键为属性记录id,值为主记录id和该属性记录对应的空的信息结构体;

若属性记录id列表的大小为0,则不动作。

优选的,将主记录的大小递归累加到主记录的父目录id列表中各个父目录的大小中,包括:

判断主记录的父目录id列表的大小是否为0,若父目录id列表的大小为0,则不动作,若父目录id列表的大小不为0,则进入下一步,

遍历父目录id列表中的全部父目录id,以各个父目录id为键,在第一映射表中查找是否有相同的父目录id;若未找到相同的父目录id,则在第一映射表中添加一个键值对,键为该父目录id,值为该父目录id对应的空的信息结构体,再设置该父目录id对应的信息结构体的大小为主记录的大小;

若找到相同的父目录id,则将主记录的大小累加到第一映射表中该父目录id对应的大小中,再判断第一映射表中该父目录id对应的父目录id列表大小是否为0,若为0,则流程结束,若不为0,则返回上一步。

优选的,将主记录的大小递归累加到第一映射表中主记录id对应的父目录id列表中各个父目录的大小中,包括:

判断第一映射表中主记录id对应的父目录id列表是否为0,若父目录id列表的大小为0,则不动作,若父目录id列表的大小不为0,则进入下一步,

遍历父目录id列表中的全部父目录id,以各个父目录id为键,在第一映射表中查找是否有相同的父目录id;若未找到相同的父目录id,则在第一映射表中添加一个键值对,键为该父目录id,值为该父目录id对应的空的信息结构体,再设置该父目录id对应的信息结构体的大小为主记录的大小;

若找到相同的父目录id,则将主记录的大小累加到第一映射表中该父目录id对应的大小中,再判断第一映射表中该父目录id对应的父目录id列表大小是否为0,若为0,则流程结束,若不为0,则返回上一步。

优选的,将第二映射表中属性记录id对应的大小递归累加到第一映射表中主记录id对应的父目录id列表中各个父目录的大小中,包括:

判断第一映射表中主记录id对应的父目录id列表的大小是否为0,若父目录id列表的大小为0,则不动作,若父目录id列表的大小不为0,则进入下一步,

遍历父目录id列表中的全部父目录id,以各个父目录id为键,在第一映射表中查找是否有相同的父目录id;若未找到相同的父目录id,则在第一映射表中添加一个键值对,键为该父目录id,值为该父目录id对应的空的信息结构体,再设置该父目录id对应的信息结构体的大小为第二映射表中属性记录id对应的大小;

若找到相同的父目录id,则将第二映射表中属性记录id对应的大小累加到第一映射表中该父目录id对应的大小中,再判断第一映射表中该父目录id对应的父目录id列表大小是否为0,若为0,则流程结束,若不为0,则返回上一步。

优选的,将第一映射表中主记录id对应的大小递归累加到第二映射表中属性记录id对应的父目录id列表中各个父目录的大小中,包括:

判断第二映射表中属性记录id对应的父目录id列表的大小是否为0,若父目录id列表的大小为0,则不动作,若父目录id列表的大小不为0,则进入下一步,

遍历父目录id列表中的全部父目录id,以各个父目录id为键,在第一映射表中查找是否有相同的父目录id;若未找到相同的父目录id,则在第一映射表中添加一个键值对,键为该父目录id,值为该父目录id对应的空的信息结构体,再设置该父目录id对应的信息结构体的大小为第一映射表中主记录id对应的大小;

若找到相同的父目录id,则将第一映射表中主记录id对应的大小累加到第一映射表中该父目录id对应的大小中,再判断第一映射表中该父目录id对应的父目录id列表大小是否为0,若为0,则流程结束,若不为0,则返回上一步。

下面进行具体说明,本申请的实施例中初始化两个映射表,第一映射表提供将主记录id映射到主记录id对应的信息的功能,第二映射表则提供将属性记录id映射到主记录id及该属性记录对应的信息的功能。其中第一映射表:由一系列的键值对组成,键是主记录的id,值是主记录id对应的文件或目录的大小、占用空间等(这些大小不只是主文件记录中的大小,也包含了属性记录中的)。在已知键的情况下,可以快速查找到对应的值。第一映射表的作用是保存文件或目录的相关信息,当一个文件的文件记录出现时,该文件记录中可能并没有包含全部的信息,仍然有部分信息可能存在于属性记录中,此时需要将该文件的信息放入第一映射表,等待后面的属性记录出现后进行合并;而对于目录来说,它有哪些子项是没有提前确定的,所以每出现一个子项都需要将子项的大小更新到这个目录中,更新的方法也是通过查找第一映射表。第二映射表:由一系列的键值对组成,其中的键是属性记录id,值是属性记录id对应的主记录的id,以及这个属性记录id所提供的信息。第二映射表有两种应用场景,其一是属性记录比主记录更先出现,此时将属性记录id和属性记录对应的主记录id以及属性记录对应的信息放入第二映射表,后续主记录会根据它对应的属性记录id,来第二映射表中取走信息;其二是主记录比属性记录更先出现,主记录试图从第二映射表中取走属性记录的信息,但此时还没有属性记录信息,于是将属性记录id和主记录id放入第二映射表,之后属性记录出现时会通过第二映射表找到主记录的id,然后将信息合并到主记录。

其中,属性记录是指:属性记录是本申请约定的一个名词,指的是那些没有含有0x10属性的文件记录,这种文件记录存放着其它某个文件记录存放不下的属性信息,可以认为是那个文件记录的属性记录。主记录是指:主记录是本申请约定的一个名词,指的是含有0x10属性的文件记录,属性记录一定归属于某个主记录。其中id是文件记录的一个字段,在0x28位置。

具体的,1.1主记录处理流程包括:首先判断是否有相应的属性记录,即本结构体中记录属性记录id的数组长度是否为0,如果不为0,先进行一次合并:遍历全部属性记录的id,然后以这个id为键去第二映射表中查找,如果找到了,则处理属性记录时已经将包含属性记录信息的结构体放入了第二映射表,将属性记录结构体中的实际长度、占用大小与本结构体中的对应字段累加,然后将属性记录的父目录数组追加到主记录的父目录数组后,以此便完成了合并。如果第二映射表中没有查找到任何信息,往第二映射表中放入一个键值对,键就是属性记录的id,值由一个结构体和一个id组成,这里的结构体保持为空就行,id填充为主记录的id。合并完成后(或者没有合并操作),判断本结构体对应的文件记录是否是一个目录。

1.1.1如果不是目录:遍历父目录数组(如果存在),然后依次在第一映射表中查找父目录的id。如果没查到,则往第一映射表中放入一个键值对,键为父目录的id,值为一个空的表示文件记录信息的结构体,然后将这个结构体的大小设置为本结构体中的大小。如果查到了,则将父目录的结构体中的大小加上本结构体的大小,然后判断父目录结构体中是否保存了父目录的父目录,如果是,则还需递归处理,将大小累加到父目录的父目录。最后再往第一映射表中放入一个键值对,键为本结构体id,值为本结构体。

1.1.2如果是目录:则在第一映射表中查找本结构体id,如果没查到,则往第一映射表中放入一个键值对,键为本结构体id,值为本结构体。如果查到了,说明已经有子项将大小和占用空间统计到了查到的结构体里面,则将本结构体中的父目录数组填充到查到的结构体里面,然后按照1.1.1的做法,将大小递归累加到父目录(包括新建父目录的键值对等操作)。

具体的,1.2属性记录处理流程:在第二映射表中,以本结构体的id为键,查找值。如果没查到,则往第二映射表中插入一个键值对,键为本结构体的id,值由一个结构体和一个id组成,结构体就是本结构体,id为空就行。如果查到了,则说明主记录曾经查找过此属性记录,此时取出值中的id,这个id就是主记录的id,然后去第一映射表中查找主记录,然后先遍历主记录结构体中已经有的父目录数组,先将本结构体中的大小和占用空间递归累加到父目录中,然后将本结构体中的大小累加到主记录结构体中,再遍历本结构体中有的父目录数组(如果长度不为0),将主记录结构体的大小和占用空间按照1.1.1的做法递归累加到本结构体的父目录中,最后再将本结构体的父目录数组追加到主记录结构体中。

s133判断当前文件记录是否为最后一个文件记录,若否则跳转到下一个文件记录后返回s131,若是则流程结束,得到全部目录和文件的大小。

其中,判断当前文件记录是否是最后一个文件记录的方法包括:当解析mft元文件的0x80属性时会得到文件记录总的大小,将这个文件记录记录总的大小除以每个文件记录的大小就是文件记录总数,将计数值赋值为0,每处理一个文件记录计数值加一,并和总数比较,当计数值小于或者等于文件记录总数时,则返回s131进行文件记录的信息的解析和整理,当计数值大于文件记录总数时,则所有文件记录处理完成,流程结束,得到全部目录和文件的大小。

最后,第一映射表中有所有目录和文件的大小,输入目录或文件的文件记录id就可以在第一映射表中查找到对应的结构体,在结构体中即获得大小(实际大小或占用空间),本申请不限制获得目录或文件的文件记录id的方法,本领域技术人员可以根据需求设计,例如根目录的文件记录id为5,解析根目录的0xa0属性,即可获得根目录下所有的子目录的文件记录id,就确定了根目录下有哪些文件和目录,然后再去解析其中的目录的0xa0属性又可以继续往下展开,直到找到目标目录或文件,根据文件或目录的文件记录id,在第一映射表中查询其对应的大小。

本申请提供的技术方案是最大限度利用文件系统的特性来实现扫描,这样的缺点是软件程序实现稍复杂,优点是拥有远超使用系统接口来扫描的性能。以ntfs文件系统为例,只需要遍历一遍$mft这个元文件即可得到所有的目录和文件的大小,包括实际大小与占用空间,且$mft在磁盘上的分布通常比较集中,因此可以一次性读取大量数据,最大限度地减少io瓶颈。

下面对本申请提供的一种ntfs文件系统中目录和文件大小的统计装置进行介绍,下面描述的ntfs文件系统中目录和文件大小的统计装置与上文描述的ntfs文件系统中目录和文件大小的统计方法可相互对应参照,参考图3,图3为本申请实施例提供的一种ntfs文件系统中目录和文件大小的统计装置的结构示意图,包括:

mft元文件信息定位模块21,用于获取mft元文件的起始位置和自身文件记录大小;

mft元文件信息收集模块22,用于根据mft元文件的起始位置和自身文件记录大小读取并解析mft元文件的自身文件记录,得到mft元文件的全部datarun集合;

mft元文件信息解析模块23,用于根据mft元文件的全部datarun集合,依次解析并整理mft元文件中各个文件记录提供的信息,得到全部目录和文件的大小。

可选的,mft元文件信息收集模块22包括:

datarun集合获取单元,用于跳转到所述mft元文件的起始位置,根据所述mft元文件的自身文件记录大小读取mft元文件的自身文件记录中的全部属性并解析,当解析出0x80属性时,得到第一datarun集合,若解析出0x20属性,则解析出0x20属性中是否有0x80属性,若没有0x80属性,则第二datarun集合为空,若有0x80属性,则得到第二datarun集合,若未解析出0x20属性,则第二datarun集合为空;

datarun集合合并单元,用于将第一datarun集合和第二datarun集合合并得到全部datarun集合。

可选的,mft元文件信息解析模块23包括:

属性信息解析单元,用于解析当前文件记录的全部属性,得到与预设属性相同的属性提供的属性信息;

属性信息整理单元,用于根据得到的属性信息寻找文件或目录的父目录并将大小递归累加到其父目录中;

文件记录判断单元,用于判断当前文件记录是否为最后一个文件记录,若否则跳转到下一个文件记录后返回属性信息解析单元,若是则流程结束,得到全部目录和文件的大小。

由于ntfs文件系统中目录和文件大小的统计装置部分的实施例与ntfs文件系统中目录和文件大小的统计方法部分的实施例相互对应,因此ntfs文件系统中目录和文件大小的统计装置部分的实施例请参见ntfs文件系统中目录和文件大小的统计方法部分的实施例的描述,这里暂不赘述。

下面对本申请实施例提供的一种电子设备进行介绍,下文描述的电子设备与上文描述的ntfs文件系统中目录和文件大小的统计方法可相互对应参照。

本申请还提供一种电子设备,包括:

存储器,用于存储计算机程序;

处理器,用于执行计算机程序以实现如上述ntfs文件系统中目录和文件大小的统计方法的步骤。

由于电子设备部分的实施例与ntfs文件系统中目录和文件大小的统计方法的实施例相互对应,因此电子设备部分的实施例请参见ntfs文件系统中目录和文件大小的统计方法部分的实施例的描述,这里暂不赘述。

下面对本申请实施例提供的一种可读存储介质进行介绍,下面描述的可读存储介质与上文描述的ntfs文件系统中目录和文件大小的统计方法可相互对应参照。

本申请提供一种可读存储介质,可读存储介质存储有计算机程序,计算机程序被处理器执行时实现如上述ntfs文件系统中目录和文件大小的统计方法的步骤。

由于可读存储介质部分的实施例与ntfs文件系统中目录和文件大小的统计方法部分的实施例相互对应,因此可读存储介质部分的实施例请参见ntfs文件系统中目录和文件大小的统计方法部分的实施例的描述,这里暂不赘述。

以上对本发明实施例所提供的一种ntfs文件系统中目录和文件大小的统计方法、统计装置、电子设备和可读存储介质进行了详细介绍。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1