当前位置:  开发笔记 > 运维 > 正文

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

如何解决《在C中读取,写入和操作FAT32》经验,为你挑选了1个好方法。

我试图在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> Alexey Frunz..:

该伪代码用于从/向文件分配表读取和写入簇号.该文档说它恰好在两段伪代码之间.这是唯一的可能性,除非你对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 <------

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

在此输入图像描述

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

SecBuff是一个包含文件分配表的512字节长扇区的数组.所述*((DWORD *)铸件在那里,以避免读出/在单独的8位段写入32位值.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有