
目的
WindowsServerにて、あるフォルダ以下(C:¥tmpとする)のファイル更新(新規作成、更新、削除)を監視したい。
監視結果はログに出力し、更新があったファイルは別途バックアップフォルダ(C:¥bkupとする)にコピーを行う。
現状
まず、特定のフォルダをFileSystemWatcherにて監視し、ログに出力するところまでをテストしています。
ただ、ログを確認したところどうもイベントの数が多く、正確にファイル更新(新規作成、更新、削除)を判別するのが困難となっています。
これは仕様で仕方ないことなのでしょうか。
できれば新規作成、変更、削除等1行で判断できるような出力をしたいと考えています。
(出力すると同時に、行末の区分を確認しバックアップフォルダへコピーを考えているため)
何か変更すべき点や他に良い方法があれば、ぜひ知恵をお貸し頂きたいです。
※情報追加
指摘頂いた点の追記です。
例えばログファイルではxlsxファイルを編集して上書き保存をした時、合計9つのイベントが出力されていますが、これを一括(一行)で「変更」といったログ出力
を行いたい、という意味となります。
---------ログ出力例---------
※右記載は、実際に行った操作
2017/07/13 9:42:19 File:C:¥Temp¥新しいテキストドキュメント.txt 新規作成 テキスト作成
2017/07/13 9:42:24 File:C:¥Temp¥新規MicrosoftExcelワークシート.xlsx 新規作成 エクセル作成
2017/07/13 9:42:24 File:C:¥Temp¥新規MicrosoftExcelワークシート.xlsx 新規作成
2017/07/13 9:42:24 File:C:¥Temp¥新規MicrosoftExcelワークシート.xlsx 変更
2017/07/13 9:42:24 File:C:¥Temp¥新規MicrosoftExcelワークシート.xlsx 変更
2017/07/13 9:42:24 File:C:¥Temp¥新規MicrosoftExcelワークシート.xlsx 変更
2017/07/13 9:50:47 File:C:¥Temp¥新しいテキストドキュメント.txt 変更 テキスト上書き保存
2017/07/13 9:50:47 File:C:¥Temp¥新しいテキストドキュメント.txt 変更
2017/07/13 9:50:50 File:C:¥Temp¥~$新規MicrosoftExcelワークシート.xlsx 新規作成 エクセル上書き保存
2017/07/13 9:50:50 File:C:¥Temp¥~$新規MicrosoftExcelワークシート.xlsx 変更
2017/07/13 9:50:55 File:C:¥Temp¥1C242000 新規作成
2017/07/13 9:50:55 File:C:¥Temp¥1C242000 変更
2017/07/13 9:50:55 File:C:¥Temp¥1C242000 変更
2017/07/13 9:50:55 File:C:¥Temp¥1C242000 変更
2017/07/13 9:50:55 File:C:¥Temp¥1C242000 変更
2017/07/13 9:50:55 File:C:¥Temp¥91F6A915.tmp 削除
2017/07/13 9:50:57 File:C:¥Temp¥~$新規MicrosoftExcelワークシート.xlsx 削除
VB.NET
1 2Dim few As New System.IO.FileSystemWatcher 3dim cls1 As New Class1 4 5Sub Main() 6 7 cls1.swr = New System.IO.StreamWriter(cls1.logpath, True, System.TextEncoding._ 8 GetEncoding("SHIFT_JIS")) 9 10 '監視対象 11 fsw.Path = "C:¥Temp" 12 fsw.Filter = "*.*" 13 fsw.NotifyFilter = System.IO.NotifyFilters.FileName Or _ 14 System.IO.NotifyFilters.Lastwrite Or _ 15 System.IO.NotifyFilters.DirectoryName 16 fsw.IncludeSubDirectories = False 17 18 AddHandler fsw.Changed, AddressOf OnChanged 19 AddHandler fsw.Created, AddressOf OnChanged 20 AddHandler fsw.Deleted, AddressOf OnChanged 21 22 fsw.EnableRaisinEvents = True 23 24 Console.WriteLine("qで監視終了") 25 While Car(Console.Read()) <> "q"c 26 End While 27 28 cls1.swr.Close() 29 30End Sub 31 32Private Sub OnChanged(Byval sourceAs Object, Byval e As FileSystemEventArgs) 33 34 cls1.time = Date.Now.ToString 35 36 Select Case e.ChangeType 37 Case WatcherChangeType.Created 38 cls1.changetype = "新規作成" 39 Case WatcherChangeType.Changed 40 cls1.changetype = "変更" 41 Case WatcherChangeType.Deleted 42 cls1.changetype = "削除" 43 End Select 44 45 cls1.swr.WtiteLine(cls1.time & " File:" & e.FullPath & " " & cls1.changetype) 46 47End Sub 48