Как проверить, что сохранение файла завершено с использованием Python?
Я пытаюсь автоматизировать процесс загрузки. В этом я хочу знать, завершено ли сохранение определенного файла или нет. Сценарий такой.
- Откройте адрес сайта с помощью Chrome или Firefox (любой браузер)
- Сохраните страницу на диск, используя 'Crtl + S' (я работаю на Windows)
- Теперь, если страница очень большая, для ее сохранения требуется несколько секунд. Я хочу разобрать HTML, как только сохранение будет завершено.
Поскольку я не контролирую функцию сохранения в браузере, я не знаю, завершено ли сохранение.
Я подумала, что одна идея - получить сумму md5 в файле с помощью цикла while, сравнить с вычисленным предыдущим и продолжить цикл while до совпадения суммы md5 с предыдущим и текущим. Я думаю, это не работает, так как кажется, что браузер сначала пытается сохранить файл в файл tmp, а затем копирует содержимое в указанный файл (или просто переименовывает файл).
Есть идеи? Я использую python для автоматизации, поэтому любая идея, которая может быть реализована с использованием python, приветствуется.
Спасибо Индраджит
1 ответ
В Windows вы можете попробовать открыть файл в режиме эксклюзивного доступа, чтобы проверить, используется ли он (для чтения или записи) какой-либо другой программой. Я использовал это, чтобы дождаться полной загрузки на сервер FTP, вот код:
def check_file_ready(self, path):
'''Check if file is not opened by another process.'''
handle = None
try:
handle = win32file.CreateFile(
path,
win32file.GENERIC_WRITE,
0,
None,
win32file.OPEN_EXISTING,
win32file.FILE_ATTRIBUTE_NORMAL,
None)
return True
except pywintypes.error, e:
if e[0] == winerror.ERROR_SHARING_VIOLATION:
# Note: other possible error codes include
# winerror.ERROR_FILE_NOT_FOUND
# winerror.ERROR_PATH_NOT_FOUND
# winerror.ERROR_ACCESS_DENIED.
return False
raise
finally:
if handle:
win32file.CloseHandle(handle)
Примечание: эта функция повторно вызывает все ошибки win32, кроме нарушения совместного доступа. Вы должны проверить существование файла заранее или проверить наличие дополнительных кодов ошибок в функции (см. Комментарий к строке 15).