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) |