3

今朝、私は大量のファイルを失いましたが、それらの 1 つのボリュームは内部的にも外部的にも最適化されていたため、100% の回復に必要なすべての情報が利用可能です。必要な場所に FAT を入力するだけです。

これを実行するプログラムを作成し、ファイルにダンプした FAT のコピーでテストしたところ、一部のファイル (526 個中 17 個) で FAT チェーンが 1 つの単一クラスターで長すぎることを除けば、完全に動作しました。となり、次のファイルと相互リンクされます。

幸いなことに、私は問題が何であるかを正確に知っています。EOF 計算で使用ceilしたのは、1 バイトを超えるだけでも余分なクラスター全体が必要になるためです。

//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) )整数除算を行い、それを float にキャストします。

ceil( (float)Size / BPC )それを正しく行う必要があります。しかし、ここでフロートを使用することは、そもそも悪い考えのように思えます...整数の解決策については、他の回答を参照してください。

于 2012-10-28T17:02:09.613 に答える