簡體   English   中英

如何使用 ReadFile() Windows API (C#) 在特定偏移位置讀取文件?

[英]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結構的OffsetOffsetHigh成員來指定此偏移量。 對於不支持字節偏移的hFileOffsetOffsetHigh將被忽略。

有關lpOverlappedFILE_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 打開文件,這也應該有效。

我相信您應該能夠使用SetFilePointerSetFilePointerEx做到這一點。 它允許您設置文件句柄指向的位置。

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfilepointer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM