|
■No12573 (魔界の仮面弁士 さん) に返信
> 「プロセス数」の話ですか?
> 「スレッド数」の話ですか?
>
> # 1 つのプロセスから、複数のスレッドを立ち上げて監視するのか、
> # それとも、複数のプロセスを使って監視させるのか…。
すいません、1プロセスnスレッドでした。
やっとスレッドによる監視ができました。
ソースを一部略(報告メソッド)しますが、下記のようになりました。
これで、正常動作できました。
皆様、ありがとうございました☆
///////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Text;
/*
* スレッドを用いてフォルダ監視を行ってみる
*/
namespace TEST {
class Program {
// メイン
static int Main(string[] args) {
// 親監視フォルダより、各監視対象フォルダ毎にスレッド実行
foreach (string stDirPath in System.IO.Directory.GetDirectories(@"C:\TEST\", "*")) {
KansiThreadinfo info = new KansiThreadinfo(stDirPath);
System.Threading.Thread tKANSI =
new System.Threading.Thread(
new System.Threading.ThreadStart(info.tKANSI));
tKANSI.Start();
}
return 0;
}
}
/*
* 監視を行うクラス(監視のスレッド)
*/
class KansiThreadinfo {
// スレッドに渡す値
string wkKansipath;
// インストラクタ
public KansiThreadinfo(string kansipath) {
this.wkKansipath = kansipath;
}
/*
* 監視スレッド
*/
public void tKANSI() {
try {
System.IO.FileSystemWatcher watcher =
new System.IO.FileSystemWatcher();
// 監視するディレクトリを設定
watcher.Path = wkKansipath;
// ファイル名とディレクトリ名と最終書き込む日時の変更を監視
watcher.NotifyFilter =
System.IO.NotifyFilters.FileName
| System.IO.NotifyFilters.DirectoryName
| System.IO.NotifyFilters.LastWrite;
// サブディレクトリ監視設定
watcher.IncludeSubdirectories = false; // 監視しない
// 必要に応じてバッファサイズを変更
//watcher.InternalBufferSize = 4096
// 同期的に監視を開始する
System.IO.WaitForChangedResult changedResult =
watcher.WaitForChanged(System.IO.WatcherChangeTypes.All);
// タイムアウトチェック
if (changedResult.TimedOut) {
// タイムアウトしても再帰(要検討)
tKANSI();
}
// フォルダ配下の変更イベント取得
switch (changedResult.ChangeType) {
case System.IO.WatcherChangeTypes.Created:
if (changedResult.Name == "CHECK.DAT") {
// 報告処理
HokoThreadinfo hokoinfo = new HokoThreadinfo(wkKansipath);
// tHOKOメソッドを別のスレッドで実施する
System.Threading.Thread tHOKO =
new System.Threading.Thread(
new System.Threading.ThreadStart(hokoinfo.tHOKO));
tHOKO.Start();
tHOKO.Join();
}
break;
case System.IO.WatcherChangeTypes.Changed:
break;
case System.IO.WatcherChangeTypes.Deleted:
break;
case System.IO.WatcherChangeTypes.Renamed:
break;
default:
break;
}
// 再帰
tKANSI();
}
catch (Exception e) {
// エラーになっても再帰(要検討)
tKANSI(); // 再帰
}
}
}
/*
* 報告処理を行うクラス(報告処理のスレッド)
*/
class HokoThreadinfo {
// スレッドに渡す値
string wkKansipath;
// インストラクタ
public HokoThreadinfo(string kansipath) {
this.wkKansipath = kansipath;
}
/*
* 報告メソッド
*/
public void tHOKO() {
・"CHECK.DAT"の同階層フォルダに存在するファイルをZIP圧縮し、ZIP出力
・圧縮ファイルの内容一覧ファイルを出力
・"CHECK.DAT"の同階層フォルダに存在するファイルをすべて削除
}
}
}
|