2017-04-25 88 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 –

相关问题