[英]How to read a file at a specific offset position using ReadFile() Windows API (C#)?
以下 C# 代碼片段執行二進制文件中頁面的順序讀取。
出於某些微妙的原因 -必須使用 ReadFile() Windows 系統 API。
for (iReadCounter = 0; iReadCounter < iReadCountLimit; iReadCounter++)
{
readsize = DefineConstants.READ_BUF_SIZE;
bool bResult = ReadFile(fhnd, readbuffer, (uint)readsize, out readresult, ref _overlapped);
.
.
}
有沒有辦法可以引導ReadFile()在特定的文件偏移/選擇位置讀取?
謝謝。
/H
您正在將ReadFile()
的lpOverlapped
參數設置為對_overlapped
變量的引用。 因此,您需要使用_overlapped.Offset
和_overlapped.OffsetHigh
字段來指定要讀取的所需文件偏移量。
根據ReadFile()
文檔:
[in, out, optional] lpOverlapped
如果使用
FILE_FLAG_OVERLAPPED
打開hFile
參數,則需要指向OVERLAPPED
結構的指針,否則它可以為 NULL。如果使用
FILE_FLAG_OVERLAPPED
打開hFile
,則lpOverlapped
參數必須指向一個有效且唯一的OVERLAPPED
結構,否則該函數可能會錯誤地報告讀取操作已完成。對於支持字節偏移的
hFile
,如果使用此參數,則必須指定開始從文件或設備讀取的字節偏移。 通過設置OVERLAPPED
結構的Offset
和OffsetHigh
成員來指定此偏移量。 對於不支持字節偏移的hFile
,Offset
和OffsetHigh
將被忽略。有關
lpOverlapped
和FILE_FLAG_OVERLAPPED
不同組合的更多信息,請參閱備注部分和同步和文件位置部分。
“同步和文件位置”部分說:
如果
hFile
是用FILE_FLAG_OVERLAPPED
打開的,它是一個異步文件句柄; 否則它是同步的。 如前所述,每個使用OVERLAPPED
結構的規則略有不同。...
使用異步文件句柄的注意事項:
- ...
- lpOverlapped 參數不得為 NULL,使用時應牢記以下事實:
- 盡管 OVERLAPPED 結構中指定的事件由系統自動設置和重置,但 OVERLAPPED 結構中指定的偏移量不會自動更新。
- ...
- 因為讀取操作從
OVERLAPPED
結構中指定的偏移量開始,並且ReadFile
可能在系統級讀取操作完成(讀取掛起)之前返回,所以無論是偏移量還是結構的任何其他部分都不應被修改、釋放、或由應用程序重用,直到發出事件信號(即讀取完成)。- ...
使用同步文件句柄的注意事項:
- ...
- 如果
lpOverlapped
不為 NULL,則讀取操作從OVERLAPPED
結構中指定的偏移量開始,並且ReadFile
在讀取操作完成之前不會返回。 系統會在ReadFile
返回之前更新OVERLAPPED
偏移量。- ...
如果您將lpOverlapped
參數設置為null
,那么您將不得不使用SetFilePointer()
或SetFilePointerEx()
來指定所需的偏移量:
使用同步文件句柄的注意事項:
- 如果
lpOverlapped
為 NULL,則讀取操作從當前文件位置開始,ReadFile
直到操作完成才返回,系統在ReadFile
返回之前更新文件指針。- ...
如果文件實際上支持在特定位置(不是給定位置)讀取,您應該能夠使用 OVERLAPPED 參數的 Offset 和 OffsetHigh 成員來指定讀取位置。
即使沒有為重疊 I/O 打開文件,這也應該有效。
我相信您應該能夠使用SetFilePointer
或SetFilePointerEx
做到這一點。 它允許您設置文件句柄指向的位置。
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfilepointer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.