2010-07-13 7 views
1

Ce simple code python:erreur étrange lorsque vous essayez d'écrire un MMAP sous Windows

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

produit l'erreur suivante (sur la ligne mmap.mmap (...)):
WindowsError: [Erreur 1006] Le volume d'un fichier a été modifié de manière externe pour que le fichier ouvert ne soit plus valide

Une idée pourquoi?

Répondre

4

De l'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).

Vous ouvrez le fichier avec "w +" - le fichier est se tronqué ... (size = 0)

+0

Oui, vous avez raison. Je me promenais à propos du texte bizarre du message d'erreur, mais je viens de découvrir que 1006 est simplement ERROR_FILE_INVALID de Win32 que CreateFileMapping() produit ... –

4

Probablement parce que w+ tronque le fichier et Windows affiche une erreur lors de la tentative de création d'un mappage vide à partir de ce fichier de longueur 0. Utilisez plutôt r+.

De plus, vous ne devriez pas utiliser 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 

En d'autres termes, access=mmap.ACCESS_READ|mmap.ACCESS_WRITE est le même que access=mmap.ACCESS_COPY. Ce que vous voulez, c'est probablement access=mmap.ACCESS_WRITE, et sur Windows c'est ce que vous obtenez de toute façon si vous n'utilisez pas explicitement cet argument.

Essayez ceci:

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

Essayé r +, mais il donne la même erreur. L'accès = est en effet redondant, mais a été ajouté juste pour s'assurer que ce n'est pas un étrange moyen de dire 'autorisation refusée' –

+0

@Paul - le fichier est-il rempli de données? Length = 0 ne fonctionnera qu'avec des fichiers non vides. Si vous spécifiez une longueur, le fichier sera étendu. –

+0

Tout va bien: la partie confuse est le texte du message d'erreur (voir mon commentaire à Jeremy). Je suppose que même un «toujours regarder le bon côté de la vie» serait un meilleur texte pour cette erreur. –

0

FYI - avec python 2.7.6

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

lecture r + b, pour se déplacer \ X1A caractères SUB dans les données, considérées comme la fin du fichier

Questions connexes