XMLFileWatcher






4.70/5 (14投票s)
一个Windows服务,用于监视目录更改,在事件日志中写入有关更改的条目,通过发送邮件将更改通知用户,并将输入的XML文件转换为DataSet。
引言
在阅读MSDN时,我发现了一个关于Windows服务和FileSystemWatcher
的有趣主题。因此,我尝试编写一个Windows服务,该服务可以监视目录更改,在事件日志中写入有关更改的条目,通过发送邮件将更改通知用户,并将输入的XML文件转换为DataSet
。
此服务适用于客户端在服务器上上传文件(例如XML文件)的场景,服务器将负责处理上传的文件并在文件有效的情况下将其更新到数据库中。
构建应用程序
首先创建一个新的Windows服务项目
通过编辑解决方案资源管理器中的service1.cs属性将service1.cs名称更改为XMLWatcher.cs,并在生成的视图代码窗口中将service1更改为XMLWatcher。
此应用程序使用FileSystemWatcher
来观察目录更改,并使用SmtpMail
来发送邮件。要访问FileSystemWatcher
和MailMessage
(在SmtpMail
中),我们需要使用Project->Add Reference将对System.IO
和System.Web.dll的引用添加到此项目中。我们还应该添加对System.Data.dll的引用以访问ADO.NET对象。
将System.IO
、System.Web.Mail
和System.Data.SqlClient
命名空间包含到此项目中。
using System.IO;
using System.Web.Mail;
using System.Data.SqlClient;
现在编写代码以分别在InitializEventLog()
、IntializeFileSystemWatcher()
和InitializeMailServer()
中初始化事件日志、FileSystemWatcher
和邮件服务器,并从OnStart()
中调用它们;
/// <summary>
/// Initialize the Event Log
///
/// </summary>
private void InitializEventLog()
{
//Check whether " XMLWatcherSource " exist or not
if(!System.Diagnostics.EventLog.SourceExists("XMLWatcherSource"))
{
//Create "XMLWatcherSource" and "XMLWatcherLog"
System.Diagnostics.EventLog.CreateEventSource("XMLWatcherSource","XMLWatcherLog");
}
//Create Event Log
el=new EventLog();
//Assign Event Log Name
el.Log="XMLWatcherLog";
//Assign Event Source Name
el.Source="XMLWatcherSource";
}
/// <summary>
/// Initialize File System Watcher
///
/// </summary>
private void IntializeFileSystemWatcher()
{
//Create File System Watcher for XML files
fsWatcher=new System.IO.FileSystemWatcher("c:\\temp","*.xml");
// Add event handlers for new XML files and change of existing XML files.
fsWatcher.Changed += new FileSystemEventHandler(OnXMLFileChanged);
fsWatcher.Created += new FileSystemEventHandler(OnXMLFileCreated);
// Begin watching.
fsWatcher.EnableRaisingEvents = true;
}
/// <summary>
/// Initalize Mail Server
///
/// </summary>
private void InitializeMailServer()
{
mailMsg=new System.Web.Mail.MailMessage();
}
/// <summary>
/// Set things in motion so your service can do its work.
/// </summary>
protected override void OnStart(string[] args)
{
// TODO: Add code here to start your service.
//Initialize Event Log
InitializEventLog();
//Initialize File System Watcher
IntializeFileSystemWatcher();
//Initliaze Mail Server
InitializeMailServer();
}
现在为FileSystemWatcher
提供事件处理程序。当文件更改或创建时,将调用这些事件处理程序。事件处理程序会将条目写入事件日志,并通过发送邮件将更改通知给所需人员,并将XML数据转换为DataSet
。此DataSet
可用于更新数据库。
/// <summary>
/// Event Handler for File Changed
///
</summary>
private void OnXMLFileChanged(object source, FileSystemEventArgs e)
{
//Write entry into the Event Log
el.WriteEntry("XML File :" + e.FullPath + " changed");
//Send mail
SendMail(e.FullPath);
//Get the Dataset from XML
GetDataSetFromXML(e.FullPath);
}
/// <summary>
/// Event Handler for File Created
///
/// </summary>
private void OnXMLFileCreated(object source, FileSystemEventArgs e)
{
//Write entry into the Event Log
el.WriteEntry("XML File :" + e.FullPath + " created");
//Send mail
SendMail(e.FullPath);
//Get the Dataset from XML
GetDataSetFromXML(e.FullPath);
}
/// <summary>
/// Notify the users by sendig mail
///
/// </summary>
private void SendMail(string XMLFileName)
{
string fileName=XMLFileName;
//Message From
mailMsg.From="admin@xxx.com";
//Message To
mailMsg.To="dev@xxx.com";
//Message Subject
mailMsg.Subject="New File Uploaded to the server ";
//Message Body
mailMsg.Body="XML File :" + fileName + " is uploaded ";
//Everything set..now send the mail
SmtpMail.Send(mailMsg);
}
/// <summary>
/// Get Dataset from XML
///
/// </summary>
private DataSet GetDataSetFromXML(string XMLFileName)
{
string uploadedXMLfile = XMLFileName;
//Create the Dataset
DataSet ds = new DataSet();
// Create new FileStream with which to read the schema.
System.IO.FileStream fsReadXml = new System.IO.FileStream
(uploadedXMLfile, System.IO.FileMode.Open);
try
{
ds.ReadXml(fsReadXml);
}
catch (Exception ex)
{
//Write entry into the Event Log
fsReadXml.Close();
el.WriteEntry("Error in readig XML File : "
+ uploadedXMLfile );
}
return ds;
}
我们已经完成了编码。现在需要在服务下安装此服务。要安装此服务,我们需要向此项目添加安装程序。
要将安装程序添加到项目中,请在设计模式下打开XMLWatcher.cs,然后右键单击窗体,然后单击“添加安装程序”。
Visual Studio会将ServiceProcessInsatller1
和ServiceInsatller1
添加到项目中。
右键单击ServiceProcessInsatller1
属性,然后将“帐户”更改为“本地系统”,以避免在安装服务时输入用户名和密码。
现在构建项目。构建成功后,打开Visual Studio .NET 2003命令提示符。使用installutil命令安装服务。
现在,该服务已安装在服务下。要启动服务,请转到“管理工具”->“服务”,然后查找XMLWatcherservice
并启动该服务。
现在该服务已启动并正在运行。现在是测试服务的时候了。
要测试该服务,请在c:\temp中创建一个XML文件。该服务将监视目录更改,并在XMLWatcherLog下的事件日志中写入一个条目。它还将向所需用户发送一封关于目录更改的邮件。
可以进一步扩展此应用程序,以将DataSet
(从GetDataSetFromXML
检索)插入到数据库中。