1

这个简单的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: [Error 1006] 文件的卷已被外部更改,因此打开的文件不再有效

知道为什么吗?

4

3 回答 3

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 文档:http ://docs.python.org/library/mmap.html )

于 2010-07-13T19:25:42.447 回答
4

文档中:

如果长度为 0,则映射的最大长度是文件的当前大小,除非文件为空 Windows 会引发异常(您不能在 Windows 上创建空映射)。

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

于 2010-07-13T19:26:41.633 回答
0

仅供参考 - 使用 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 字符,视为文件结尾

于 2016-01-23T16:49:56.170 回答