Как проверить, что сохранение файла завершено с использованием Python?

Я пытаюсь автоматизировать процесс загрузки. В этом я хочу знать, завершено ли сохранение определенного файла или нет. Сценарий такой.

  1. Откройте адрес сайта с помощью Chrome или Firefox (любой браузер)
  2. Сохраните страницу на диск, используя 'Crtl + S' (я работаю на Windows)
  3. Теперь, если страница очень большая, для ее сохранения требуется несколько секунд. Я хочу разобрать 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).

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