1

ダウンロードプロセスを自動化しようとしています。ここでは、特定のファイルの保存が完了したかどうかを知りたいです。シナリオはこんな感じ。

  1. ChromeまたはFirefox(任意のブラウザ)を使用してサイトアドレスを開きます
  2. 'Crtl + S'を使用してページをディスクに保存します(私はWindowsで作業します)
  3. ページが非常に大きい場合は、保存に数秒かかります。保存が完了したら、htmlを解析したいと思います。

ブラウザの保存機能を制御できないため、保存が完了したかどうかわかりません。

私が考えたアイデアの1つは、whileループを使用してファイルのmd5sumを取得し、計算された前のファイルと照合して、前と現在のmd5の合計が一致するまでwhileループを続けることです。ブラウザは最初にファイルをtmpファイルに保存し、次にコンテンツを指定されたファイルにコピーしようとする(またはファイルの名前を変更する)ように見えるため、これは機能しないと思います。

何か案は?自動化にはPythonを使用しているので、Pythonを使用して実装できるアイデアは大歓迎です。

ありがとうインドラジット

4

1 に答える 1

6

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 行目のコメントを参照)。

于 2010-05-17T10:29:01.013 に答える