<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
好多時候,我們都需要知道某些目錄下的檔案什麼時候被修改、刪除過等,如果能用miniFilter驅動過濾來做的話當然是最好不過了,這是核心級別的,當然也比較複雜。如果只是簡單的記錄就沒必要用驅動過濾級別的來做了,用FileSystemWatcher來做就要簡單得多。
FileSystemWatcher元件可以監視檔案系統,並在檔案系統發生改變時作出反應。FileSystemWatcher 常用於檔案系統變更的監控,當被監視的資料夾目錄被建立、修改、重新命名或刪除時,會觸發以下事件:
1.Created: 當新建檔案或者資料夾
2.Changed:當檔案或者資料夾已經完成修改
3.Renamed:當檔案或者資料夾完成重新命名
4.Deleted:當檔案或者資料夾被刪除
5.Error:當變更過程發生錯誤
下面我們一起來完成一個檔案監控範例。
//建立一個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 } }
以上就是C#利用FileSystemWatcher實時監控檔案的增加,修改,重新命名和刪除的詳細內容,更多關於C# FileSystemWatcher監控檔案的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45