網站首頁 編程語言 正文
好多時候,我們都需要知道某些目錄下的文件什么時候被修改、刪除過等,如果能用miniFilter驅動過濾來做的話當然是最好不過了,這是內核級別的,當然也比較復雜。如果只是簡單的記錄就沒必要用驅動過濾級別的來做了,用FileSystemWatcher來做就要簡單得多。
FileSystemWatcher組件可以監視文件系統,并在文件系統發生改變時作出反應。FileSystemWatcher 常用于文件系統變更的監控,當被監視的文件夾目錄被創建、修改、重命名或刪除時,會觸發以下事件:
1.Created: 當新建文件或者文件夾
2.Changed:當文件或者文件夾已經完成修改
3.Renamed:當文件或者文件夾完成重命名
4.Deleted:當文件或者文件夾被刪除
5.Error:當變更過程發生錯誤
下面我們一起來完成一個文件監控實例。
一、實例化FileSystemWatcher類,并注冊監聽事件
//創建一個FileSystemWatcher,并設置其屬性
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
//設置監控的路徑
fileSystemWatcher.Path = “監控路徑”;
//是否監控指定路徑中的子目錄
fileSystemWatcher.IncludeSubdirectories = true;
//啟用
fileSystemWatcher.EnableRaisingEvents = true;
//注冊監聽事件,Created、Changed、Deleted三個事件傳遞的參數是一樣的,我們就用同一個方法來處理就可以了
fileSystemWatcher.Changed += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Created += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Deleted += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Renamed += new RenamedEventHandler(FileSystemWatcher_Renamed);
fileSystemWatcher.Error += new ErrorEventHandler(FileSystemWatcher_Error);
二、事件處理
FileSystemEventArgs 對象成員有:Name、OldName、ChangeType、FullPath、OldFullPath等,看名就明白是什么了,這里不做過多解釋。
//創建一個FileSystemWatcher,并設置其屬性
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
//設置監控的路徑
fileSystemWatcher.Path = “監控路徑”;
//是否監控指定路徑中的子目錄
fileSystemWatcher.IncludeSubdirectories = true;
//啟用
fileSystemWatcher.EnableRaisingEvents = true;
//Created、Changed、Deleted三個事件的處理方法
private static void FileSystemWatcher_EventHandler(object sender, FileSystemEventArgs e)
{
Invoke(new Action(new Action(() =>
{
Console.WriteLine(e.Name+e.FullPath);
})));
}
//重命名事件的處理方法
private void FileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
{
Invoke(new Action(new Action(() =>
{
Console.WriteLine(e.OldName+e.Name+e.FullPath);
})));
}
//錯誤事件的處理方法
private void FileSystemWatcher_Error(object sender, ErrorEventArgs e)
{
Invoke(new Action(new Action(() =>
{
Console.WriteLine(e.ToString()));
})));
}
這里需要注意一個問題:因為FileSystemWatcher類本身就是一個多線程的控件,在實例化一個FileSystemWatcher時就自動創建了一個線程,在事件處理的方法中需要使用委托的方式封送到主線程中處理。
//聲明傳遞文件Created、Changed、Deleted對象和委托,用于文件增加、刪除、修改時更新UI界面
private delegate void setLogDelegate(FileSystemEventArgs e);
三、展示監控記錄
監控的記錄可以保存到文件和數據庫中,這里就增加一個listView來展示就好了
代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FileWatcher
{
public partial class Form1 : Form
{
private delegate void renameDelegate(RenamedEventArgs e); //聲明傳遞RenamedEventArgs對象和委托,用于文件Renamed時更新UI界面
private delegate void setLogDelegate(FileSystemEventArgs e); //聲明傳遞文件Created、Changed、Deleted對象和委托,用于文件增加、刪除、修改時更新UI界面
private FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
private ColumnHeader chTime = new ColumnHeader();
private ColumnHeader chEvent = new ColumnHeader();
private ColumnHeader chFile = new ColumnHeader();
private ColumnHeader chPath = new ColumnHeader();
public Form1()
{
InitializeComponent();
chTime.TextAlign = HorizontalAlignment.Center;
chTime.Width = 130;
chTime.Text = "時間";
this.listViewInfo.Columns.Add(chTime);
chEvent.TextAlign = HorizontalAlignment.Center;
chEvent.Width = 80;
chEvent.Text = "事件";
this.listViewInfo.Columns.Add(chEvent);
chFile.Width = 270;
chFile.Text = "文件";
this.listViewInfo.Columns.Add(chFile);
chPath.Width = this.listViewInfo.Width - chTime.Width - chEvent.Width - chFile.Width - 21;
chPath.Text = "位置";
this.listViewInfo.Columns.Add(chPath);
ColumnHeader chEnd = new ColumnHeader();
chEnd.Width = 17;
chEnd.Text = "";
this.listViewInfo.Columns.Add(chEnd);
this.listViewInfo.View = View.Details;
this.listViewInfo.GridLines = true;
fileSystemWatcher.Changed += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Created += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Deleted += new FileSystemEventHandler(FileSystemWatcher_EventHandler);
fileSystemWatcher.Renamed += new RenamedEventHandler(FileSystemWatcher_Renamed);
fileSystemWatcher.Error += new ErrorEventHandler(FileSystemWatcher_Error);
fileSystemWatcher.IncludeSubdirectories = true;
fileSystemWatcher.EnableRaisingEvents = true;
}
#region 文件增加、刪除、修改時被調用的處理方法
private void FileSystemWatcher_EventHandler(object sender, FileSystemEventArgs e)
{
if (listViewInfo.InvokeRequired) //判斷是否跨線程
{
listViewInfo.Invoke(new setLogDelegate(SetLog), new object[] { e });//使用委托將方法封送到UI主線程處理
}
}
private void SetLog(FileSystemEventArgs e)
{
string strLog = "";
switch (e.ChangeType.ToString())
{
case "Created":
strLog = "文件創建";
break;
case "Changed":
strLog = "文件修改";
break;
case "Deleted":
strLog = "文件刪除";
break;
default:
strLog = e.ChangeType.ToString();
break;
}
ListViewItem lvi = new ListViewItem();
lvi.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
lvi.SubItems.Add(strLog);
lvi.SubItems.Add(e.Name);
lvi.SubItems.Add(e.FullPath.Replace(e.Name,""));
listViewInfo.Items.Add(lvi);
}
#endregion
#region 重命名方法
private void FileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
{
if (listViewInfo.InvokeRequired)
{
listViewInfo.Invoke(new renameDelegate(SetRenamedLog), new object[]{e});
}
}
private void SetRenamedLog(RenamedEventArgs e)
{
//listViewInfo.Items.Add(string.Format("重命名:{0} 被換名為:{1}, {2}", e.OldName, e.Name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
ListViewItem lvi = new ListViewItem();
lvi.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
lvi.SubItems.Add("文件重命名");
lvi.SubItems.Add(e.OldName + "被換名為:" + e.Name);
lvi.SubItems.Add(e.FullPath.Replace(e.Name, ""));
listViewInfo.Items.Add(lvi);
}
#endregion
#region 錯誤事件的方法
private void FileSystemWatcher_Error(object sender, ErrorEventArgs e)
{
if (listViewInfo.InvokeRequired) //判斷是否跨線程
{
//使用委托處理
Invoke(new Action(new Action(() =>
{
listViewInfo.Items.Add(string.Format("文件出錯:{0}, {1}", e.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
})));
}
}
#endregion
}
}
原文鏈接:https://blog.csdn.net/xgh815/article/details/126193809
相關推薦
- 2022-03-31 k8s中kubeconfig的配置以及使用詳解_云其它
- 2022-08-19 Python截取字符串的簡單方法實例_python
- 2023-02-07 C#實現自定義屏保的示例代碼_C#教程
- 2022-08-05 Entity?Framework映射TPH、TPT、TPC與繼承類_C#教程
- 2022-09-28 Linux在兩個服務器直接傳文件的操作方法_Linux
- 2023-07-07 git回退到某個提交
- 2022-06-22 如何利用Android仿微博正文鏈接交互效果_Android
- 2022-04-17 python 提取出字符串括號中的內容
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支