Странная ошибка при попытке записи в mmap под windows

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: [Ошибка 1006] Том для файла был изменен извне, так что открытый файл больше не действителен.

Любая идея, почему?

Теги:
mmap

3 ответа

4
Лучший ответ

Из документация:

Если длина равна 0, максимальная длина карта - текущий размер файл, за исключением того, что если файл пуст Windows вызывает исключение (вы не может создать пустое отображение на Windows).

Вы открываете файл с помощью "w +" - файл обрезается... (size = 0)

  • 0
    Да ты прав. Я бродил по странному тексту сообщения об ошибке, но только что обнаружил, что 1006 - это просто ERROR_FILE_INVALID в Win32, который создает CreateFileMapping () ...
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 docs: http://docs.python.org/library/mmap.html)

  • 0
    Пробовал г +, но выдает ту же ошибку. Доступ = действительно избыточен, но был добавлен только для того, чтобы убедиться, что это не странный способ сказать «отказано в разрешении».
  • 0
    @Paul - файл заполнен данными? Длина = 0 будет работать только с непустыми файлами. Если вы укажете длину, то файл будет расширен.
Показать ещё 3 комментария
0

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 в данных, рассматриваемых как конец файла

Ещё вопросы

Сообщество Overcoder
Наверх
Меню