这个简单的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]文件的卷已被外部更改,因此打开的文件不再有效
知道为什么吗?
答案 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_WRITE
与access=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)
如果长度为0,则最大长度为 地图是当前的大小 文件,但文件为空时除外 Windows提出异常(你 无法创建空映射 窗口)。
您正在使用“w +”打开文件 - 文件被截断...(size = 0)
答案 2 :(得分:0)
仅供参考 - 使用python 2.7.6
{{1}}
读取r + b,绕过\ x1a数据中的SUB字符,视为文件结尾