FSCTL_SET_ZERO_DATA IOCTL (winioctl.h)
ファイルの特定の範囲を 0 で埋めます。 ファイルがスパースまたは圧縮されている場合、NTFS ファイル システムによってファイル内のディスク領域の割り当てが解除される可能性があります。 これにより、ファイル サイズを拡張せずに、バイトの範囲が 0 に設定されます。
この操作を実行するには、次のパラメーターを使用して DeviceIoControl 関数を呼び出します。
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to a file
FSCTL_SET_ZERO_DATA, // dwIoControlCode
(LPVOID) lpInBuffer, // input buffer
(DWORD) nInBufferSize, // size of input buffer
NULL, // lpOutBuffer
0, // nOutBufferSize
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
解説
この操作に対する重複した I/O の影響については、 DeviceIoControl トピックの「解説」セクションを参照してください。
WriteFile 関数を使用してスパース ファイルにゼロ (0) を書き込む場合、ファイル システムは書き込むデータのディスク領域を割り当てます。 FSCTL_SET_ZERO_DATA制御コードを使用して、スパース ファイルにゼロ (0) を書き込み、ゼロ (0) 領域が十分に大きい場合、ファイル システムはディスク領域を割り当てない可能性があります。
FSCTL_SET_ZERO_DATA制御コードを使用して、ゼロ (0) を非スパース ファイルに書き込む場合、ゼロ (0) がファイルに書き込まれます。 システムは、ゼロ (0) の範囲すべてにディスク ストレージを割り当てます。これは、 WriteFile 関数を使用してゼロ (0) をファイルに書き込むのと同じです。
リモート ファイルのタイム スタンプが正しく更新されない場合があります。 一貫性のある結果を得るには、バッファーなしの I/O を使用します。
Windows 8 および Windows Server 2012 では、このコードは次のテクノロジでサポートされています。
テクノロジ | サポートされています |
---|---|
サーバー メッセージ ブロック (SMB) 3.0 プロトコル | はい |
SMB 3.0 Transparent Failover (TFO) | はい |
スケールアウト ファイル共有 (SO) を使う SMB 3.0 | はい |
クラスターの共有ボリューム ファイル システム (CsvFS) | はい |
Resilient File System (ReFS) | はい |
要件
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
Header | winioctl.h (Windows.h を含む) |