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

发布于 2024-09-09 16:14:50 字数 323 浏览 12 评论 0原文

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

知道为什么吗?

This simple python code:

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!")  

Produces the following error (on the mmap.mmap(...) line):
WindowsError: [Error 1006] The volume for a file has been externally altered so that the opened file is no longer valid

Any idea why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦萦几度 2024-09-16 16:14:50

来自文档

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

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

From the documentation:

If length is 0, the maximum length of
the map is the current size of the
file, except that if the file is empty
Windows raises an exception (you
cannot create an empty mapping on
Windows).

You are opening the file with "w+" - the file is getting truncated... (size = 0)

我一向站在原地 2024-09-16 16:14:50

最有可能的原因是 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 )

Most likely because w+ truncates the file, and Windows gives an error when trying to create an empty mapping from that file of length 0. Use r+ instead.

As well, you shouldn't use 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

In other words, access=mmap.ACCESS_READ|mmap.ACCESS_WRITE is the same as access=mmap.ACCESS_COPY. What you want is most likely access=mmap.ACCESS_WRITE, and on Windows that's what you get anyway if you don't explicitly use that argument.

Try this:

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 )

就像说晚安 2024-09-16 16:14:50

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

FYI - with python 2.7.6

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

reading r+b, to get around \x1a SUB characters in the data, seen as end of file

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文