尝试在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]文件的卷已被外部更改,以便打开的文件不再有效

任何想法为什么?

从文档 :

如果长度为0,则映射的最大长度是文件的当前大小,但是如果文件为空,则Windows引发异常(无法在Windows上创建空映射)。

你正在用“w +”打开文件 – 文件被截断…(size = 0)

很可能是因为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文档: http : //docs.python.org/library/mmap.html )

仅供参考 – 用python 2.7.6

 dataFile = open(dFile, mode='r+b') # failed with windows access error dataFile = open(dFile, 'r+b') # works 

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