|
■No89640 (774RR さん) に返信
おはようございます。
「SynchronizingObject」というのキーになるのかな。
一応監視するだけのプログラムを書いてみました。
監視解除ボタンを連続で押下した時、
watcher.EnableRaisingEvents = false;
の部分でエラーが発生しました。
「NullReferenceExcption はハンドルされませんでした。」
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
だから監視の状態を判定する変数を作って
監視中なら解除するように設定すると直りました。
エラーが発生した時の処理も考えようと思っています。
フォームを閉じる際にイベントハンドラが喧嘩しないようにする必要があるとありますが、
どの様な処理の時を気を付ければ良いでしょうか?
今のところエラーは発生していないのですが。
よろしくお願いいたします。
namespace FileWatcher
{
public partial class F01_FileUpload : Form
{
//CSVファイルの保管ディレクトリ
string CsvDerectoryPath = @"C:\csvroot";
//ディレクトリの監視
private FileSystemWatcher watcher = null;
//監視状態(0:解除中、1:監視中)
string Status = "";
string Status_0 = "監視解除";
string Status_1 = "監視中";
public F01_FileUpload()
{
InitializeComponent();
}
private void F01_FileUpload_Load(object sender, EventArgs e)
{
if (watcher != null) return;
watcher = new FileSystemWatcher();
//監視するディレクトリを指定
watcher.Path = CsvDerectoryPath;
//最終アクセス日時、最終更新日時、ファイル、フォルダ名の変更を監視する
watcher.NotifyFilter =
(System.IO.NotifyFilters.LastAccess
| System.IO.NotifyFilters.LastWrite
| System.IO.NotifyFilters.FileName
| System.IO.NotifyFilters.DirectoryName);
//すべてのファイルを監視
watcher.Filter = "";
//UIのスレッドにマーシャリングする
watcher.SynchronizingObject = this;
//イベントハンドラの追加
watcher.Changed += new FileSystemEventHandler(watcher_Changed);
watcher.Created += new FileSystemEventHandler(watcher_Changed);
watcher.Deleted += new FileSystemEventHandler(watcher_Changed);
watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
//監視を開始する
watcher.EnableRaisingEvents = true;
Status = "1";
lblStatus.Text = Status_1;
lblStatus.BackColor = Color.LimeGreen;
}
private void btnStart_Click(object sender, EventArgs e)
{
if (Status != "1")
{
//監視を開始する
watcher.EnableRaisingEvents = true;
lblStatus.Text = Status_1;
lblStatus.BackColor = Color.LimeGreen;
}
}
private void btnEnd_Click(object sender, EventArgs e)
{
if (Status != "0")
{
//監視を終了
watcher.EnableRaisingEvents = false;
watcher.Dispose();
watcher = null;
Status = "0";
lblStatus.Text = Status_0;
lblStatus.BackColor = Color.DarkOrange;
}
}
private void btnClose_Click(object sender, EventArgs e)
{
if (Status != "0")
{
//監視を終了
watcher.EnableRaisingEvents = false;
watcher.Dispose();
watcher = null;
}
//アプリケーションを終了する
Application.Exit();
}
//イベントハンドラ
private void watcher_Changed(System.Object source,
System.IO.FileSystemEventArgs e)
{
switch (e.ChangeType)
{
case System.IO.WatcherChangeTypes.Changed:
CmnMsgBox.Show(
"ファイル 「" + e.FullPath + "」が変更されました。", 2);
break;
case System.IO.WatcherChangeTypes.Created:
CmnMsgBox.Show(
"ファイル 「" + e.FullPath + "」が作成されました。", 2);
break;
case System.IO.WatcherChangeTypes.Deleted:
CmnMsgBox.Show(
"ファイル 「" + e.FullPath + "」が削除されました。", 2);
break;
}
}
private void watcher_Renamed(System.Object source,
System.IO.RenamedEventArgs e)
{
CmnMsgBox.Show(
"ファイル 「" + e.FullPath + "」の名前が変更されました。", 2);
}
}
}
|