C# FileSystemWatcher 的简单运用


该实例实现了对指定文件目录及其子目录下的所有文件进行监测,监测事件包括重命名、内容修改、移动、删除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("程序已经运行!", "提示");
            }
        }
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值