ftplib が進行中のファイルをダウンロードできないようにしますか?
質問
弊社では、弊社の管理下にないリモート FTP サーバーを監視/ダウンロードするための FTP システムをセットアップしています。スクリプトはリモート FTP に接続し、サーバー上のファイルのファイル名を取得し、それがすでにダウンロードされているかどうかを確認します。ダウンロードされていない場合は、ファイルをダウンロードしてリストに追加します。
最近、リモート FTP 側の誰かが巨大な単一ファイル (>1 GB) をコピーすると、スクリプトが起動して新しいファイルを確認し、コピーされているファイルのダウンロードを開始するという問題に遭遇しました。
これを確認する最良の方法は何ですか?ファイルサイズを取得することを考えていましたが、数秒待ってファイルサイズを再度確認し、増加しているかどうかを確認し、増加していない場合はダウンロードします。ただし、時間が重要であるため、すべてのファイル セットごとに数秒待って、ファイル サイズが増加したかどうかを確認することはできません。
これを行う最善の方法は何でしょうか。現在、すべてが Python ftplib 経由で行われています。前述の方法を使用する以外に、これを行うにはどうすればよいでしょうか。
もう一度繰り返しますが、私たちはリモート FTP サイトをまったく制御できません。
ありがとう。
更新1:
名前を変えてみたらどうしようかと思ったのですが…FTP に対する完全なアクセス許可があるので、ファイルのアップロードが進行中の場合、名前変更コマンドは失敗しますか?
ここには実際の選択肢はありません...そうしますか?
更新2:さて、興味深いことに、私たちがテストした ftps の一部は、転送が開始されると自動的にスペースを割り当てるようです。
例えば。200mbのファイルをftpサーバーに転送するとします。アップロード中に FTP サーバーに接続してサイズを測定すると、転送がアクティブになります。サイズは200mbと表示されています。ファイルはまだ 10% 程度しか完成していません。
アクセス許可も、IIS に付属する FTP サーバーによってランダムに設定されるようで、ファイルのコピーが完了した後にアクセス許可が設定されます。他の古い FTP サーバーの中には、ファイルを送信するとすぐに設定するものもあります。
:'(
解決
「魚雷なんてくそー!最高速で前へ!"
ファイルをダウンロードするだけです。ファイルが大きい場合は、ダウンロードが完了した後、シナリオに応じて適切な時間待機し、停止した時点からダウンロードを続行します。ダウンロードするものがなくなるまで繰り返します。
他のヒント
あなたはサーバーより0コントロールを持っているとS.ロットにより示唆されるように、あなたのクライアントは、トリガファイルを投稿することができません言うように、あなたはおそらく、しばらく待つことによって、不完全な解決策とリスク不完全なファイル転送に対処しなければならないし、前と後のファイルサイズを比較します。
あなたが示唆したように名前を変更しようとすることができますが、0コントロールを持っているとして、あなたはFTPサーバー管理者(またはその後継)がプラットフォームやFTPサーバを変更したり、権限を制限していないことを確認することはできません。
申し訳ありません。
複数のファイルを扱っている場合、あなたは、一度にすべてのサイズのリストを取得し、10秒待ってから、同じである見ることができました。どちらがダウンロードしても安全である必要があり、まだ同じです。
OS のコピーがいつ完了するかはわかりません。速度が低下したり、待機したりする可能性があります。
確実に確認するには、実際には 2 つのファイルが必要です。
- 巨大なファイル。
- そして小さなトリガーファイル。
彼らは巨大なファイルを好きなだけいじることができます。しかし、彼らがトリガー ファイルに触れると、両方をダウンロードすることになります。
トリガーを取得できない場合は、ポーリングに必要な時間とポーリングに必要な時間のバランスを取る必要があります。ダウンロードに必要な時間。
これを行う。
リストを取得します。タイムスタンプを確認します。
サイズと比較を確認してください。ファイルの以前のサイズ。サイズが似ていない場合は、現在コピー中です。待って;サイズが前のサイズに近づくまで、このステップを繰り返します。
まだ終わっていない間に:
a.ファイルを取得します。
b.もう一度リストを取得します。新しいリスト、以前のリスト、ファイルのサイズを確認してください。彼らが同意する場合:もう終わりです。彼らが同意しない場合:ダウンロード中にファイルが変更されました。まだ終わっていません。