C#编写文件监视服务 – renshou_2003的日志 – 网易博客

C#编写文件监视服务

一、编写操作基础信息的类,主要获得服务运行的根目录和服务配置文件的根目录

1、配置文件的代码

<?xml version=”1.0″ standalone=”yes”?>
<ConfigInfo>
  <ConfigInfo>
    <FileType>*.*</FileType>
    <fileDir>c:</fileDir>
  </ConfigInfo>
</ConfigInfo>

2、基础信息操作类

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.IO;
namespace DBData.Service
{
    /// <summary>
    /// 提供对于基础信息的操作
    /// </summary>
 public class SysBase
 {
       

        #region 获取程序运行的根目录的路径信息和配置文件的路径信息
        /// <summary>
        /// 返回程序运行的根目录
        /// </summary>
        /// <returns>string类型,返回程序运行的根目录的路径(如:c:Programe)</returns>
        public static string GetPath()
        {
            try
            {
                string originPath = System.Windows.Forms.Application.StartupPath;
                string path = originPath + “\”;
                return path;
            }
            catch
            {
                return “”;
            }
        }
        /// <summary>
        /// 返回配置文件的路径
        /// </summary>
        /// <param >配置文件的名称(如:SetUp.xml如果配置文件不是存放在根目录下面,请输入配置文件相对于根目录的路径,如:setUp\SetUp.xml;注意:默认为根目录下面的SetUP.xml)</param>
        /// <returns>string类型,配置文件的路径</returns>
        public static string GetPath(string fileName)
        {
            try
            {
                if (string.IsNullOrEmpty(fileName))
                {
                    fileName = “SetUp.xml”;
                }
                string path = GetPath() + fileName;
                return path;
            }
            catch
            {
                return “”;
            }
        }
        #endregion
        
        #region 获取配置文件的节点信息
        /// <summary>
        /// 获取配置文件中的配置信息
        /// </summary>
        /// <param >配置子节点名称</param>
        /// <param >配置节点名称</param>
        /// <returns>返回(默认配置文件中-根目录下的Setup.xml)配置子节点的信息</returns>
        public static string GetXMLValue(string nodeName,string tableName)
        {
            string path = GetPath(“Setup.xml”);
            return GetXMLValue(nodeName, tableName, path);
        }
        /// <summary>
        /// 获取配置文件中的配置信息
        /// </summary>
        /// <param >配置子节点名称</param>
        /// <param >配置节点名称</param>
        /// <param >配置文件的路径</param>
        /// <returns>返回配置子节点的信息</returns>
        public static string GetXMLValue(string nodeName, string tableName, string path)
        {
            string str = “”;
            DataSet set = new DataSet();
            try
            {
                if (string.IsNullOrEmpty(path) || !File.Exists(path))
                {
                    return “”;
                }
                set.ReadXml(path);
                foreach (DataRow row in set.Tables[tableName].Rows)
                {
                    str = row[nodeName].ToString();
                }
                set.Dispose();
            }
            catch
            {
                set.Dispose();
            }
            return str;
        }
        #endregion

        #region 设置配置文件信息
        /// <summary>
        /// 设置配置文件信息
        /// </summary>
        /// <param >配置节点名称</param>
        /// <param >配置子节点名称</param>
        /// <param >配置子节点的值</param>
        public static void SetXMLValue(string tableName,string nodeName, string value)
        {
            string xmlFile = GetPath(“setup.xml”);
            SetXMLValue(tableName, nodeName, value, xmlFile);
        }
        /// <summary>
        /// 设置配置文件信息
        /// </summary>
        /// <param >配置节点名称</param>
        /// <param >配置子节点名称</param>
        /// <param >配置子节点的值</param>
        /// <param >配置文件的路径</param>
        public static void SetXMLValue(string tableName, string nodeName, string value,string xmlPath)
        {
            string xmlFile = xmlPath;
            DataSet ds_Cadre = new DataSet();
            ds_Cadre.ReadXml(xmlFile, XmlReadMode.Auto);
            try
            {
                if (ds_Cadre.Tables[tableName] == null)
                {
                    DataTable dt = new DataTable();
                    dt.Columns.Add(nodeName);
                    dt.TableName = tableName;
                    DataRow dr = dt.NewRow();
                    dr[0] = value;
                    dt.Rows.Add(dr);
                    ds_Cadre.Tables.Add(dt);
                    ds_Cadre.WriteXml(xmlFile, XmlWriteMode.IgnoreSchema);
                    ds_Cadre.Clear();
                    ds_Cadre.Dispose();
                    return;
                }
                if (ds_Cadre.Tables[tableName].Columns.IndexOf(nodeName) < 0)
                {
                    ds_Cadre.Tables[tableName].Columns.Add(nodeName);
                }
            }
            catch
            {
            }
            foreach (DataRow Row in ds_Cadre.Tables[tableName].Rows)
            {
                try
                {
                    if (Row[nodeName].ToString() != null)
                    {
                        Row[nodeName] = value;
                    }
                }
                catch
                {
                }
            }
            ds_Cadre.WriteXml(xmlFile, XmlWriteMode.IgnoreSchema);
            ds_Cadre.Clear();
            ds_Cadre.Dispose();
        }
        #endregion 设置配置文件信息

       
    }
    /// <summary>
    /// 数据库信息(Struct类型,如:数据库名称、登陆名称的信息)
    /// </summary>
    public struct DBInfo
    {
        private string db_Name;
        private string db_Server;
        private string db_User;
        private string db_Pass;
        /// <summary>
        /// 数据库名称
        /// </summary>
        public string DB_Name
        {
            get
            {
                return db_Name;
            }
            set
            {
                db_Name = value;
            }
        }
        /// <summary>
        /// 数据库服务器地址
        /// </summary>
        public string DB_Server
        {
            get
            {
                return db_Server;
            }
            set
            {
                db_Server = value;
            }
        }
        /// <summary>
        /// 数据库登陆用户名
        /// </summary>
        public string DB_User
        {
            get
            {
                return db_User;
            }
            set
            {
                db_User = value;
            }
        }
        /// <summary>
        /// 数据库登陆密码
        /// </summary>
        public string DB_Pass
        {
            get
            {
                return db_Pass;
            }
            set
            {
                db_Pass = value;
            }
        }
    }
    /// <summary>
    /// 数据库类型枚举
    /// </summary>
    public enum DBType
    {
        /// <summary>
        /// 表示是SQL数据库
        /// </summary>
        SQL,
        /// <summary>
        /// 表示是ACCESS数据库
        /// </summary>
        ACCESS,
        /// <summary>
        /// 表示是Oracle数据库
        /// </summary>
        Oracle,
        /// <summary>
        /// 表示DB2数据库
        /// </summary>
        DB2
    }
}

二、编写日志操作类

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Reflection;
namespace DBData.Service
{
    /// <summary>
    /// 日志操作类
    /// </summary>
 public class Log
 {
        /// <summary>
        /// 写入日志信息
        /// </summary>
        /// <param >日志信息内容</param>
        public static void WriteLog(string Content)
        {
            string path = DBData.Service.SysBase.GetPath() + “Log\” + DateTime.Now.ToString(“yyyy-MM”) + “\”;
            if (!System.IO.Directory.Exists(path))
            {
                System.IO.Directory.CreateDirectory(path);
            }
            FileStream fs = new FileStream(path + DateTime.Now.ToString(“yyyyMMdd”) + “.txt”, FileMode.OpenOrCreate, FileAccess.Write);

            StreamWriter m_streamWriter = new StreamWriter(fs);

            m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);

            m_streamWriter.WriteLine(“[” + DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”) + “]t” + Content);
            m_streamWriter.Flush();

            m_streamWriter.Close();

            fs.Close();
        }
      }
}

三、编写文件监视类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace DBData.FSWatcher
{
    /// <summary>
    /// 文件监视类
    /// </summary>
    public class FSWatcherClass
    {
        /// <summary>
        /// 启动一个文件监视
        /// </summary>
        public static void GetWatcher()
        {
            try
            {
                FileSystemWatcher fsWatcher = new FileSystemWatcher();
                string fileType = “”;
                string fileDir = “”;

                //获取监视文件的类型
                if (string.IsNullOrEmpty(DBData.Service.SysBase.GetXMLValue(“FileType”,”ConfigInfo”)))
                {
                    fileType = “*.*”;
                    DBData.Service.SysBase.SetXMLValue(“ConfigInfo”, “FileType”, fileType);
                }
                else
                {
                    fileType = DBData.Service.SysBase.GetXMLValue(“FileType”,”ConfigInfo”);
                }

                //获取监视的目录
                if (string.IsNullOrEmpty(DBData.Service.SysBase.GetXMLValue(“fileDir”, “ConfigInfo”)))
                {
                    fileDir = “c:”;
                    DBData.Service.SysBase.SetXMLValue(“ConfigInfo”, “fileDir”, fileDir);
                }
                else
                {
                    fileDir = DBData.Service.SysBase.GetXMLValue(“fileDir”, “ConfigInfo”);
                }
                fsWatcher.Filter = fileType;//监视文件类型
                fsWatcher.IncludeSubdirectories = true;//是否监视子目录
                fsWatcher.Path = fileDir;//监视的目录
                fsWatcher.EnableRaisingEvents = true;//是否可用

                //文件变更时触发以下操作
                fsWatcher.Created += new FileSystemEventHandler(fsWatcher_Created);
                fsWatcher.Changed += new FileSystemEventHandler(fsWatcher_Changed);
                fsWatcher.Deleted += new FileSystemEventHandler(fsWatcher_Deleted);
                DBData.Service.Log.WriteLog(“文件监视服务启动成功。”);
            }
            catch(Exception excp)
            {
                DBData.Service.Log.WriteLog(“文件监视服务启动失败(错误位置:” + excp.Message + “),请与系统管理人员联系。”);
            }
        }
        /// <summary>
        /// 文件创建触发
        /// </summary>
        /// <param >Object对象</param>
        /// <param >FileSystemEventArgs对象</param>
        protected static void fsWatcher_Created(object sender, FileSystemEventArgs e)
        {
            string dir=e.FullPath.Remove(e.FullPath.LastIndexOf(“\”));
            DBData.Service.Log.WriteLog(“监视到文件在” + dir + “创建了文件:” + e.Name+”。”);
        }
        /// <summary>
        /// 文件修改触发
        /// </summary>
        /// <param >Object对象</param>
        /// <param >FileSystemEventArgs对象</param>
        protected static void fsWatcher_Changed(object sender, FileSystemEventArgs e)
        {
            string dir = e.FullPath;
            DBData.Service.Log.WriteLog(“监视到”+dir+”被修改。”);
        }
        /// <summary>
        /// 文件删除触发
        /// </summary>
        /// <param >Object对象</param>
        /// <param >FileSystemEventArgs对象</param>
        protected static void fsWatcher_Deleted(object sender, FileSystemEventArgs e)
        {
            string dir = e.FullPath;
            DBData.Service.Log.WriteLog(“监视到” + dir + “被删除。”);
        }
    }
}

四、文件监视服务

创建一个Windows服务,并且为服务添加安装程序

C编写文件监视服务 - renshou_2003的日志 - 网易博客 - 夏 - 夏的世界

对于安装程序的相关设置,请参考相关资料。

服务的代码如下:

namespace FSystemWatcher
{
    partial class FSWatcher : ServiceBase
    {
        public FSWatcher()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            // TODO: 在此处添加代码以启动服务。
            DBData.FSWatcher.FSWatcherClass.GetWatcher();
        }

        protected override void OnStop()
        {
            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
            DBData.Service.Log.WriteLog(“文件监视服务停止。”);
        }
    }
}

五、再文件监视中稍加处理可以用做文件同步

引文来源  C#编写文件监视服务 – renshou_2003的日志 – 网易博客