1

私は最近、ディレクトリ内のあらゆる場所にファイルをコピーし、すべての重複を削除してハードリンクに置き換えるプログラムでハードリンクを試しています。私はそれを大丈夫にした。ハードリンクが機能する方法で、それはディスク上のデータ自体への単なる別の参照であることを理解しています。したがって、作成したハードリンクからデータにアクセスした場合、同じように見えます。

問題は、実際に使用されているディスクスペースを見つけることです。これは、これが実際にスペースを節約していることを確認する際の問題の1つです。つまり、12Kファイルから始めて、そのファイルのハードリンクを作成し、エクスプローラーで両方を選択すると、実際の12Kではなく、ディスクで使用されている24Kとして表示されます。

プロセスの前後でディスクの空き領域を照会して比較できることはわかっています。しかし、それは最初の評価であり、事後に検証するのは困難です。GetFileInformationByHandleを使用して、問題のファイルに複数の参照があるかどうかを確認できることも知っています。

それで、ここに何かアイデアはありますか?ファイルごとにGetFileInformationByHandleを呼び出し、そのすべてのデータをログに記録してから、インデックス参照が重複しているファイルを削除して、実際に使用されているディスク容量を正確に把握する必要がありますか?または、これを達成するためのより簡単な方法はありますか?

4

1 に答える 1

1

まさにそれをしなさい。(dwVolumeSerialNumber、nFileIndexHigh、nFileIndexLow)トリプルのセットを維持します。ファイルに遭遇するたびに、そのファイルを以前に見たことがあるかどうか(つまり、そのトリプルがすでにセットに含まれているかどうか)を確認してください。もしそうなら、それをスキップします。そうでない場合は、そのファイルサイズを合計に追加し、その情報をセットに挿入します。

残念ながら、これはすべてのファイルを開く必要があることを意味します。リンク数はディレクトリ情報に保存されていないため、提供するFindFirstFileことはできません。が必要GetFileInformationByHandleで、それにはハンドルが必要です。

このトピックに関するレイモンド・チェンの記事を読むことをお勧めします。再解析ポイント、クラスターの丸め、代替データストリームなど、アプリケーションに適用される可能性のあるハードリンク以外のいくつかのコーナーケースについても説明します。

リンク数が1を超えるファイルのみを追跡することで、セットの保守に必要な労力を減らすことができます。リンクが1つしかないファイルは、ディレクトリトラバーサルに複数回表示されないようにする必要があります。これは、各ディレクトリが1回だけ表示されることを前提としています。ポイントとジャンクションを再解析すると、仮定が無効になる可能性があるため、「表示されたファイル」セットのサイズを縮小しようとする場合は、既に表示されたディレクトリも追跡する必要があります。

于 2012-04-30T15:49:27.943 に答える