2014-10-30 4 views
1

Я пытаюсь отобразить файл в режиме ACCESS_COPY. Затем я пишу один символ и флеш, но flush() возвращает сбой, и изменения не записываются обратно в файл. Любые идеи почему? Спасибо.python mmap flush() не работает с ACCESS_COPY

Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

import os, mmap 

f = open('etc.test', 'r+b') 

mapped = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_COPY) 
print mapped[0] 
mapped[0] = 'R' 
print mapped.flush() <--- returns 0 (error on Windows) 
mapped.close() 
f.close() 
+0

Есть ли какая-либо конкретная причина вы используете mmap.ACCESS_COPY? mmap.ACCESS_COPY задокументировано, чтобы не было возможности записать изменения обратно в файл. – nos

+0

Да, я хочу внести изменения в память, а затем записать обратно в файл. «Назначение карты памяти ACCESS_COPY влияет на память, но не обновляет основной файл». "flush ([offset, size]) Сбрасывает изменения, внесенные в копию файла в памяти на диске." – notkov

ответ

0

я нашел ответ:

Действительно, это предполагаемое поведение. Из исходного кода python:

if (self->access == ACCESS_READ || self->access == ACCESS_COPY) 
    return PyLong_FromLong(0); 

Таким образом, он будет возвращать 0 при использовании ACCESS_COPY. Это нормально, Windows API ведет себя так, COW используется только в памяти и не будет сброшена.

Во всяком случае, вы могли бы написать все данные обратно с f.write()

Смежные вопросы