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服务,并且为服务添加安装程序
对于安装程序的相关设置,请参考相关资料。
服务的代码如下:
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(“文件监视服务停止。”);
}
}
}
五、再文件监视中稍加处理可以用做文件同步