3

今天早上我丢失了一堆文件,但由于它们所在的卷在内部和外部都进行了碎片整理,因此可以获得 100% 恢复所需的所有信息;我只需要在需要的地方填写 FAT。

我编写了一个程序来执行此操作,并在我转储到文件中的 FAT 副本上对其进行了测试,它运行良好,除了一些文件(526 个文件中的 17 个),FAT 链是一个单独的簇太长,并因此与下一个文件交叉链接。

幸运的是,我确切地知道问题出在哪里。我ceil在我的 EOF 计算中使用了,因为即使是一个字节,也需要一个额外的集群:

//Cluster    is the starting cluster of the file
//Size       is the size (in bytes) of the file
//BPC        is the number of bytes per cluster
//NumClust   is the number of clusters in the file
//EOF        is the last cluster of the file’s FAT chain

DWORD NumClust = ceil( (float)(Size / BPC) )
DWORD EOF      = Cluster + NumClust;

该算法适用于所有文件,除了大小恰好是集群大小的倍数的文件,在这种情况下,它们最终成为一个集群太多了。

我想了一会儿,但不知如何做到这一点。看起来它应该很简单,但不知何故却出奇地棘手。

什么公式适用于任何大小的文件?

4

3 回答 3

7

如果你想要集群的数量,它会是(size + BPC - 1) / BPC所有整数数据类型。

于 2012-10-28T17:01:44.050 回答
1

也许ceil( (float)((Size - 1) / BPC) )

如果一切都是整数类型,那就更好了((Size - 1) / BPC) + 1

于 2012-10-28T17:00:03.617 回答
0

ceil( (float)(Size / BPC) )进行整数除法,然后将其转换为浮点数。

你需要ceil( (float)Size / BPC )正确地做到这一点。但是首先在这里使用浮点数似乎是一个坏主意......请参阅整数解决方案的其他答案。

于 2012-10-28T17:02:09.613 回答