自作プログラム
Zip-Rar-Auto-Decompression

任意のフォルダーを監視して, そこに放り込まれたzip/rarを自動解凍して削除するプログラムを作りました. 自分で解凍/削除する手間が省けますね.

ダウンロードはこちらから.

※zipのまま取り扱った方がいい作業とかには不向きだけど…

簡単な使い方

☆初期設定☆
ソフトを起動して, 監視したいフォルダーをD&Dするだけで初期設定完了です. 以降はこの手順をせずに起動するだけでフォルダの監視を始めます. (以下の画像はダウンロードフォルダを例としています)

※監視したいフォルダを変更したい場合は, ソフトと同階層にあるsettings.iniを消してソフトを起動するか, settings.iniに書かれているディレクトリを自分で変更してください.

※本ソフトと同階層にunRAR.exeを置かないとRarファイル解凍はできません

コードのお話

実装で手こずった個所を抜粋します. 死ぬほど頭が悪そう

def on_modified(self, event):
    try:
        filepath = event.src_path
        filename = os.path.basename(filepath)
        time1=os.path.getsize(filepath)
        time.sleep(0.001)
        time2=os.path.getsize(filepath)
        if time2-time1 == 0:
            if filepath[-4:]=='.zip' :
                with zipfile.ZipFile(filepath) as zf:
                    zf.extractall(target_dir)
                print('%sを解凍しました'% filename)
                os.remove(filepath)
            elif filepath[-4:]=='.rar' :
                with rarfile.RarFile(filepath) as rf:
                    rf.extractall(target_dir)
                print('%sを解凍しました'% filename)
                os.remove(filepath)
            else:
                pass
        else:
            pass
    except Exception as e:
        pass

watchdogsというPythonのフォルダ監視ができるライブラリを使いました. で, まあちゃんと監視自体はできるんですけど, いろいろ自分が想定していたものと違ったのでこういう書き方で半ばゴリ押す形で実装しました.

まず, ファイルの生成判定ができる関数でファイルの判定を行おうとしたものの, どうやらこれはファイルが入る指示を受け取った瞬間に実行されるようで, コピー中, つまりzip/rarファイルとして形が出来切ってないのに判定してしまうため解凍動作でエラーが出てきます.

よって, def on_modified(self, event):の中で判定するようにしたんですけどこれもこれで少々癖があって, ファイルが逐一更新, つまりサイズが変動するたびにファイルの変更判定を行ってるらしいんですよね. つまりコピー中に適当な周期で判定を行って何回もこれの判定が出てくる. つまり最初の生成判定と同じでファイルがコピーされ切ってなくても判定してエラーが発生するわけです.

そこで, time.sleep()を超細かく取ってsizeのsizeの差分を取り, コピー中か完了かどうか判定するようにしました. これでzip/rarファイルのサイズに寄らずきちんと動作してくれます. また,  os.remove(filepath) でファイルを消した後に判定が残っていてサイズ確認で「そんなファイルはない!」みたいなエラーが出る可能性を考慮して一応try excpetで無視する形を取りました.

今後の話

zip/rar以外にも対応してるとか, Unityのassetとかも自動解凍出来たら需要高まりますかね?

その他にもフォルダ監視をうまく活用して, 自動で他のフォルダに同期取れるみたいなのもやってみたいですよね.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください