質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

1回答

14925閲覧

【VB】フォルダ監視ツールをFileSystemWatcherにて作成

hanauta

総合スコア12

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2017/07/13 14:35

編集2017/07/14 01:36

目的
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/14 01:24

「新規作成、変更、削除等1行で判断できるような出力」とはどういう意味でしょうか?Onchangedのselect case を消したい?
hanauta

2017/07/14 01:36

指摘ありがとうございます。情報追加を行いました。
guest

回答1

0

即時バックアップがしたいのであればこんな感じでしょうか。

1.最初に対象ディレクトリの状態をスキャンし、1ファイル毎に状態(ファイル名、長さ、更新日時)をオブジェクト(自作クラス)に保存し、辞書(Dictionary)にファイル名をキーに入れておく。
2.FileSystemWatcherによる監視を開始する。
3.変更イベントが来たら、変更のあったファイル名を一時記憶し、安定するまでThread.SleepまたはTimerを使って1~5秒位待つ。
4.変更のあったファイルの状態(存在、長さ、更新日時)を取得し、1で記憶しておいた内容と比較し、その結果によって以下の処理を行う。

a)辞書に存在しない場合…「新規作成」としてログ記録、ファイルコピー。辞書に追加。
b)ファイルが存在しない場合…「削除」としてログ記録。辞書から削除。
c)更新日時またはサイズが変化している場合…「更新」としてログ記録、ファイルコピー。辞書内容更新。
d)変化がない場合…何もしない
※コピーする際、ファイル使用中の例外が発生したときは、1~5秒位待って再試行する。

取りこぼし防止のため、上記とは別に Timer で1時間に1回位、コピー元とコピー先の内容を比較、同期する処理を入れた方が良いと思います。同期後はディレクトリスキャンをやり直し、辞書を再構築します。常時動作させる場合は Windows サービスにした方が便利です。1秒間に100ファイルとか、ファイル変更が頻発する場合は Sleep を使ったシングルスレッドでの実装ではバックアップが追い付かないので、そのときは Timer を使った非同期マルチスレッド実装を検討してください。Timer および Windows サービス、マルチスレッドを使うときはスレッド間同期(SyncLock、Monitor等)も考慮が必要です。

投稿2017/07/15 09:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問