Этот простой код 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 docs: http://docs.python.org/library/mmap.html)
FYI - с 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 в данных, рассматриваемых как конец файла