スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門基本編落穂拾い その45 ファイル、フォルダの監視

ファイル、フォルダの変更を監視するには、System.IO.FileSystemWatcherクラスのインスタンスを利用します。
ひとつインスタンスを生成してみます。
 
> let fsw = new System.IO.FileSystemWatcher();;
val fsw : System.IO.FileSystemWatcher = System.IO.FileSystemWatcher
 
> fsw;;
val it : System.IO.FileSystemWatcher =
  System.IO.FileSystemWatcher
    {Container = null;
     EnableRaisingEvents = false;
     Filter = "*.*";
     IncludeSubdirectories = false;
     InternalBufferSize = 8192;
     NotifyFilter = FileName, DirectoryName, LastWrite;
     Path = "";
     Site = null;
     SynchronizingObject = null;}
 
特に重要なのはFilterとIncludeSubdirectoriesとNotifyFilterとPathとEnableRaisingEventsです。
 
○Pathで監視するフォルダを設定します。

 
> fsw.Path <- @"s:\BlogTest" ;;
val it : unit = ()
 
○NotifyFilterでは、どのような変更に目を光らすかを指定します。
System.IO.NotifyFilters列挙体で定義します。
 FileName ファイルの名前。 
 DirectoryName     ディレクトリ名。 
 Attributes     ファイルまたはフォルダーの属性。 
 Size             ファイルまたはフォルダーのサイズ。 
 LastWrite         ファイルまたはフォルダーへの最終書き込み日付。 
 LastAccess     ファイルまたはフォルダーを最後に開いた日付。 
 CreationTime     ファイルまたはフォルダーが作成された時刻。 
 Security         ファイルまたはフォルダーのセキュリティ設定。 
 
デフォルトでは、FileName, DirectoryName, LastWriteとなっています。
たとえば次のように指定します。
 
> fsw.NotifyFilter <- NotifyFilters. LastWrite ||| NotifyFilters.FileName;;
val it : unit = ()
 
○Filterプロパティは、指定フォルダで監視するファイルを指定する場合に使用します。
なお、この指定にはワイルドカード(*)が使用できます。
 
フィルタ文字列の例
 
*.*
 すべてのファイル (既定)。空の文字列 ("") を指定しても、すべてのファイルがウォッチ(監視)されます。
 
*.txt
 拡張子が "txt" のすべてのファイル。
 
*sf2.txt
 ファイル名が "sf2" で終わり、拡張子が "txt" のすべてのファイル。
 
sf2.txt
 sf2.txtのみをウォッチします。
 
○IncludeSubdirectoriesプロパティをtureにすると、サブフォルダも監視対象となります。
 
○EnableRaisingEventsプロパティをtrueに設定すると監視処理が開始されます。監視が不要な場合には、一時的にこのプロパティをfalseに設定すればよいです。
 
イベントおよびイベントの発生するタイミングは次の通りです。
 
OnCreated ファイルまたはディレクトリが作成されたとき 
OnDeleted ファイルまたはディレクトリが削除されたとき 
OnRenamed ファイルまたはディレクトリの名前が変更されたとき 
OnChanged ・サイズ・属性・最終書き込み日時・最終アクセス日時・セキュリティ設定 以下のいずれかが変更されたとき
 
それでは、例を一つs:\BlogTestフォルダ以下で、拡張子がtxtのファイルの作成、削除、名前の変更、LastWrite時刻とLastAccess時刻の変更を監視するようにしてみます。
 
 
open System.IO
let fsw = new System.IO.FileSystemWatcher() 
 
fsw.Path <- @"s:\BlogTest" 
fsw.IncludeSubdirectories <- true 
 
fsw.NotifyFilter <- NotifyFilters.LastAccess ||| NotifyFilters.LastWrite 
                    ||| NotifyFilters.FileName
 
//拡張子がtxtのものだけ監視する
fsw.Filter <- "*.txt"
 
[fsw.Changed ; fsw.Created ;fsw.Deleted]
|>  List.map (Observable.add (fun (e:FileSystemEventArgs) -> printfn "%A" e.ChangeType))
|> ignore
 
fsw.Renamed.Add(fun e -> printfn "%A renamed to %A" e.OldFullPath e.FullPath)
fsw.EnableRaisingEvents <- true
 
(実行結果例)名前を変更した場合
"s:\BlogTest\SF1\SF1SF1\SF1SF1.txt" renamed to "s:\BlogTest\SF1\SF1SF1\SF1SF11.txt"
 
なお組み合わせによっては一つのファイル操作で複数のイベントが発火される場合がありますので、注意が必要です。
 
 
FileSystemEventArgs についてはhttp://msdn.microsoft.com/ja-jp/library/system.io.filesystemeventargs(VS.80).aspxを参照ください。

なお2010/7/23までの目次はこちらにあります。

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。