2010-07-13 6 views
1

Этот простой код питона:Weird ошибка при попытке записи на ттар под окнами

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

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

ответ

4

От 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).

Вы открываете файл с "ш +" - файл становится усеченным ... (размер = 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 документы: http://docs.python.org/library/mmap.html)

+0

Пробовал г +, но это дает ту же ошибку. Доступ = действительно избыточен, но был добавлен просто для того, чтобы убедиться, что это не странный способ для Windows сказать «разрешенное разрешение» –

+0

@Paul - это файл, заполненный данными? Длина = 0 будет работать только с непустыми файлами. Если вы укажете длину, файл будет расширен. –

+0

Все в порядке: запутанная часть - текст сообщения об ошибке (см. Мой комментарий к Джереми). Я думаю, что даже «всегда смотреть на яркую сторону жизни» будет лучшим текстом для этой ошибки. –

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