次の方法で共有


スパース ファイル操作

ファイル システムがスパース ファイルをサポートしているかどうかを判断するには、GetVolumeInformation 関数を呼び出し、lpFileSystemFlags パラメーターによって返される FILE_SUPPORTS_SPARSE_FILES ビット フラグを調べます。

ほとんどのアプリケーションは、スパース ファイルを認識せず、スパース ファイルを作成しません。 アプリケーションがスパース ファイルを読み取っているという事実は、アプリケーションに対して透過的です。 スパース ファイルを認識するアプリケーションは、そのデータ セットがスパース ファイルに保持されるのに適しているかどうかを判断する必要があります。 その決定が行われた後、アプリケーションは、FSCTL_SET_SPARSE 制御コードを使用して、ファイルをスパースとして明示的に宣言する必要があります。

アプリケーションがファイルをスパースに設定した後、アプリケーションは FSCTL_SET_ZERO_DATA コントロール コードを使用して、ファイルの領域をゼロに設定できます。 さらに、アプリケーションでは、FSCTL_QUERY_ALLOCATED_RANGES 制御コードを使用して、スパース ファイル内の 0 以外のデータの検索を高速化できます。

データが 0 以外で構成される書き込み操作 (FSCTL_SET_ZERO_DATA以外の関数または操作) を実行すると、書き込みの長さ全体に対して 0 がディスクに書き込まれます。 ファイルの範囲をゼロにし、スパースを維持するには、FSCTL_SET_ZERO_DATAを使用します。

スパース対応アプリケーションでは、既存のファイルをスパースに設定することもできます。 アプリケーションで既存のファイルがスパースに設定されている場合は、ファイルをスキャンしてゼロを含むリージョンをスキャンし、FSCTL_SET_ZERO_DATA を使用してそれらのリージョンをリセットし、物理ディスク 記憶域の割り当てを解除する可能性があります。 スパース ファイル認識にアップグレードされたアプリケーションでは、この変換を実行する必要があります。

スパース ファイルのゼロアウト部分から読み取り操作を実行すると、オペレーティング システムがハード ディスク ドライブから読み取られない可能性があります。 代わりに、システムは、読み取るファイルの部分にゼロが含まれていることを認識し、ディスクから実際に読み取ることなくゼロでいっぱいのバッファーを返します。

他のファイルと同様に、システムはスパース ファイル内の任意の位置にデータを書き込んだり、データを読み取ったりすることができます。 0 以外のデータがファイルの以前のゼロ部分に書き込まれると、ディスク領域が割り当てられる可能性があります。 ゼロが 0 以外のデータ (FSCTL_SET_ZERO_DATAのみ) で書き込まれると、ディスク領域が割り当て解除される可能性があります。

手記

FSCTL_SET_ZERO_DATAを使用してゼロを書き込むことでスパース性を維持するのは、アプリケーションにかかっています。

 

NTFS ファイル システム上の圧縮ファイルを処理する最適化ツールは、NTFS ファイル システム ボリューム上のスパース ファイルを正しく処理します。 大きく断片化されたスパース ファイルは、使用可能な領域を使用する前に、ディスク エクステントの NTFS 制限を超える可能性があります。