フォルダ、ファイルの変更を監視する
System.IO.FileSystemWatcherクラスを使って、フォルダやファイルが変更されたら、すぐにわかる方法を紹介します。
インタラクティブシェルを使いながら、動作を試す
今回はインタラクティブシェルを使って、SystemWatcherクラスを試しながら説明していきます。
>>> import System
>>> from System.IO import FileSystemWatcher
>>> watch = FileSystemWatcher()
まずFileSystemWatcherクラスのオブジェクトを作ります。
>>> watch.Path = 'c:\\test'
>>> watch.Filter = '*.txt';
>>> watch.IncludeSubdirectories = False
次にオブジェクトのプロパティを設定します。
Pathプロパティ:監視するディレクトリのパスを指定します。
Filterプロパティ:監視するファイルの拡張子を指定します。
IncludeSubdirectoriesプロパティ:
サブディレクトリを監視するかどうかを指定します。
>>> from System.IO.NotifyFilters import FileName, DirectoryName,
LastWrite
>>> watch.NotifyFilter = FileName | DirectoryName | LastWrite
次にどんな種類の変更を監視するか指定します。監視できる変更は次のものがあります。
Attributes |
ファイルまたはフォルダの属性。 |
CreationTime |
ファイルまたはフォルダが作成された時刻。 |
DirectoryName |
ディレクトリ名。 |
FileName |
ファイルの名前。 |
LastAccess |
ファイルまたはフォルダを最後に開いた日付。 |
LastWrite |
ファイルまたはフォルダへの最終書き込み日付。 |
Security |
ファイルまたはフォルダのセキュリティ設定。 |
Size |
ファイルまたはフォルダのサイズ。 |
>>> from System.IO.WatcherChangeTypes import All
>>> changedResult = watch.WaitForChanged(All,60000)
監視を実行します。今回はすべての変更に対して監視を実施し、監視は1分間
(60000ミリ秒)行います。 1分間ほったらかしにしておきます。入力ができるようになったら次のことを確認してみましょう。
>>> changedResult.TimedOut
True
>>> print changedResult.ChangeType
0
何も変更がなかったら、TimedOutプロパティがTrueになることと、ChangeTypeプロパティが"0"になることがわかりました。
>>> from System.IO.WatcherChangeTypes import Created, Changed,
Renamed, Deleted
ChangeTypeプロパティには作成(Created)、変更(Changed)、名前変更(Renamed)、削除(Deleted)の4つがあります。それぞれの動作を見ていきましょう。
>>> changedResult = watch.WaitForChanged(All,60000)
>>> print changedResult.ChangeType
Created
>>> print changedResult.Name
temp.txt
監視を実行した後に、対象になっているディレクトリに"temp.txt"ファイルを作成してみます。すると入力できるようになり上記の結果になります。
>>> changedResult = watch.WaitForChanged(All,60000)
>>> print changedResult.ChangeType
Changed
>>> print changedResult.Name
temp.txt
次に監視を実行した後に、"temp.txt"ファイルの内容を変更してみましょう。すると入力できるようになり上記の結果になります。
>>> changedResult = watch.WaitForChanged(All,60000)
>>> print changedResult.ChangeType
Renamed
>>> print changedResult.Name
test.txt
>>> print changedResult.OldName
temp.txt
次に監視を実行した後に、"temp.txt"ファイルのファイル名を"test.txt"に変更してみましょう。すると入力できるようになり上記の結果になります。
>>> changedResult = watch.WaitForChanged(All,60000)
>>> print changedResult.ChangeType
Deleted
>>> print changedResult.Name
test.txt
最後に監視を実行した後に、"test.txt"ファイルを"test.txt"を削除してみてください。すると入力できるようになり上記の結果になります。
スクリプトファイルにしてみる
今までやってきたことを踏まえてスクリプトにして見ます。
import System
from System.IO import FileSystemWatcher
watch = FileSystemWatcher()
watch.Path = 'c:\\test'
watch.Filter = '*.txt';
from System.IO.NotifyFilters import FileName, DirectoryName, LastWrite
watch.NotifyFilter = FileName | DirectoryName | LastWrite
watch.IncludeSubdirectories = False
from System.IO.WatcherChangeTypes import All
print '監視を開始します。'
changedResult = watch.WaitForChanged(All,60000)
if changedResult.TimedOut :
print "1分間にFile変更はありません"
from System.IO.WatcherChangeTypes import Changed, Created, Deleted, Renamed
if changedResult.ChangeType == Created :
print '"'+ changedResult.Name.ToString() + '"が作成されました。'
if changedResult.ChangeType == Changed :
print '"'+ changedResult.Name.ToString() + '"が変更されました。'
if changedResult.ChangeType == Renamed :
print ('"'+ changedResult.OldName.ToString() + '"から"'
+ changedResult.Name.ToString() + '"へFile名が変更されました。')
↑カッコの中では,改行や空白を使うことが出来ます。
↑コードをきれいに書くためのテクニック!!
if changedResult.ChangeType == Deleted :
print '"'+ changedResult.Name.ToString() + '"が削除されました。'
raw_input()
出力画面例
監視を開始します。
1分間にFile変更はありません
実はこのようなことを、このサイトを作りながら私がいつもやっています。