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キャプチャ追加予定。