尝试在Windows下写入mmap时出现奇怪的错误

时间:2010-07-13 19:09:45

标签: python windows mmap

这个简单的python代码:

import mmap  

with file("o:/temp/mmap.test", "w+b") as fp:  
    m = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ|mmap.ACCESS_WRITE)  
    m.write("Hello world!")  

产生以下错误(在mmap.mmap(...)行上):
WindowsError:[错误1006]文件的卷已被外部更改,因此打开的文件不再有效

知道为什么吗?

3 个答案:

答案 0 :(得分:4)

很可能是因为w+截断了文件,而Windows在尝试从长度为0的文件创建空映射时出错。请改用r+

同样,您不应该使用access=mmap.ACCESS_READ|mmap.ACCESS_WRITE

>>> mmap.ACCESS_READ
1
>>> mmap.ACCESS_WRITE
2
>>> mmap.ACCESS_COPY
3
>>> mmap.ACCESS_READ | mmap.ACCESS_WRITE
3

换句话说,access=mmap.ACCESS_READ|mmap.ACCESS_WRITEaccess=mmap.ACCESS_COPY相同。您最想要的是access=mmap.ACCESS_WRITE,而在Windows上,如果您没有明确地使用该参数,那么就是您所获得的。

试试这个:

import mmap  

with file("o:/temp/mmap.test", "r+b") as fp:  
    m = mmap.mmap(fp.fileno(), 0)  
    m.write("Hello world!")  

(mmap docs:http://docs.python.org/library/mmap.html

答案 1 :(得分:4)

来自documentation

  

如果长度为0,则最大长度为   地图是当前的大小   文件,但文件为空时除外   Windows提出异常(你   无法创建空映射   窗口)。

您正在使用“w +”打开文件 - 文件被截断...(size = 0)

答案 2 :(得分:0)

仅供参考 - 使用python 2.7.6

{{1}}

读取r + b,绕过\ x1a数据中的SUB字符,视为文件结尾