2012-04-28 13 views
1

最近、ハード・リンクを使用して、ディレクトリ内のすべての場所にファイルをコピーし、すべてのコピーを削除し、ハード・リンクで置き換えています。私はそれを大丈夫にしました。私は、ハードリンクがディスク上のデータそのものへの参照であることを理解しています。したがって、作成したハードリンクからデータにアクセスすると、同じように見えます。ハードリンクでディレクトリに使用されている実際のサイズを確認する

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

私は、プロセスの前後でディスクの空き領域をクエリして比較することができます。しかし、それは事実の後で検証するのが難しい初期の評価です。私はまた、GetFileInformationByHandleを使って問題のファイルが複数の参照を持つかどうかを知ることができます。

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

+1

ファイルに複数の参照があるという事実だけでは十分ではありません。その後、他の既存のリンクが、現在計算しているサイズの同じディレクトリまたはディレクトリツリーに属しているかどうかを知る必要があります。つまり、問題のディレクトリ(またはディレクトリツリー)内の任意の2つ以上のハードリンクが同じエンティティを指している場合です。このタスクの非自明の合計サイズを示す場合でも、Windowsエクスプローラはハードリンクを考慮していないという事実の背後にある理由かもしれません。 –

+1

ハードリンクが領域を節約することを確認する必要はありません。彼らはそうする。 –

答えて

1

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

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

Raymond Chen's article on the topicをお読みください。再解析ポイント、クラスタの丸め、代替データストリームなど、アプリケーションに適用できるハードリンク以外にも、いくつかのコーナーケースがあります。

あなたは、ディレクトリトラバーサルで複数回表示されてはならない唯一のリンクでのリンクのみを持つファイルを追跡することによってセットを維持するに必要な労力は1よりも大きいファイルをカウントを削減しようとすることができます。これは、各ディレクトリが一度だけ正確に表示されることを前提としています。リパースポイントとジャンクションは仮定を無効にする可能性があるので、 "ファイルが見える"セットのサイズを縮小しようとすると、既に見たディレクトリを追跡する必要があります。

関連する問題