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]ファイルのボリュームが外部から変更されたため、開いているファイルが無効になりました

なぜですか?

4

3 に答える 3

4

ほとんどの場合、ファイルがw+切り捨てられ、長さ0のファイルから空のマッピングを作成しようとすると、Windowsでエラーが発生します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 )

于 2010-07-13T19:25:42.447 に答える
4

ドキュメントから:

長さが0の場合、マップの最大長はファイルの現在のサイズです。ただし、ファイルが空の場合、Windowsは例外を発生させます(Windowsでは空のマッピングを作成できません)。

「w+」でファイルを開いています-ファイルは切り捨てられています...(サイズ= 0)

于 2010-07-13T19:26:41.633 に答える
0

参考までに-Python2.7.6を使用

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

r + bを読み取り、データ内の\ x1a SUB文字を回避します。これは、ファイルの終わりと見なされます。

于 2016-01-23T16:49:56.170 に答える