这个简单的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_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文档: 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字符,看作是文件的结尾