该实例实现了对指定文件目录及其子目录下的所有文件进行监测,监测事件包括重命名、内容修改、移动、删除4个事件。知识点还囊括了开机启动、最小化到托盘、激活窗口并前端显示。好了,下面贴代码,有改进的地方希望路过的朋友指正。
1.App.config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--文件夹-->
<add key="fileDire" value=""></add>
<!--开机启动-->
<add key="kjqd" value=""></add>
<!--最小化到托盘-->
<add key="zxhdtp" value=""></add>
<!--监测提示-->
<add key="jcts" value=""></add>
</appSettings>
</configuration>
2.AppConfigManager.cs类文件,代码参照 http://blog.csdn.net/zh275589797/article/details/6256660
3.文件夹监测类代码frmFileScan .cs
public partial class frmFileScan : Form
{
/// <summary>
/// 监听系统文件系统更改通知
/// </summary>
public FileSystemWatcher watcher = new FileSystemWatcher();
/// <summary>
/// 配置文件访问
/// </summary>
AppConfigManager apm = new AppConfigManager();
/// <summary>
/// 构造方法
/// </summary>
public frmFileScan()
{
InitializeComponent();
//是否最小化
this.WindowState = apm.GetAppSetting("zxhdtp") == "true" ? FormWindowState.Minimized : FormWindowState.Normal;
//在指定文件夹更改文件内容或指定文件目录时发生
watcher.Changed += new FileSystemEventHandler(watcher_Changed);
//在指定文件夹创建文件或目录时发生
watcher.Created += new FileSystemEventHandler(watcher_Created);
//在指定文件夹删除文件或目录时发生
watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
//在指定文件夹重命名文件或目录时发生
watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
//当内部缓冲区溢出时发生
watcher.Error += new ErrorEventHandler(watcher_Error);
}
/// <summary>
/// 当内部缓冲区溢出时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void watcher_Error(object sender, ErrorEventArgs e)
{
if (!chkJcts.Checked) return;
this.Invoke(new MethodInvoker(delegate
{
txtLogInfo.SelectionColor = Color.Red;//设置当前插入点的文本颜色
txtLogInfo.AppendText(e.GetException().Message+"\r\n");
}));
}
string strArgsType = "事件类型:";
string strFilePath = "文件路径:";
string strFileName = "文件名称:";
string strFileOldPath = "旧文件路径:";
string strFileOldName = "旧文件名称:";
/// <summary>
/// 重命名文件和目录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void watcher_Renamed(object sender, RenamedEventArgs e)
{
if (!chkJcts.Checked) return;
string strInfo = string.Empty;
strInfo += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
strInfo += strArgsType + e.ChangeType.ToString() + "\r\n";
strInfo += strFilePath + e.FullPath + "\r\n";
strInfo += strFileName + e.Name + "\r\n";
strInfo += strFileOldPath + e.OldFullPath + "\r\n";
strInfo += strFileOldName + e.OldName + "\r\n";
this.Invoke(new MethodInvoker(delegate
{
txtLogInfo.AppendText(strInfo);
}));
}
/// <summary>
/// 删除文件和目录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void watcher_Deleted(object sender, FileSystemEventArgs e)
{
if (!chkJcts.Checked) return;
string strInfo = string.Empty;
strInfo += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
strInfo += strArgsType + e.ChangeType.ToString() + "\r\n";
strInfo += strFilePath + e.FullPath + "\r\n";
strInfo += strFileName + e.Name + "\r\n";
this.Invoke(new MethodInvoker(delegate
{
txtLogInfo.AppendText(strInfo);
}));
}
/// <summary>
/// 创建文件和目录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void watcher_Created(object sender, FileSystemEventArgs e)
{
if (!chkJcts.Checked) return;
string strInfo = string.Empty;
strInfo += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
strInfo += strArgsType + e.ChangeType.ToString() + "\r\n";
strInfo += strFilePath + e.FullPath + "\r\n";
strInfo += strFileName + e.Name + "\r\n";
this.Invoke(new MethodInvoker(delegate
{
txtLogInfo.AppendText(strInfo);
}));
}
/// <summary>
/// 更改文件和目录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void watcher_Changed(object sender, FileSystemEventArgs e)
{
if (!chkJcts.Checked) return;
string strInfo = string.Empty;
strInfo += DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
strInfo += strArgsType + e.ChangeType.ToString() + "\r\n";
strInfo += strFilePath + e.FullPath + "\r\n";
strInfo += strFileName + e.Name + "\r\n";
this.Invoke(new MethodInvoker(delegate
{
txtLogInfo.AppendText(strInfo);
}));
}
/// <summary>
/// 选择文件夹
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnFileSel_Click(object sender, EventArgs e)
{
DialogResult dResult = folderSel.ShowDialog();
if (dResult == DialogResult.OK)
{
txtFileDire.Text = folderSel.SelectedPath;
}
}
/// <summary>
/// 开机自动启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chkKjqd_CheckedChanged(object sender, EventArgs e)
{
if (chkKjqd.Checked)//开机自动启动
{
try
{
RegistryKey runKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
runKey.SetValue("wjjjc.exe", System.Windows.Forms.Application.ExecutablePath);//文件夹监测.exe
runKey.Close();
}
catch (Exception Ex)
{
txtLogInfo.SelectionColor = Color.Red;
txtLogInfo.AppendText(Ex.Message+"\r\n");
return;
}
}
else //不开机自动启动注册表信息删除
{
try
{
RegistryKey software = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
string[] aimnames = software.GetValueNames();
foreach (string aimKey in aimnames)
{
if (aimKey.Equals("wjjjc.exe"))
{
software.DeleteValue("wjjjc.exe");
software.Close();
break;
}
}
}
catch (Exception Ex)
{
txtLogInfo.SelectionColor = Color.Red;
txtLogInfo.AppendText(Ex.Message + "\r\n");
return;
}
}
apm.SetValue("kjqd", chkKjqd.Checked ? "true" : "");
}
/// <summary>
/// 最小化托盘
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chkZxhtp_CheckedChanged(object sender, EventArgs e)
{
if (chkZxhtp.Checked)
{
this.WindowState = FormWindowState.Minimized;
}
else
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
}
apm.SetValue("zxhdtp", chkZxhtp.Checked ? "true" : "");
}
/// <summary>
/// 监测提示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void chkJcts_CheckedChanged(object sender, EventArgs e)
{
apm.SetValue("jcts", chkJcts.Checked ? "true" : "");
}
/// <summary>
/// 开始
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
if (Directory.Exists(txtFileDire.Text.Trim()))
{
txtFileDire.ReadOnly = true;
watcher.Path = txtFileDire.Text.Trim();//设置要监视的目录
watcher.IncludeSubdirectories = true;//监视子目录
watcher.EnableRaisingEvents = true;//启用此控件
btnStart.Enabled = false;
btnFileSel.Enabled = false;
btnStop.Enabled = true;
try
{
//文件夹
apm.SetValue("fileDire", txtFileDire.Text.Trim());
//开机启动
if (chkKjqd.Checked)
{
apm.SetValue("kjqd", "true");
}
else
{
apm.SetValue("kjqd", "");
}
//最小化到托盘
if (chkZxhtp.Checked)
{
apm.SetValue("zxhdtp", "true");
}
else
{
apm.SetValue("zxhdtp", "");
}
//监测提示
if (chkJcts.Checked)
{
apm.SetValue("jcts", "true");
}
else
{
apm.SetValue("jcts", "");
}
}
catch (Exception ex)
{
txtLogInfo.AppendText(ex.Message + "\r\n");
}
}
}
/// <summary>
/// 停止
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStop_Click(object sender, EventArgs e)
{
txtFileDire.ReadOnly = false;
watcher.EnableRaisingEvents = false;
btnStart.Enabled = true;
btnFileSel.Enabled = true;
btnStop.Enabled = false;
}
/// <summary>
/// 关闭
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnClose_Click(object sender, EventArgs e)
{
if (watcher.EnableRaisingEvents)
{
watcher.EnableRaisingEvents = false;
watcher.Dispose();
}
this.Close();
}
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmFileScan_Load(object sender, EventArgs e)
{
try
{
//文件夹
string fileDire = apm.GetAppSetting("fileDire");
if (!string.IsNullOrEmpty(fileDire))
{
txtFileDire.Text = fileDire;
}
//开机启动
string kjqd = apm.GetAppSetting("kjqd");
if (!string.IsNullOrEmpty("kjqd"))
{
chkKjqd.Checked = kjqd.Trim() == "true";
}
//监测提示
string jcts = apm.GetAppSetting("jcts");
if (!string.IsNullOrEmpty(jcts))
{
chkJcts.Checked = jcts.Trim() == "true";
}
//最小化到托盘
string zxhdtp = apm.GetAppSetting("zxhdtp");
if (!string.IsNullOrEmpty(zxhdtp))
{
chkZxhtp.Checked = zxhdtp.Trim() == "true";
}
}
catch (Exception ex)
{
txtLogInfo.AppendText(ex.Message + "\r\n");
}
}
/// <summary>
/// 双击系统托盘ico图标,激活窗口并前端显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
//判断双击左键
if (e.Button == MouseButtons.Left)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
this.Activate();
//this.TopMost = true;//设置为顶层窗口
//this.TopMost = false;//取消顶层窗口
}
}
private void frmFileScan_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Visible=false;
this.ShowInTaskbar = false;
}
}
private void 打开主面板ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
//激活窗口并前端显示
this.Activate();
}
private void 关闭ToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
4.项目启动Program.cs
static class Program
{
public static System.Threading.Mutex Run;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
bool noRun = false;
Run = new System.Threading.Mutex(true, "JCWJ", out noRun);
if (noRun)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmFileScan());
}
else
{
MessageBox.Show("程序已经运行!", "提示");
}
}
}