水深1mm

広く浅い個人的メモ。

PySideとwatchdogを使用したフォルダ監視ツール

開発環境

  • python3.4(多分)
  • PySide・watchdogインストール済み

folder_killer

https://drive.google.com/file/d/0B4fmLEFqtND0X2ljRXJ1bkZyeEk/view?usp=docslist_api

  • 名前がfolder_killerだけどサンプルのため削除機能は現在無効にしている。
  • 普段とは違う環境からの投稿のため動作未検証。
# -*- coding: utf-8 -*-

from PySide.QtGui import QListWidgetItem

import os
import json
import sys
import time
import shutil
from PySide import QtGui, QtCore
from ui_MainWindow import *

from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler, FileSystemEvent, FileSystemEventHandler


_TARGET_DIR_NAMES = ['targetA', 'targetB', 'targetC', 'targetD']
# _TARGET_DIR_NAMES = None


class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.__ui = Ui_MainWindow()
        self.__ui.setupUi(self)

        self.show()

        self.__ui.select_watch_btn.clicked.connect(self.__on_clicked)
        self.__ui.watch_path.textChanged.connect(self.__on_path_changed)

        self.__observer = Observer()
        pass

    def __on_clicked(self):
        # print('on_btn_clicked')

        path = QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', os.path.expanduser('~') + '/Desktop')
        if path:
            self.__ui.watch_path.setText(path)
        pass

    def __on_path_changed(self, text):
        # print('on_path_changed : ', text)

        if os.path.exists(text):
            #  起動中のスレッドを停止してから新たにObserver作成
            if self.__observer.is_alive():
                self.__observer.stop()
                self.__observer.join()

            print('Watch Path Changed: ', text)
            self.__observer = Observer()
            self.__observer.schedule(Killer(_TARGET_DIR_NAMES), text, True)
            self.__observer.start()
        pass

    def closeEvent(self, *args, **kwargs):
        if self.__observer.is_alive():
            self.__observer.stop()
            self.__observer.join()
        pass


class Killer(FileSystemEventHandler):
    def __init__(self, targets):
        self.__targets = targets

    def on_created(self, event):
        """
        @type event: FileSystemEvent
        """

        if os.path.basename(event.src_path) in self.__targets and event.is_directory:
            print('CreatedFolder : ', event.src_path)

            # 削除
            # print('Delete : ', event.src_path)
            # shutil.rmtree(event.src_path)
        pass

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    mainWin = MainWindow()
    sys.exit(app.exec_())

UI上で設定又は変更したパスが存在する場所であった場合にobserverのパスのみ変更したかったが、パスだけの変更が(パッと見)出来なかったので、observerそのものを作成しなおしている。

上記スクリプトでは設定したパスの直下に

_TARGET_DIR_NAMES = ['targetA', 'targetB', 'targetC', 'targetD']

で指定したディレクトリが作成された時になんやかんやしていた。

気が向いたらUIキャプチャ追加予定。