Как проверить, что сохранение файла завершено с использованием Python? - PullRequest
1 голос
/ 17 мая 2010

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

  1. Открыть адрес сайта с помощью Chrome или Firefox (любой браузер)
  2. Сохранить страницу на диск, используя 'Crtl + S' (я работаю на Windows)
  3. Теперь, если страница очень большая, для ее сохранения требуется несколько секунд. Я хочу разобрать HTML после завершения сохранения.

Поскольку я не контролирую функцию сохранения в браузере, я не знаю, завершено ли сохранение или нет.

Одна идея, которую я подумал, - это получить сумму md5 файла с помощью цикла while, сверять с вычисленным предыдущим и продолжать цикл while до совпадения суммы md5 из предыдущего и текущего. Я думаю, это не работает, так как кажется, что браузер сначала пытается сохранить файл в файл tmp, а затем копирует содержимое в указанный файл (или просто переименовывает файл).

Есть идеи? Я использую python для автоматизации, поэтому любая идея, которая может быть реализована с использованием python, приветствуется.

Спасибо Indrajith

1 Ответ

6 голосов
/ 17 мая 2010

В 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).

...