65.9K
CodeProject 正在变化。 阅读更多。
Home

XMLFileWatcher

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (14投票s)

2005年8月8日

CPOL

2分钟阅读

viewsIcon

75653

downloadIcon

606

一个Windows服务,用于监视目录更改,在事件日志中写入有关更改的条目,通过发送邮件将更改通知用户,并将输入的XML文件转换为DataSet。

引言

在阅读MSDN时,我发现了一个关于Windows服务和FileSystemWatcher的有趣主题。因此,我尝试编写一个Windows服务,该服务可以监视目录更改,在事件日志中写入有关更改的条目,通过发送邮件将更改通知用户,并将输入的XML文件转换为DataSet

此服务适用于客户端在服务器上上传文件(例如XML文件)的场景,服务器将负责处理上传的文件并在文件有效的情况下将其更新到数据库中。

构建应用程序

首先创建一个新的Windows服务项目

通过编辑解决方案资源管理器中的service1.cs属性将service1.cs名称更改为XMLWatcher.cs,并在生成的视图代码窗口中将service1更改为XMLWatcher

此应用程序使用FileSystemWatcher来观察目录更改,并使用SmtpMail来发送邮件。要访问FileSystemWatcherMailMessage(在SmtpMail中),我们需要使用Project->Add Reference将对System.IOSystem.Web.dll的引用添加到此项目中。我们还应该添加对System.Data.dll的引用以访问ADO.NET对象。

System.IOSystem.Web.MailSystem.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会将ServiceProcessInsatller1ServiceInsatller1添加到项目中。

右键单击ServiceProcessInsatller1属性,然后将“帐户”更改为“本地系统”,以避免在安装服务时输入用户名和密码。

现在构建项目。构建成功后,打开Visual Studio .NET 2003命令提示符。使用installutil命令安装服务。

现在,该服务已安装在服务下。要启动服务,请转到“管理工具”->“服务”,然后查找XMLWatcherservice并启动该服务。

现在该服务已启动并正在运行。现在是测试服务的时候了。

要测试该服务,请在c:\temp中创建一个XML文件。该服务将监视目录更改,并在XMLWatcherLog下的事件日志中写入一个条目。它还将向所需用户发送一封关于目录更改的邮件。

可以进一步扩展此应用程序,以将DataSet(从GetDataSetFromXML检索)插入到数据库中。

© . All rights reserved.