在C中读取,写入和操作FAT32

时间:2011-12-10 22:07:19

标签: c fat32

我正在尝试用C语言编写一个允许我浏览FAT32文件系统映像的程序。但是,我很难理解和应用方程式来收集正确的数据。我正在使用linux的debian发行版,因此维护了little-endian形式。下面是Microsoft网站上关于FAT32的伪代码,计算下一个要访问目录或文件的集群:

    ThisFATSecNum = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec);
    ThisFATEntOffset = REM(FATOffset / BPB_BytsPerSec);

    FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) =
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) = 
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal;

我不完全了解SecBuff字符数组正在做什么或者它正在访问什么。 DWORD应该是一个unsigned int,我不确定我是否理解后续的转换。任何灯棚都非常受欢迎。

如果有人也可以解释我们应该如何通过基于集群的FAT32文件系统进行解释,我们将非常感激,在我看来,即使集群分配确保空间局部性,通过引用扇区也会更有效。我不完全了解如何进行字节读取以查找文件/文件夹的下一个群集。

1 个答案:

答案 0 :(得分:7)

该伪代码用于从/向文件分配表读取和写入簇号。该文档说它恰好在两段伪代码之间。这是唯一的可能性,除非你对FAT12 / 16/32的工作方式一无所知。

------ 8< ------

假设将其读入名为SecBuff的8位字节数组中。还假设类型WORD是16位无符号,并且DWORD类型是32位无符号。

If(FATType == FAT16)
    FAT16ClusEntryVal = *((WORD *) &SecBuff[ThisFATEntOffset]);
Else
    FAT32ClusEntryVal = (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0x0FFFFFFF;

获取该群集的内容。要设置此同一群集的内容,请执行以下操作:

If(FATType == FAT16)
    *((WORD *) &SecBuff[ThisFATEntOffset]) = FAT16ClusEntryVal;
Else {
     FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) =
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000;
    *((DWORD *) &SecBuff[ThisFATEntOffset]) = 
        (*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal;
}

------ 8< ------

上述伪代码操作的单元格中的这些簇编号为:

enter image description here

他们说下一个文件部分(如果有的话)在哪个集群中。每个文件或目录都是一个集群链。

SecBuff是一个包含文件分配表的512字节长扇区的数组。 *((DWORD *)强制转换是为了避免在单独的8位片段中读取/写入32位值。