如何正确得到FAT文件系统剩余容量

对于win32系统,可以调用api函数GetDiskFreeSpace得到磁盘的总容量和剩余容量,但在嵌入式设备里面,就需要分析FAT表信息然后计算取得了。

  众所周知,FAT有三个版本FAT12、FAT16和FAT32,通过计算FAT表中的空闲簇数,就可以计算出磁盘的剩余容量了。对于FAT12,在FAT表中每簇使用12bit来表示,相应地,FAT16和FAT32则使用16位和32位来表示一个簇。

  文件系统类型的判断

  首先,我们要得到磁盘的BPB。一般来说,BPB位于磁盘的第0,32或63扇区,于是我们可以很简单地分别读取这三个扇区的内容,判断哪一个才是正确的BPB。
  找出BPB后,就可以通过BPB来判断文件系统的类型。因为三种文件系统的空间算法各不相同,所以正确地判断文件系统类型很重要。在进行磁盘格式化的时候,如果计算出磁盘的可用簇数小于0xFF5(也就是12位可以表示),就格式化成FAT12,如果可用簇数大于0xFFF5(即16位表示不下),就应为FAT32,否则就是FAT16。如FAT32白皮书所述: This is the one and only way that FAT type is determined。这是微软的推荐做法。但事实上,很多格式化工具并不遵循这个规则。所以使用可用簇数来判断文件系统类型的方法并不可靠。
  实际上,如果BPB中的BPB_FATSz16为0,则表示此文件系统一定是FAT32,然后再依据可用簇数来判断是FAT12或FAT16 。如下:
    if(bpb->BPB_FATSz16)
    {    //fat12 or fat16
        if (m_max_clust >= 0xFF5)
        {
            get_fat16_freesector();        //fat16
        }
        else
        {
            get_fat12_freesector();        //fat12
        }
    }
    else
    {
        get_fat32_freesector();            //fat32
    }

  
  可用簇的计算

  上文提到了可用簇,所谓可用簇是指文件系统中真正能用来存放数据的簇。也就是要除掉MBR、BPB、保留扇区、FAT和FDT这些空间。如果确定了BPB的位置,可以直接得到保留扇区的大小,但FAT表大小和FDT表大小需要通过计算。
  FAT偏移由BPB偏移加上保留扇区数得到。FAT大小由FAT份数乘以每份FAT的大小得到。FDT紧接在最后一个FAT表之后,其大小由根目录项数*32/512得到。
  把总的扇区数减去系统所占的扇区数,就可以得到可用的扇区数。但FAT是以簇而非以扇区为最小单位的,所以把总扇区数除以每簇扇区数,就能得到可用的簇数了。其实这个值并非一定能除得尽,剩余不足一个簇的扇区实际上白白被浪费掉了

    //得到文件系统总扇区数
    if(bpb->BPB_FATSz16 && bpb->BPB_TotSec16)
        m_total_sector = bpb->BPB_TotSec16;        //fat16/12
    else
        m_total_sector = bpb->BPB_TotSec32;        //fat32
    //得到FDT所占的扇区数
    m_num_fdt_sector = (bpb->BPB_RootEntCnt * 32)/512;
    //得到fat1偏移
    m_fat_offset = m_bpb_offset + bpb->BPB_RsvdSecCnt;            //fat1=bpb+保留扇区数
    //得到FDT表所在的偏移
    if(bpb->BPB_FATSz16)
    {
        m_fdt_offset = m_fat_offset +
            bpb->BPB_NumFATs * bpb->BPB_FATSz16;                //fat16/12
    }
    else
    {
        m_fdt_offset = m_fat_offset +
            bpb->BPB_NumFATs * bpb->FATBS.FAT32BS.BPB_FATSz32;    //fat32
    }
    //文件系统占的数据大小=目录区偏移-BPB偏移+目录区大小
    systemSector = (m_fdt_offset - m_bpb_offset) + m_num_fdt_sector;
    //有效的扇区数->有效的簇数
    m_max_clust = ((m_total_sector - systemSector)/bpb->BPB_SecPerClus);



  分析FAT表得到剩余容量

  可用簇数乘以簇大小,就是磁盘的总容量。分析FAT,把未用的簇统计出来,就是磁盘的剩余空间。
  FAT表的前两项是系统占用的,所以我们要从第三个项开始统计,循环读入FAT表,直到算完所有的簇,该项为零表示簇空闲。值得注意的是FAT12,由于其一位只用12位来表示,所以奇偶簇的判断方法是不一样的。

  FAT32的加速

  FAT32的磁盘容量通常很大,所以FAT表很大,如果每次计算总容量都从头扫描一次FAT表,显示是很慢。考虑到这一点,FAT32还新增加了一个FSInfo扇区,保存着当前磁盘剩余簇数和下一个空闲簇地址。从BPB中可以知道FSInfo的位置,读取FSInfo扇区,如果FSInfo.FSI_Free_Count有效(不等于0xFFFFFFFF),则此值为当前磁盘的剩余容量。windows每次改变磁盘大小后,都会去更新这个值。如果此值不正确,那就得重新分析FAT表了。
    disk_read_sector(bpb->FATBS.FAT32BS.BPB_FSInfo , 1, buffer);
    info = (TFSInfo*)buffer;
    if(info->FSI_LeadSig == 0x41615252 && info->FSI_TrailSig==0xAA550000)
    {
        if(info->FSI_Free_Count != -1)
        {
            m_disk_free_space = info->FSI_Free_Count;
        }
    }


  如果有错误,请告之,MSN:szskyler@msn.com
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FAT文件系统和NTFS文件系统Windows操作系统中常用的两种文件系统,它们有以下几个区别: 1. 文件系统结构不同:FAT文件系统采用的是FAT表的方式来管理磁盘空间,而NTFS文件系统采用的是一种称为“Master File Table”(MFT)的数据结构来管理磁盘空间。 2. 支持的最大磁盘容量不同:FAT文件系统最大支持的磁盘容量为2TB,而NTFS文件系统最大支持的磁盘容量为16EB(1EB等于1024PB)。 3. 安全性不同:NTFS文件系统支持文件加密和权限控制,可以设置对文件和文件夹的访问权限,以保护文件的安全性,而FAT文件系统没有这些安全控制功能。 4. 兼容性不同:FAT文件系统具有很好的兼容性,可以在不同的操作系统平台之间共享文件,而NTFS文件系统只能在Windows平台上使用,与其他操作系统之间的兼容性不是很好。 5. 文件存储方式不同:NTFS文件系统采用一种称为“文件属性列表”(FAT)的机制来存储文件的属性信息,而FAT文件系统则将文件的属性信息存储在文件的目录项中。 总体来说,NTFS文件系统FAT文件系统更安全、更稳定,支持更大的磁盘容量和更多的文件属性,但是兼容性较差。FAT文件系统则兼容性更好,但是安全性和稳定性相对较弱。 ### 回答2: FAT 文件系统和 NTFS 文件系统是常见的在 Windows 操作系统中使用的文件系统类型。它们有以下几个主要区别: 1. 功能和支持:FAT 文件系统是早期的文件系统,提供的功能有限。它主要用于低容量存储设备(如闪存驱动器),不能实现高级功能,如文件加密、磁盘配额、文件压缩、文件系统日志等。而 NTFS 是更先进和全面的文件系统,提供了更多的功能和支持。它可以实现文件和文件夹级别的安全性控制、数据压缩、磁盘配额控制、容错能力、更好的性能等。 2. 文件大小和文件名支持:FAT 文件系统有文件大小限制,最大只能支持 4GB 的单个文件。而 NTFS 文件系统支持更大的文件大小,允许存储几 TB 或更多的单个文件。此外,FAT 文件系统对于文件名的支持也有限,像只能使用 8 个字符为主文件名和 3 个字符为扩展名。而 NTFS 文件系统支持长文件名(高达 255 个字符)和更多的特殊字符。 3. 安全性和可靠性:NTFS 文件系统FAT 文件系统更安全可靠。NTFS 支持访问控制列表(ACL),可以实现对文件和文件夹的权限控制;而 FAT 文件系统没有这个功能。NTFS 文件系统还具有容错能力,可以通过文件系统日志来修复文件系统错误。 4. 兼容性:FAT 文件系统在各种操作系统和设备上都具有很好的兼容性,但 NTFS 文件系统主要用于 Windows 系统,对于其他操作系统的兼容性较差。 ### 回答3: FAT(File Allocation Table)文件系统和NTFS(New Technology File System)文件系统Windows操作系统中常用的两种文件系统。它们之间存在着以下几点区别。 首先,FAT文件系统是早期Windows系统使用的文件系统,而NTFS文件系统Windows NT系列操作系统引入的新一代文件系统。NTFS相比FAT具有更强大的功能和可靠性。 其次,FAT文件系统对文件和文件夹的命名有一定限制,文件名最长只能是8个字符加上3个字符的扩展名,而NTFS文件系统支持更长的文件名,最长可达到255个字符。 第三,FAT文件系统不支持文件和文件夹的权限控制,任何用户都可以对文件进行修改或删除。而NTFS文件系统支持将权限分配给特定的用户或用户组,可以精细地控制对文件的访问权限。 第四,NTFS文件系统支持文件压缩和加密功能,可以减小磁盘占用空间和保护敏感数据的安全性。而FAT文件系统不支持这些功能。 第五,NTFS文件系统具有更强大的容错和恢复能力。当系统异常关机或发生文件损坏时,NTFS可以通过日志记录来修复文件系统,确保数据的完整性。而FAT文件系统则更容易导致数据丢失。 综上所述,FAT文件系统和NTFS文件系统在文件名限制、权限控制、压缩加密、容错恢复等方面存在着显著的区别。NTFS文件系统相对于FAT文件系统更先进、更稳定、更安全,因此在现代的Windows操作系统中广泛使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值