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/