今天早上我丢失了一堆文件,但因为它们的内容和外部碎片整理,所以100%恢复所需的所有信息都可用;我只需要在必要时填写FAT。
我编写了一个程序来执行此操作并在我转储到文件的FAT副本上对其进行测试,除了少数文件(526中的17个)之外,它的工作正常,FAT链是一个集群太长,因此与下一个文件交叉链接。
幸运的是,我确切地知道问题所在。我在EOF计算中使用ceil
,因为即使单个字节结束也需要一个额外的集群:
//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;
此算法适用于除大小恰好是群集大小的倍数的文件之外的所有内容,在这种情况下,它们最终会成为一个群集。
我考虑了一段时间但是对于这样做的方法感到茫然。看起来它应该很简单,但不知何故,这是非常棘手的。
什么公式适用于任何规模的文件?
答案 0 :(得分:7)
如果您想要群集数量为(size + BPC - 1) / BPC
,则包含所有整数数据类型。
答案 1 :(得分:1)
也许是ceil( (float)((Size - 1) / BPC) )
?
如果一切都是整数类型,那么更好的是((Size - 1) / BPC) + 1
。
答案 2 :(得分:0)
ceil( (float)(Size / BPC) )
执行整数除法,然后将其转换为浮动。
您需要ceil( (float)Size / BPC )
才能正确执行此操作。但是在这里使用浮点数看起来确实是一个坏主意...请参阅整数解的其他答案。