Python: открытие файла без создания блокировки

Я пытаюсь создать скрипт на Python для резервного копирования некоторых файлов. Но эти файлы могут быть переименованы или удалены в любое время. Я не хочу, чтобы мой скрипт предотвращал это, блокируя файл; файл должен быть в состоянии удалить в любое время во время резервного копирования.

Как я могу сделать это в Python? И что происходит? Мои объекты просто становятся нулевыми, если поток не может быть прочитан?

Спасибо! Я немного новичок в Python.

2 ответа

Решение

Как уже упоминалось kindall, это проблема, специфичная для Windows. Операционные системы Unix позволяют удалять.

Чтобы сделать это в Windows, мне нужно было использовать win32file.CreateFile, чтобы использовать специфичный для Windows флаг dwSharingMode (в win32file Python он просто называется "режим совместного использования"). Вот несколько документов по этому вопросу: http://docs.activestate.com/activepython/2.7/pywin32/win32file__CreateFile_meth.html

Грубый пример:

import win32file # Ensure you import the module.

file_handle = win32file.CreateFile('filename.txt', win32file.GENERIC_READ, win32file.FILE_SHARE_DELETE | win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, None, win32file.OPEN_EXISTING, win32file.FILE_ATTRIBUTE_NORMAL, None)

На UNIX-подобных ОС, включая Linux, это не проблема. Ну, какая-то другая программа может записать в файл в то же время, когда вы читаете его, что может вызвать проблемы (копируемый файл может оказаться поврежденным), но это можно решить с помощью прохода проверки.

В Windows используйте службу моментальных снимков томов (так называемое теневое копирование томов). VSS создает моментальный снимок тома в определенный момент времени, и вы можете открывать файлы на снимке, не блокируя файлы на исходном томе. Быстрый Google нашел модуль Python для копирования с использованием VSS здесь: http://sourceforge.net/projects/pyvss/

Другие вопросы по тегам