C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 複数のフォルダ・ファイルの変更を監視したい


(過去ログ 112 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■66389 / inTopicNo.1)  複数のフォルダ・ファイルの変更を監視したい
  
□投稿者/ YY (1回)-(2013/04/19(Fri) 09:09:44)

分類:[ASP.NET (VB)] 

2013/04/19(Fri) 09:13:02 編集(投稿者)


こんにちは、お世話になります。

表題の件について、早速ご質問させていただきます。
(XPpro + vb.net 2008)

参照URL
http://dobon.net/vb/dotnet/file/filesystemwatcher.html

下記のサンプルコードでは、下記の指定パス内のファイルの変更を監視できます。
watcher.Path = "C:\My Documents"

今回は、サンプルコードを利用して、複数のフォルダを監視できるようにしたい。

たとえば下記のフォルダを監視したい場合はサンプルコードをどのように変更すればできるか 。監視したいパス:「C:\」「D:\」「E:\」「F:\」「G:\」 全部で5箇所です。
ご教示のほどよろしくお願いいたします。


サンプルコード -------ここから-----------------------------
Private watcher As System.IO.FileSystemWatcher = Nothing

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
If Not (watcher Is Nothing) Then
Return
End If

watcher = New System.IO.FileSystemWatcher
'監視するディレクトリを指定
watcher.Path = "C:\My Documents"
'最終アクセス日時、最終更新日時、ファイル、フォルダ名の変更を監視する
watcher.NotifyFilter = System.IO.NotifyFilters.LastAccess Or _
System.IO.NotifyFilters.LastWrite Or _
System.IO.NotifyFilters.FileName Or _
System.IO.NotifyFilters.DirectoryName
'すべてのファイルを監視
watcher.Filter = ""
'UIのスレッドにマーシャリングする
'コンソールアプリケーションでの使用では必要ない
watcher.SynchronizingObject = Me

'イベントハンドラの追加
AddHandler watcher.Changed, AddressOf watcher_Changed
AddHandler watcher.Created, AddressOf watcher_Changed
AddHandler watcher.Deleted, AddressOf watcher_Changed
AddHandler watcher.Renamed, AddressOf watcher_Renamed

'監視を開始する
watcher.EnableRaisingEvents = True
Console.WriteLine("監視を開始しました。")
End Sub

'Button2のClickイベントハンドラ
Private Sub Button2_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button2.Click
'監視を終了
watcher.EnableRaisingEvents = False
watcher.Dispose()
watcher = Nothing
Console.WriteLine("監視を終了しました。")
End Sub

'イベントハンドラ
Private Sub watcher_Changed(ByVal source As System.Object, _
ByVal e As System.IO.FileSystemEventArgs)
Select Case e.ChangeType
Case System.IO.WatcherChangeTypes.Changed
Console.WriteLine(("ファイル 「" + e.FullPath + _
"」が変更されました。"))
Case System.IO.WatcherChangeTypes.Created
Console.WriteLine(("ファイル 「" + e.FullPath + _
"」が作成されました。"))
Case System.IO.WatcherChangeTypes.Deleted
Console.WriteLine(("ファイル 「" + e.FullPath + _
"」が削除されました。"))
End Select
End Sub

Private Sub watcher_Renamed(ByVal source As System.Object, _
ByVal e As System.IO.RenamedEventArgs)
Console.WriteLine(("ファイル 「" + e.FullPath + _
"」の名前が変更されました。"))
End Sub
サンプルコード -------ここまで-----------------------------
引用返信 編集キー/
■66392 / inTopicNo.2)  Re[1]: 複数のフォルダ・ファイルの変更を監視したい
□投稿者/ 太郎冠者 (3回)-(2013/04/19(Fri) 11:10:37)
FileSystemWatcher自体には複数のルートフォルダの監視機能は無かったと思います。
なので、監視したいルートフォルダの数だけFileSystemWatcherのインスタンスを用意する必要があります。
引用返信 編集キー/
■66395 / inTopicNo.3)  Re[2]: 複数のフォルダ・ファイルの変更を監視したい
□投稿者/ YY (2回)-(2013/04/19(Fri) 16:24:44)
太郎冠者 様
ご回答どうもありがとうございます。

> FileSystemWatcher自体には複数のルートフォルダの監視機能は無かったと思います。
> なので、監視したいルートフォルダの数だけFileSystemWatcherのインスタンスを用意する必要があります。

下記のように変更してみたが、下記のエラーが出て上手くインスタンスの設定ができない。


サンプルコード -------ここから-----------------------------
Private watcher() As System.IO.FileSystemWatcher = Nothing

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click

dim array(1) as string
array(0) = "E:\"
array(1) = "H:\"

dim i as integer

for i = 0 to 1


watcher(i) = New System.IO.FileSystemWatcher '←この行でエラー

'NullReferenceExceptionはハンドルされませんでした。
オブジェクト参照がオブジェクトインスタンスに設定されていません。



'監視するディレクトリを指定
watcher(i).Path = array(i)
'最終アクセス日時、最終更新日時、ファイル、フォルダ名の変更を監視する
watcher(i).NotifyFilter = System.IO.NotifyFilters.LastAccess Or _
System.IO.NotifyFilters.LastWrite Or _
System.IO.NotifyFilters.FileName Or _
System.IO.NotifyFilters.DirectoryName
'すべてのファイルを監視
watcher(i).Filter = ""
'UIのスレッドにマーシャリングする
'コンソールアプリケーションでの使用では必要ない
'watcher.SynchronizingObject = Me

'イベントハンドラの追加
AddHandler watcher(i).Changed, AddressOf watcher_Changed
AddHandler watcher(i).Created, AddressOf watcher_Changed
AddHandler watcher(i).Deleted, AddressOf watcher_Changed
AddHandler watcher(i).Renamed, AddressOf watcher_Renamed

'監視を開始する
watcher.EnableRaisingEvents = True
Console.WriteLine("監視を開始しました。")

next

End Sub
引用返信 編集キー/
■66397 / inTopicNo.4)  Re[3]: 複数のフォルダ・ファイルの変更を監視したい
□投稿者/ 魔界の仮面弁士 (197回)-(2013/04/19(Fri) 19:06:00)
No66395 (YY さん) に返信
> Private watcher() As System.IO.FileSystemWatcher = Nothing
要素数ゼロの配列を作成していますね。


> dim array(1) as string
要素数 2 の配列を作成していますね。

> array(0) = "E:\"
> array(1) = "H:\"
二個の要素を代入していますね。


> for i = 0 to 1
> watcher(i) = New System.IO.FileSystemWatcher '←この行でエラー
配列が作成されていないからです。まずは要素数を確定させましょう。

> 'NullReferenceExceptionはハンドルされませんでした。
> オブジェクト参照がオブジェクトインスタンスに設定されていません。
配列が Nothing だからです。


管理数が未定の場合は配列を使うのではなく、List(Of )などで管理した方が良いですよ。
引用返信 編集キー/
■66411 / inTopicNo.5)  Re[4]: 複数のフォルダ・ファイルの変更を監視したい
□投稿者/ YY (3回)-(2013/04/22(Mon) 11:49:27)
魔界の仮面弁士 様
ご回答どうもありがとうございます。

>>watcher(i) = New System.IO.FileSystemWatcher '←この行でエラー
> 配列が作成されていないからです。まずは要素数を確定させましょう。
>
>>'NullReferenceExceptionはハンドルされませんでした。
>>オブジェクト参照がオブジェクトインスタンスに設定されていません。
> 配列が Nothing だからです。
>
>

watcher = new system.io.filesystemwatcher(ubound(array)){}
dim j as integer
for j = 0 to ubound(array)
watcher(j) = new system.io.filesystemwatcher
next

上記のように追加することでとりあえずは指定複数のルートフォルダを監視できるようになりました。

> 管理数が未定の場合は配列を使うのではなく、List(Of )などで管理した方が良いですよ。
List(Of )についても、これから調べたいと思いますが、もしよろしいければご教示のほどよろしくお願いいたします。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -