2014-10-30 30 views
1

我试图用ACCESS_COPY模式映射文件。然后我写入一个char和flush,但是flush()返回失败,并且更改不会写回到文件中。任何想法为什么?谢谢。python mmap flush()不适用于ACCESS_COPY

Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

import os, mmap 

f = open('etc.test', 'r+b') 

mapped = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_COPY) 
print mapped[0] 
mapped[0] = 'R' 
print mapped.flush() <--- returns 0 (error on Windows) 
mapped.close() 
f.close() 
+0

是否有您使用mmap.ACCESS_COPY什么特别的原因?记录mmap.ACCESS_COPY无法将更改写回文件。 – nos 2014-10-30 22:51:09

+0

是的,我想在内存中进行更改,然后写回文件。 “分配给ACCESS_COPY内存映射会影响内存,但不会更新基础文件。” “flush([offset,size]) 刷新文件的内存中副本到磁盘的更改。” – notkov 2014-10-30 22:51:40

回答

0

我已经找到了答案:

事实上,那是预期的行为。从python源代码:

if (self->access == ACCESS_READ || self->access == ACCESS_COPY) 
    return PyLong_FromLong(0); 

所以,如果使用ACCESS_COPY,它将返回0。这是正常的,Windows API以这种方式运行,COW仅在内存中使用,并且不会被刷新。

无论如何,你可以将所有的数据写回用f.write()

相关问题