これまで監視用の watch フォルダに設置されたファイルは直ちに待ち行列用の queue フォルダに移動していました.これまでサイズの小さなマークダウンファイルで実験してきましたが,将来的には音声データなどサイズの大きなファイルを取り扱うことを考えます.ここで監視用フォルダに音声ファイルをダウンロードして保存しようとしたとき,音声ファイルの全てのダウンロードが完了する前に待ち行列用フォルダに移動する処理が動いてしまう可能性があります.ここではこうした問題に対応する方法を考えます.基本的な考え方はダウンロード中にファイルサイズの変化を監視し,その変化がなくなればコピーが完了したものと判断するものです.
では,テスト用のプログラム (movetest.py) で試してみます.具体的には次のとおり,sample/voice-sample01.m4a というファイルを準備し,そのファイルサイズを取得します.5秒後に再度ファイルサイズを取得したときにサイズが変わっていなければコピーが終了したと判断してプログラムを終了します.もしもファイルのダウンロードに時間がかかっているようであれば,while True のループがファイルサイズが変わらなくなるまで繰り返されることになります.
movetest.py
from pathlib import Path
import time
BASE_DIR = Path(__file__).parent
file = BASE_DIR / "sample" / "voice-sample01.m4a"
while True:
size1 = file.stat().st_size
time.sleep(5)
size2 = file.stat().st_size
print(size1, size2)
if size1 == size2:
print("コピー完了")
break
このプログラムを実行すると次の結果になりました.
(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog> python movetest.py ⏎
329637 329637
コピー完了
(py313watchdog) PS C:\Users\rinsaka\Documents\python\watchdog>
次のページではこの機能をフォルダ監視プログラム (watch.py) に導入します.