一种LinuxFAT文件系统修复方法及装置的制作方法

文档序号:6430902阅读:261来源:国知局
专利名称:一种Linux FAT文件系统修复方法及装置的制作方法
技术领域
本发明涉及计算机领域,特别是涉及一种Linux FAT文件系统修复方法以及相应的装置。
背景技术
文件配置表(FAT,File Allocation Table)文件系统,是一种由微软发明并拥有部分专利的文件系统,供MS-DOS使用;FAT文件系统考虑当时计算机效能有限,所以未被复杂化,因而被几乎所有个人计算机的操作系统支持,此特性使其成为理想的软盘和记忆卡文件系统,也适合用作不同操作系统中的数据交流。目前,在嵌入式系统中,依赖于外接存储设备的应用越来越多,FAT文件系统以其简单、高效等优点,在Linux嵌入式应用中占据较多的应用。FAT文件系统包括FAT表,FAT表记录着硬盘数据的存储地址,每一个文件都有一组FAT链指定其存放的一个或者多个簇的簇地址。在磁盘上的每一个可用的簇在FAT表中就只有一个登记项,通过在对应簇号的登记项内填入“表项值”来表明数据区中的该簇是否占用、空闲或是已损坏的。在对Linux FAT文件系统的读写中,如果由于意外断电或者用户非法拔盘等操作, 导致FAT文件系统损坏,现有技术没有做相应的文件修复,对这些损坏的文件,如果后续再对其操作可能会造成无法读取损坏的文件甚至可能会造成整个系统崩溃的严重后果。在现有技术中,可以通过修复工具进行完全修复,但这种修复方法耗时太长,不适用于嵌入式系统。因此,亟待提供一种在Linux系统中快速修复FAT文件的方法,以使损失降到最低,并且避免可能导致的系统崩溃。

发明内容
本发明主要解决的技术问题是提供一种Linux FAT文件系统修复方法以及装置, 能够通过自动修复因意外断电或者非法拔盘等造成的FAT文件系统损坏,使用户感觉不到由此带来的不便与困扰,提高了用户体验。一种Linux FAT文件系统修复方法,包括获取文件对应的FAT链;依次检查获取的FAT链中的登记项是否有效;如果检查出登记项无效,则将该登记项改为有效。一种Linux FAT文件系统修复装置,包括第一获取模块,用于获取文件对应的FAT链;检查模块,用于依次检查第一获取模块获取的FAT链中的登记项是否有效;第一更改模块,当检查模块检查出登记项无效,用于将该登记项改为有效。本发明的有益效果是区别于现有技术的情况,本发明通过检查FAT表的有效性,当无效时,将其更改为有效,使得后续对文件的读写都可以正常进行;通过自动修复因意外断电或者非法拔盘等造成的FAT文件系统损坏,使用户感觉不到由此带来的不便与困扰, 提高了用户体验。


图1是本发明实施例Linux FAT文件系统修复方法的数据流程图;图2是本发明实施例FAT链出错情况的示意图;图3是本发明实施例图2中的FAT链修复后的示意图;图4是本发明实施例FAT链另一出错情况的示意图;图5是本发明实施例图4中的FAT链修复后的示意图;图6是本发明实施例FAT链另一出错情况的示意图;图7是本发明实施例图6中的FAT链修复后的示意图;图8是本发明实施例图4中的FAT链修复方法的数据流程示意图;图9是本发明实施例Linux FAT文件系统修复装置的逻辑结构示意图;图10是本发明实施例Linux FAT文件系统修复装置的另一逻辑结构示意图。
具体实施例方式参阅图1所示,图1为本发明一实施例Linux FAT文件系统修复方法的数据流程图,包括101、获取文件对应的FAT链;FAT文件系统包括FAT表,FAT表记录着硬盘数据的存储地址,每一个文件都有一组FAT链指定其存放的一个或者多个簇的簇地址;在取得文件后,首先获取该文件在FAT表中对应的FAT链。102、从FAT链的目录项中获取第一个簇的簇号;在获取文件对应的FAT链后,从FAT链的目录项中获取第一个簇的簇号。103、根据簇号获取对应的簇的登记项;每个簇有唯一对应的簇号,且每个簇有一个唯一登记项,用于记载该簇是否占用、 空闲或是已损坏的;获取到簇号,就能根据该簇号获取对应的簇的登记项。104、判断登记项是否为已使用状态;登记项用于记载该簇是否已占用、空闲或是已损坏的;在根据簇号获取对应的簇的登记项后,根据该登记项的数据判断登记项是否为已使用状态,如果登记项记录的是一个簇号,即下一个簇的簇号,则判断该登记项为已使用状态,是有效的,如果登记项记录的是空闲状态,例如FREE(O),则说明本簇的簇号已经写入到FAT链的目录项中,而该簇对应的登记项却仍然未更新,则判断该登记项无效。105、将登记项改为结束标识;如果步骤104中判断出登记项是空闲状态,例如为FREE(O),则将登记项改为结束标识并结束流程,例如为EOF(OxOFFFFFFF);例如,请参阅图2、图3,具体而言如图2所示,从FAT链的目录项中获取第一个簇的簇号为218,根据簇号218查找对应的簇的登记项,该登记项显示为FREE(O),为空闲状态,说明文件或者文件夹已经分配第一个簇,并且该簇的簇号已经写入到目录项中,而与该簇对应的FAT表中的登记项却仍然未更新,仍然标识为空闲状态,这种情况会导致读取文件或者文件夹时,读不到数据, 导致出错甚至系统崩溃;所以对于这种情况,可以将FAT表中与该簇对应的登记项设置为 EOF(OxOFFFFFFF),即设置为结束标识,如图3所示;虽然该操作会丢失一部分数据,但是读文件时不至于会出错或者出现导致系统崩溃的错误。106、判断登记项的簇号是否等于本FAT文件系统所能表示的最大长度;如果步骤104中判断出登记项是已使用状态,则获取登记项的簇号以及本FAT文件系统所能表示的最大长度,并判断登记项的簇号是否等于本FAT文件系统所能表示的最大长度。簇号包括逻辑簇号和虚拟簇号,相互一一对应,逻辑簇号是对整个卷中所有的簇从头到尾所进行的简单编号,虚拟簇号则是对属于特定文件的簇从头到尾进行编号,因为每个簇的大小一定,所以根据虚拟簇号就能清楚地知道到从第一个簇开始到本簇为止,该文件的大小,因为逻辑簇号和虚拟簇号一一对应,所以知道逻辑簇号也能清楚地知道特定文件的大小。107、将登记项改为结束标识;如果步骤106中判断出登记项的虚拟簇号等于本FAT文件系统所能表示的最大长度,则将该登记项改为结束标识并结束流程;例如,请参阅图4、图5,具体的以FAT32为例,最大能存放4G的文件,对应最大的虚拟簇号为0x100000 ;在图4 中,目录项中第一个簇的逻辑簇号为218,逻辑簇号218对应的虚拟簇号为Oxl ;簇218中的登记项中记录的下一个簇的逻辑簇号为1000,逻辑簇号1000对应的虚拟簇号为0x2 ;如此一个簇接一个簇,形成FAT链;簇m对应的虚拟簇号为0x100000,已经是FAT32的最大文件存储长度,但是簇m的登记项中显示本簇并不是文件的最后一个簇,还有下一个簇η ;FAT 链中显示的文件长度大于4G,但是实际数据区存不下超过4G部分的数据,文件在读取的时候,会因为找不到数据而读取失败,导致由于检测到异常、损坏而被设置为只读,或者导致系统崩溃;所以对于这种情况,可以将末尾簇的登记项设置为EOF(OxOFFFFFFF),即设置为结束标识,末尾簇为FAT链中登记项中下一个簇的虚拟簇号等于FAT文件系统所能表示的最大长度的簇,如图5所示;虽然该操作会丢失一部分数据,与完备的、无任何数据损失的修复相比有一定差距,但是由于这种完全无数据损失的修复需要对整个FAT表和所有目录项进行扫描、分析,耗时较长,特别是当FAT分区的容量增长时,所耗的时间呈几何增长,并且又考虑到耗时长的修复不适合实时要求比较高的嵌入式领域,所以本实施例提供的修复方法是简单有效的;增强了 FAT文件系统的稳定性,提高了用户体验。108、判断是否已经到FAT链结尾;判断是否已经检查到本文件FAT链的结尾,如果已经到FAT链的结尾,即登记项中的记录为EOF(OxOFFFFFFF),则检测结束;如果还没有到FAT链的结尾,则执行步骤109。109、获取下一个簇的簇号;如果步骤108中判断出还未到文件结尾,则获取下一个簇的簇号,直至FAT链的结尾;请参阅图6、图7,具体的如果FAT链在中间断开,如图6所示,从FAT链的目录项中获取第一个簇的簇号为218,簇218的登记项中记录了下一个簇的簇号为1000,通过簇号1000找到簇1000,簇1000的登记项中记录了下一个簇的簇号为800,簇800的登记项记录的不是结束标识 EOF (OxOFFFFFFF),说明该FAT链还没有结束,但是簇800的登记项显示FREE (0),即是空闲的,在还没有检查到结束标识EOF(OxOFFFFFFF)之前,FAT链中出现FREE (0)的登记项,说明该FAT链在中间断开了 ;这种情况会导致读取文件或者文件夹时,读不到数据,导致出错甚至系统崩溃;所以对于这种情况,可以将出错的登记项设置为EOF (OxOFFFFFFF),即设置为结束标识,如图7所示;虽然该操作会丢失一部分数据,但是读文件时不至于会出错或者出现导致系统崩溃的错误。请参阅图8,在另一实施例中,对于FAT链的长度超过FAT文件系统所能表示的最大长度的情况,还可以这么解决,具体的801、获取FAT链的长度和本FAT文件系统所能表示的最大长度。802、判断FAT链的长度是否大于本FAT文件系统所能表示的最大长度,如果FAT 链的长度小于本FAT文件系统所能表示的最大长度,则结束流程,如果FAT链的长度大于本 FAT文件系统所能表示的最大长度,则执行步骤803。803、查找末尾簇;从FAT链的第一个簇开始,依次查找末尾簇,末尾簇是登记项中记录的下一个簇的簇号等于本FAT文件系统所能表示的最大长度的簇。804、将簇的登记项改为结束标识;在步骤803中从FAT链中查找到末尾簇后,将该末尾簇的登记项改为结束标识并结束流程。虽然本实施例中的操作会丢失一部分数据,与完备的、无任何数据损失的修复相比有一定差距,但是由于这种完全无数据损失的修复需要对整个FAT表和所有目录项进行扫描、分析,耗时较长,特别是当FAT分区的容量增长时,所耗的时间呈几何增长,并且又考虑到耗时长的修复不适合实时要求比较高的嵌入式领域,所以本实施例提供的修复方法是简单有效的;增强了 FAT文件系统的稳定性,提高了用户体验。请参阅图9,本发明Linux FAT文件系统修复装置的实施例包括第一获取模块901,用于获取文件对应的FAT链;检查模块902,用于依次检查第一获取模块901获取的FAT链中的登记项是否有效;第一更改模块903,用于当检查模块902检查出登记项无效时,将所述登记项改为有效。其中,检查模块902包括第一获取单元,用于从获取模块901获取的FAT链的目录项中获取第一个簇的簇号;第二获取单元,用于根据第一获取单元获取的簇号获取对应的簇的登记项;第一判断单元,用于判断第二获取单元获取的登记项是否为已使用状态,如果是下一个簇的簇号则该登记项有效,如果该登记项显示为空闲状态,即为FREE (0),则判断该登记项无效。进一步的,本实施例中的Linux FAT文件系统修复装置还包括第二获取模块904,用于当第一判断单元判断出登记项是已使用状态时,获取下一个簇的簇号。请参阅图10,进一步的,本实施例中Linux FAT文件系统修复装置还包括第二判断模块905,用于当第一判断单元判断出登记项是已使用状态时,再判断该登记项的簇号是否等于本FAT文件系统所能表示的最大长度;第二更改模块906,用于当所述第二判断模块判断出所述登记项的簇号等于本 FAT文件系统所能表示的最大长度时,将所述登记项改为结束标识;第三获取模块907,用于当第二判断模块905判断出登记项的簇号小于本FAT文件系统所能表示的最大长度时,获取下一个簇的簇号。在另一实施例中,本实施例中Linux FAT文件系统修复装置还包括第三更改模块,用于当FAT链的长度大于本FAT文件系统所能表示的最大长度时, 将末尾簇的登记项改为结束标识,该末尾簇是登记项为该FAT文件系统所能表示的最大长度的簇;其中,第三更改模块包括获取单元,用于获取FAT链的长度和本FAT文件系统所能表示的最大长度;判断单元,用于判断获取单元获取的FAT链的长度是否大于本FAT文件系统所能表示的最大长度;更改单元,用于当判断单元判断出FAT链的长度大于本FAT文件系统所能表示的最大长度时,查找末尾簇,该末尾簇是登记项中记录的下一个簇的簇号等于该FAT文件系统所能表示的最大长度的簇,并将该末尾簇的登记项改为结束标识。在本实施例中,通过检查FAT表的有效性,当无效时,将其更改为有效,使得后续对文件的读写都可以正常进行;通过自动修复因意外断电或者非法拔盘等造成的FAT文件系统损坏,使用户感觉不到由此带来的不便与困扰,提高了用户体验度。以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
权利要求
1.一种Linux FAT文件系统修复方法,其特征在于,包括获取文件对应的FAT链;依次检查所述FAT链中的登记项是否有效;以及如果检查出所述登记项无效,则将所述登记项改为有效。
2.根据权利要求1所述的方法,其特征在于,所述依次检查所述FAT链中的登记项是否有效的步骤包括从所述FAT链的目录项中获取第一个簇的簇号;根据所述簇号获取对应的簇的登记项;判断所述登记项是否为已使用状态,如果为下一个簇的簇号则所述登记项有效,如果所述登记项显示为空闲,则判断所述登记项无效。
3.根据权利要求2所述的方法,其特征在于,所述判断登记项是否为已使用状态,如果为下一个簇的簇号则所述登记项有效,如果所述登记项显示为空闲,则判断所述登记项无效的步骤之后还包括如果判断出所述登记项为已使用状态,则获取下一个簇的簇号,直至所述FAT链的结尾。
4.根据权利要求3所述的方法,其特征在于,所述如果检查出所述登记项无效,则将所述登记项改为有效的步骤包括如果判断出所述登记项是空闲状态,则将所述登记项改为结束标识。
5.根据权利要求4所述的方法,其特征在于,所述判断所述登记项是否为已使用状态, 如果是下一个簇的簇号则所述登记项有效,如果所述登记项显示为是空闲,则判断所述登记项无效的步骤之后还包括如果判断出所述登记项为已使用状态,则再判断所述登记项的簇号是否等于本FAT文件系统所能表示的最大长度;如果所述登记项的簇号等于本FAT文件系统所能表示的最大长度,则将所述登记项改为结束标识;如果所述登记项的簇号小于本FAT文件系统所能表示的最大长度,则获取下一个簇的簇号,直至所述FAT链的结尾。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括如果所述FAT链的长度大于本FAT文件系统所能表示的最大长度,则将末尾簇的登记项改为结束标识,该末尾簇是登记项为所述FAT文件系统所能表示的最大长度的簇的登记项。
7.根据权利要求6所述的方法,其特征在于,所述如果所述FAT链的长度大于本FAT文件系统所能表示的最大长度,则将末尾簇的登记项改为结束标识的步骤包括获取FAT链的长度和本FAT文件系统所能表示的最大长度;判断所述FAT链的长度是否大于本FAT文件系统所能表示的最大长度;如果所述FAT链的长度大于本FAT文件系统所能表示的最大长度,则查找末尾簇,所述末尾簇是登记项中记录的下一个簇的簇号等于所述FAT文件系统所能表示的最大长度的簇,并将所述末尾簇的登记项改为结束标识。
8.一种Linux FAT文件系统修复装置,其特征在于,包括第一获取模块,用于获取文件对应的FAT链;检查模块,用于依次检查所述FAT链中的登记项是否有效;以及第一更改模块,用于当检查出所述登记项无效时,将所述登记项改为有效。
9.根据权利要求8所述的装置,其特征在于,所述检查模块包括第一获取单元,用于从所述获取模块获取的FAT链的目录项中获取第一个簇的簇号; 第二获取单元,用于根据所述第一获取单元获取的簇号获取对应的簇的登记项; 第一判断单元,用于判断所述第二获取单元获取的登记项是否为已使用状态,如果是下一个簇的簇号则所述登记项有效,如果所述登记项显示为空闲,则判断所述登记项无效。
10.根据权利要求9所述的装置,其特征在于,所述装置还包括第二获取模块,用于当第一判断单元判断出所述登记项是已使用状态时,获取下一个簇的簇号。
11.根据权利要求10所述的装置,其特征在于,所述装置还包括第二判断模块,用于当第一判断单元判断出所述登记项是已使用状态时,再判断所述登记项的簇号是否等于本FAT文件系统所能表示的最大长度;第二更改模块,用于当所述第二判断模块判断出所述登记项的簇号等于本FAT文件系统所能表示的最大长度时,将所述登记项改为结束标识;第三获取模块,用于当所述第二判断模块判断出所述登记项的簇号小于本FAT文件系统所能表示的最大长度时,获取下一个簇的簇号。
12.根据权利要求8所述的装置,其特征在于,所述装置还包括第三更改模块,用于当所述FAT链的长度大于本FAT文件系统所能表示的最大长度时, 将末尾簇的登记项改为结束标识,该末尾簇是登记项为所述FAT文件系统所能表示的最大长度的簇。
13.根据权利要求12所述的装置,其特征在于,所述第三更改模块包括 获取单元,用于获取FAT链的长度和本FAT文件系统所能表示的最大长度;判断单元,用于判断所述FAT链的长度是否大于本FAT文件系统所能表示的最大长度;更改单元,用于当所述FAT链的长度大于本FAT文件系统所能表示的最大长度时,查找末尾簇,所述末尾簇为登记项中记录的下一个簇的簇号等于所述FAT文件系统所能表示的最大长度的簇,并将所述末尾簇的登记项改为结束标识。
全文摘要
本发明实施例公开了一种Linux FAT文件系统修复方法,本发明实施例还提供相应的装置。本方法通过获取文件对应的FAT链;依次检查FAT链中的登记项是否有效;如果检查出有无效的登记项,则将该登记项改为有效;通过上述方式,本发明能够在Linux系统中快速修复FAT文件,以使损失降到最低,并且避免可能导致的系统崩溃。
文档编号G06F17/30GK102314490SQ20111023488
公开日2012年1月11日 申请日期2011年8月16日 优先权日2011年8月16日
发明者余德军, 孙明勇 申请人:晨星半导体股份有限公司, 晨星软件研发(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1