FSCTL_QUERY_ALLOCATED_RANGES IOCTL (winioctl.h)

掃描檔案或替代數據流,尋找可能包含非零數據的範圍。 只有壓縮或疏鬆檔案可以有操作系統已知的零範圍。 對於其他檔案,輸出緩衝區只會包含包含起始點和所要求長度的單一專案。

若要執行這項作業,請使用下列參數呼叫 DeviceIoControl 函式。

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to file
  FSCTL_QUERY_ALLOCATED_RANGES,     // dwIoControlCode
  (LPVOID) lpInBuffer,              // input buffer
  (DWORD) nInBufferSize,            // size of input buffer
  (LPVOID) lpOutBuffer,             // output buffer
  (DWORD) nOutBufferSize,           // size of output buffer
  (LPDWORD) lpBytesReturned,        // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);

備註

如需此作業上重疊 I/O 的影響,請參閱 DeviceIoControl 的一節。

NTFS 檔系統會將輸入檔位移向下捨入到方便的界限,並將長度向上捨入到方便的界限,然後開始逐步解說檔案。

操作系統不會追蹤 0 (0) 或非零數據的每個零部分。 因為零 (0) 通常是完全合法的數據,所以會產生誤導。 相反地,系統會追蹤配置磁碟空間的範圍。 如果未配置任何磁碟空間,則會假設所有數據都是零 (0) 。 配置的記憶體可以包含零 (0) 或非零數據。 因此,這項作業會傳回非零數據所在檔案部分的相關信息。 應用程式會根據應用程式的數據慣例來掃描檔案的這些部分。

輸出陣列中的每個專案都包含位移和長度,指出檔案中可能包含非零數據的範圍。 如果有任何數據,則實際的非零數據位於此範圍內,而且呼叫程式必須在範圍內進一步掃描,才能找出它,並判斷它是否真的是有效的數據。 有效數據的多個實例可能存在於範圍內。

配置的範圍受限於記憶體對應遠端 (網路) 檔案的規則,而檔案的開啟句柄不一定一致。 如果您記憶體對應疏鬆網路檔案,並將非零數據寫入檔案先前未配置的區域,則會為新數據配置磁碟空間。 不過,之後 對FSCTL_QUERY_ALLOCATED_RANGES 的呼叫不一定會傳回正確的配置區域清單。 若要確保檢視記憶體與檔句柄之間的一致性,請使用 FlushViewOfFile 函式將數據排清至檔案。

在 Windows 8 和 Windows Server 2012 中,下列技術支援此程序代碼。

技術 支援
伺服器消息塊 (SMB) 3.0 通訊協定 Yes
SMB 3.0 透明故障轉移 (TFO) Yes
具有向外延展檔案共用的SMB 3.0 (SO) Yes
叢集共用磁碟區文件系統 (CsvFS) Yes
彈性檔案系統 (ReFS) No

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限傳統型應用程式]
標頭 winioctl.h (包含 Windows.h)

另請參閱