在這個過程中,首先使用MyConfig.Load從數據庫中加載系統配置,然後遍 歷所有需要監視的路徑,對其中的每個路徑解析出目錄名和文件名,然後創建一個 FileSystemWatcher對象,設置其Path和Filter屬性,還根據MyConfig中的系統配置來綁定監 視對象的Changed事件,Created事件,Deleted事件和Renamed事件,以實現對文件系統的監 視。這裡綁定事件的代碼使用了C#2.0的匿名委托的語法功能。設置FileSystemWatcher對象 後將該對象添加到文件系統監視器列表myWatchers中。
啟動服務後使用 EventLog.WriteEntry向Windows系統事件日志添加一些日志信息。
這裡使用了一個 WriteFileSystemLog方法,該方法代碼為
private void WriteFileSystemLog (string ObjectName, string EventStyle )
{
System.Data.IDbConnection conn = Util.DBConnection;
if (conn == null)
return;
// 將監視結果添加到數據庫中
using (System.Data.IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "Insert Into FileSystemLog ( RecordID , WatchTime , ObjectName , EventStyle ) Values ( '" + System.Guid.NewGuid ().ToString() + "' , '" + DateTime.Now.ToString("yyyy-MM- dd HH:mm:ss") + "' , ? , '" + EventStyle + "') " ;
System.Data.IDbDataParameter p = cmd.CreateParameter();
p.Value = ObjectName;
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
}
}
該方法參數是記錄的文件或目錄名,以及事件類型,程序首先拼湊出一個 Insert的SQL語句,然後向數據表FileSystemLog添加一條數據。
類型 MyFileSystemWatcherService還重載了ServiceBase的OnStart,OnStop,OnPause, OnContinue等方法來響應外界對服務過程的控制。
OnStart方法的代碼如下,該方法 調用StartFileSystemWatching函數就算完成了啟動服務的操作。
protected override void OnStart(string[] args)
{
this.StartFileSystemWatching();
}
OnStop方法的代碼如下,該方法首先銷毀掉所有正在運行的文件系統監視器 ,然後關閉數據庫連接。
protected override void OnStop()
{
if (myWatchers != null)
{
foreach (System.IO.FileSystemWatcher w in myWatchers)
{
w.EnableRaisingEvents = false;
w.Dispose();
}
myWatchers = null;
}
Util.CloseDBConnection();
base.OnStop();
}