2017-04-25 82 views
0

我有一個代碼在重新映射之前使用MapViewOfFile和FlushViewOfFile寫入文件。MapViewOfFile不會導致從文件讀取

和我有一個第二代碼,即從相同的文件中讀取(在磁盤上,而不是HANDLE /映射對象)在同一進程中的其他線程使用MapViewOfFile。

的視圖的標誌是PAGE_READONLY/FILE_READ和PAGE_READWRITE/FILE_WRITE。

在我的電腦上,一切正常。 但當相同的構建與其他PC上運行的服務,它有一個奇怪的錯誤: 當我重新映射與偏移== 0讀者(這意味着UnmapViewOfFile + MapViewOfFile)(閱讀一些文件頭),它不返回任何錯誤,但是閱讀本身會返回一些舊值,這些值已經被其他線程修改過了。

當我打開的ProcessMonitor,這表明,有沒有從偏移量= 0,只寫讀書。

那麼,問題是,新的呼叫的CreateFileMapping/MapViewOfFile成功地返回,但映射一些舊的緩存頁面,而不會從文件中讀取新的數據。

再次,相同的構建罰款在我的電腦上工作。

有人可以提出一些建議嗎?謝謝。

+0

貌似問題是FlushViewOfFile。 我已經切換到簡單的ReadFile閱讀,並且它可以在本地PC上正常工作,但是當我嘗試從另一臺PC(使用簡單的ReadFile)讀取此文件時,會發生同樣的問題。 –

回答

0

documentation for MapViewOfFile

雖然MapViewOfFile可與遠程文件,它不會讓他們連貫。例如,如果兩臺計算機都將文件映射爲可寫,並且兩臺計算機都更改同一頁,則每臺計算機只能看到自己寫入頁面的內容。數據在磁盤上更新時,不會合並。

換句話說,你所觀察的行爲是按預期。

另外:

的映射視圖的文件的不保證是相干與正在由所述的ReadFile或WriteFile函數訪問的文件。

由於您需要網絡的一致性,因此無法使用文件映射。您將不得不使用ReadFile來讀取內容並使用WriteFile來修改它們。您還應該使用LockFile或其他方法來協調對文件的訪問,以確保您讀取的數據一致。

(你也應該注意到,它是沒有用的取消映射,然後重新映射完全相同的觀點,這基本上是一個無操作。)

+0

感謝您的回答。 看起來你是對的。但我會注意到,文件中的兩個引號都不是我的情況。 我的程序做的是 - 寫入視圖,然後刷新(!!)到磁盤,並從不同的線程(使用其他視圖)讀取此文件。 所以,我不能做的是強制CreateFileMapping/MapVIewOfFile從磁盤讀取,即使我「關閉」FileMapping,然後再「創建」它。 我想重新打開文件描述符可能會有所幫助..(是的,這是非常好的表現) –

+0

FlushViewOfFile並沒有真正改變任何東西。它不引入任何額外的一致性保證。 (因爲它不能保證數據已經被物理地寫入了,所以我不確定它是什麼,如果有的話,它對於它是有用的。)數據被緩存在服務器和客戶端,FlushViewOfFile不會'不會影響另一臺計算機上的緩存。 –

+0

我還在FlushViewOfFile –

相關問題