Share via


スパース ファイルの操作

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

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

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

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

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

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

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

Note

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

 

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