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

1 投票
3 回答
3867 浏览
提问于 2025-04-16 01:14

这段简单的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

供你参考 - 这是关于 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 字符被误认为是文件结束。

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

4

来自文档

如果长度为0,那么映射的最大长度就是文件的当前大小,除了在Windows系统中,如果文件是空的,会抛出一个异常(在Windows上不能创建一个空的映射)。

你是用"w+"模式打开文件的,这样文件就被清空了……(大小变为0)

撰写回答