最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C#如何監(jiān)控選定文件夾中文件的變動情況

 更新時間:2023年12月29日 08:25:41   作者:Dm_dotnet  
這篇文章主要為大家詳細介紹了C#如何監(jiān)控選定文件夾中文件的變動情況,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

前言

有時候我們會有監(jiān)控電腦上某一個文件夾中文件變動情況的需求,在本文中,我也會以一個具體的例子,說明在C#中如何使用FileSystemWatcher類來實現(xiàn)上述需求。

效果

具體實現(xiàn)

如果你對C#如何監(jiān)控選定文件夾中文件的變動情況感興趣,可以繼續(xù)往下閱讀。

界面設計

為了更好的演示效果,我這里winform的界面設計如下:

很簡單,只有一個button與一個richtextbox,button用來指定被監(jiān)控的文件,richtextbox用來輸出一些信息。

全部代碼

namespace FileSystemWatcherDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
?
        private void button1_Click(object sender, EventArgs e)
        {
?
            // 創(chuàng)建一個 FolderBrowserDialog 實例
            FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
?
            // 設置對話框的標題
            folderBrowserDialog.Description = "選擇文件夾";
?
            // 如果用戶點擊了“確定”按鈕
            if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.Text = "";
                // 獲取用戶選擇的文件夾路徑
                string selectedFolder = folderBrowserDialog.SelectedPath;
?
                // 提示被監(jiān)控文件夾路徑
                richTextBox1.Text += $"被監(jiān)控的文件夾為:{selectedFolder}\r\n";
?
                var watcher = new FileSystemWatcher($"{selectedFolder}");
               
                watcher.NotifyFilter = NotifyFilters.Attributes
                                | NotifyFilters.CreationTime
                                | NotifyFilters.DirectoryName
                                | NotifyFilters.FileName
                                | NotifyFilters.LastAccess
                                | NotifyFilters.LastWrite
                                | NotifyFilters.Security
                                | NotifyFilters.Size;
?
                watcher.Changed += OnChanged;
                watcher.Created += OnCreated;
                watcher.Deleted += OnDeleted;
                watcher.Renamed += OnRenamed;
                
                watcher.Filter = "*.txt";
                watcher.IncludeSubdirectories = true;
                watcher.EnableRaisingEvents = true;
            }
            else
            {
                MessageBox.Show("您本次沒有選擇文件夾?。?!");
            }
          
?
           
   
        }
?
        private void AppendMessageToRichTextBox(string message)
        {
            // 在RichTextBox中添加提示信息        
            richTextBox1.Invoke(new Action(() =>
            {
                richTextBox1.AppendText(message + Environment.NewLine);
            }));
        }
?
        private void OnChanged(object sender, FileSystemEventArgs e)
        {
            if (e.ChangeType != WatcherChangeTypes.Changed)
            {
                return;
            }
            AppendMessageToRichTextBox($"Changed: {e.FullPath}");
        }
?
        private void OnCreated(object sender, FileSystemEventArgs e)
        {
            string value = $"Created: {e.FullPath}";
            AppendMessageToRichTextBox($"Created: {e.FullPath}");
        }
?
        private  void OnDeleted(object sender, FileSystemEventArgs e)
        {
            AppendMessageToRichTextBox($"Deleted: {e.FullPath}");
        }
?
        private  void OnRenamed(object sender, RenamedEventArgs e)
        {       
            AppendMessageToRichTextBox($"Renamed:");
            AppendMessageToRichTextBox($"    Old: {e.OldFullPath}");
            AppendMessageToRichTextBox($"    New: {e.FullPath} ");           
        }
     
    }
}

FileSystemWatcher的介紹

看過以上代碼,會發(fā)現(xiàn)核心就是FileSystemWatcher的使用。接下來我將介紹一下C#中的FileSystemWatcher類。

FileSystemWatcher是C#中的一個類,該類可以偵聽文件系統(tǒng)更改通知,并在目錄或目錄中的文件發(fā)生更改時引發(fā)事件。

FileSystemWatcher的構造函數(shù)

該類有三種構造函數(shù),如下所示:

形式含義
FileSystemWatcher()初始化 FileSystemWatcher 類的新實例。
FileSystemWatcher(String)初始化 FileSystemWatcher 類的新實例,給定要監(jiān)視的目錄。
FileSystemWatcher(String, String)初始化 FileSystemWatcher類的新實例,給定要監(jiān)視的目錄和文件類型。
 var watcher = new FileSystemWatcher($"{selectedFolder}");

本文中我選擇的就是第二種構造函數(shù),指定要監(jiān)視的目錄。

FileSystemWatcher的屬性

現(xiàn)在介紹一下在本示例中用到的FileSystemWatcher的屬性,如下所示:

名稱類型含義
EnableRaisingEventsbool設置FileSystemWatcher是否有效
Filterstring設置一個要監(jiān)控的文件的格式
FiltersCollection設置多個要監(jiān)控的文件的格式
IncludeSubdirectoriesbool獲取或設置一個值,該值指示是否應監(jiān)視指定路徑中的子目錄
NotifyFilterNotifyFilters獲取或設置要監(jiān)視的更改的類型
Pathstring獲取或設置要監(jiān)視的目錄的路徑

現(xiàn)在來解釋下所用到的代碼的含義:

watcher.Filter = "*.txt";

表示要監(jiān)控的文件為.txt格式。

 watcher.IncludeSubdirectories = true;

表示指定路徑中的子目錄也要監(jiān)視。

 watcher.EnableRaisingEvents = true;

表示該對象可以觸發(fā)事件,也就是還有效。

 watcher.NotifyFilter = NotifyFilters.Attributes
                                | NotifyFilters.CreationTime
                                | NotifyFilters.DirectoryName
                                | NotifyFilters.FileName
                                | NotifyFilters.LastAccess
                                | NotifyFilters.LastWrite
                                | NotifyFilters.Security
                                | NotifyFilters.Size;

設置要監(jiān)視的更改的類型。NotifyFilter屬性的類型為NotifyFilters枚舉類型。

NotifyFilters枚舉類型:

[System.Flags]
public enum NotifyFilters

指定要在文件或文件夾中監(jiān)視的更改。

此枚舉支持其成員值的按位組合。

該枚舉類型包含的值與含義如下所示:

名稱含義
Attributes文件或文件夾的屬性
CreationTime文件或文件夾的創(chuàng)建時間
DirectoryName目錄名
FileName文件的名稱
LastAccess文件或文件夾上一次打開的日期
LastWrite上一次向文件或文件夾寫入內容的日期
Security文件或文件夾的安全設置
Size文件或文件夾的大小

在這里使用了該枚舉類型的按位組合表示這幾種更改的類型要受到監(jiān)視。

FileSystemWatcher的事件

FileSystemWatcher中的事件如下:

名稱含義
Changed當更改指定 Path 中的文件和目錄時發(fā)生
Created當在指定Path 中創(chuàng)建文件和目錄時發(fā)生
Deleted刪除指定Path中的文件或目錄時發(fā)生
Renamed重命名指定 Path中的文件或目錄時發(fā)生
Error當 FileSystemWatcher 的實例無法繼續(xù)監(jiān)視更改或內部緩沖區(qū)溢出時發(fā)生
                watcher.Changed += OnChanged;
                watcher.Created += OnCreated;
                watcher.Deleted += OnDeleted;
                watcher.Renamed += OnRenamed;

在這里我使用到了Changed、Created、Deleted和Renamed事件。

我將以Changed 事件為例,詳細解釋一下:

 watcher.Changed += OnChanged;

這行代碼的含義。

我們查看FileSystemWatcher的源代碼,Changed事件的代碼如下所示

可知將值賦給了_onChangedHandler,我們再來查看_onChangedHandler的定義:

/// <devdoc>
///    Occurs when a file or directory in the specified <see cref='System.IO.FileSystemWatcher.Path'/> is changed.
/// </devdoc>
public event FileSystemEventHandler? Changed
{
    add
    {
        _onChangedHandler += value;
    }
    remove
    {
        _onChangedHandler -= value;
    }
}

類型為FileSystemEventHandler?與Changed事件一致,再來看看FileSystemEventHandler?的定義:

 public delegate void FileSystemEventHandler(object sender, FileSystemEventArgs e);

發(fā)現(xiàn)是一個參數(shù)類型分別為object、FileSystemEventArgs返回值類型為空的委托類型。

object我們知道,那么FileSystemEventArgs又是什么呢?

查看它的源碼,截取一部分,如下所示:

public class FileSystemEventArgs : EventArgs
{
     private readonly WatcherChangeTypes _changeType;
     private readonly string? _name;
     private readonly string _fullPath;
     /// <devdoc>
///    Gets one of the <see cref='System.IO.WatcherChangeTypes'/> values.
/// </devdoc>
public WatcherChangeTypes ChangeType
{
    get
    {
        return _changeType;
    }
}
?
/// <devdoc>
///    Gets the fully qualified path of the affected file or directory.
/// </devdoc>
public string FullPath
{
    get
    {
        return _fullPath;
    }
}
?
?
/// <devdoc>
///       Gets the name of the affected file or directory.
/// </devdoc>
public string? Name
{
    get
    {
        return _name;
    }
}
 }

發(fā)現(xiàn)FileSystemEventArgs繼承自EventArgs,而EventArgs表示包含事件數(shù)據(jù)的類的基類,因此可以明白FileSystemEventArgs表示為目錄事件:Changed, Created, Deleted提供數(shù)據(jù)的類。

FileSystemEventArgs提供三個數(shù)據(jù)分別為ChangeType、FullPath、Name。

那ChangeType是什么呢?

查看ChangeType的定義:

 //
 // 摘要:
 //     Changes that might occur to a file or directory.
 [Flags]
 public enum WatcherChangeTypes
 {
     //
     // 摘要:
     //     The creation of a file or folder.
     Created = 1,
     //
     // 摘要:
     //     The deletion of a file or folder.
     Deleted = 2,
     //
     // 摘要:
     //     The change of a file or folder. The types of changes include: changes to size,
     //     attributes, security settings, last write, and last access time.
     Changed = 4,
     //
     // 摘要:
     //     The renaming of a file or folder.
     Renamed = 8,
     //
     // 摘要:
     //     The creation, deletion, change, or renaming of a file or folder.
     All = 15
 }

是一個枚舉類型,表示更改的類型。

現(xiàn)在回過頭來看:

watcher.Changed += OnChanged;

OnChanged方法如下:

  private void OnChanged(object sender, FileSystemEventArgs e)
  {
      if (e.ChangeType != WatcherChangeTypes.Changed)
      {
          return;
      }
      AppendMessageToRichTextBox($"Changed: {e.FullPath}");
  }

為什么可以將OnChanged方法訂閱到watcher.Changed事件上呢?

因為OnChanged方法與watcher.Changed事件中的委托類型FileSystemEventHandler的返回類型和簽名是相同的。

OnChanged方法的返回類型與簽名如下:

 private void OnChanged(object sender, FileSystemEventArgs e)

FileSystemEventHandler委托類型的定義如下:

 public delegate void FileSystemEventHandler(object sender, FileSystemEventArgs e);

現(xiàn)在已經(jīng)理解了訂閱事件,那么什么時候觸發(fā)事件呢?

查看FileSystemWatcher的部分源碼:

 /// <devdoc>
 ///    Raises the <see cref='System.IO.FileSystemWatcher.Changed'/> event.
 /// </devdoc>
 protected void OnChanged(FileSystemEventArgs e)
 {
     InvokeOn(e, _onChangedHandler);
 }
 private void InvokeOn(FileSystemEventArgs e, FileSystemEventHandler? handler)
 {
     if (handler != null)
     {
         ISynchronizeInvoke? syncObj = SynchronizingObject;
         if (syncObj != null && syncObj.InvokeRequired)
             syncObj.BeginInvoke(handler, new object[] { this, e });
         else
             handler(this, e);
     }
 }

當發(fā)生相應的改變時,就會調用FileSystemWatcher類的OnChanged方法,從而觸發(fā)事件。

以上就是詳解C#如何監(jiān)控選定文件夾中文件的變動情況的詳細內容,更多關于C#監(jiān)控文件的資料請關注腳本之家其它相關文章!

相關文章

  • C# winform實現(xiàn)登陸次數(shù)限制

    C# winform實現(xiàn)登陸次數(shù)限制

    這篇文章主要介紹了C# winform實現(xiàn)登陸次數(shù)限制,相信大家都遇到過網(wǎng)站在用戶多次輸錯密碼之后會自動把賬戶凍結的情況,這種功能如何實現(xiàn),下面小編為大家分享實現(xiàn)方法
    2016-05-05
  • C#正則表達式(Regex類)用法實例總結

    C#正則表達式(Regex類)用法實例總結

    正則表達式的主要作用是驗證字符串的值是否滿足一定的規(guī)則,在頁面輸入數(shù)據(jù)驗證方面的應用比較多,下面這篇文章主要給大家介紹了關于C#正則表達式(Regex類)用法的相關資料,需要的朋友可以參考下
    2022-08-08
  • C#中怎樣從指定字符串中查找并替換字符串?

    C#中怎樣從指定字符串中查找并替換字符串?

    本篇文章,小編為大家介紹一下,C#中怎樣從指定字符串中查找并替換字符串?有需要的朋友可以參考一下
    2013-04-04
  • C#?變量,常量數(shù)據(jù)類型詳情

    C#?變量,常量數(shù)據(jù)類型詳情

    這篇文章主要介紹了C#?變量,常量數(shù)據(jù)類型詳情,常量是指在程序運行中不能改變的數(shù)據(jù),定義一個常量與定義一個變量過程類似,只是多加一個關鍵詞const
    2022-07-07
  • C#深淺拷貝的深入解析

    C#深淺拷貝的深入解析

    這篇文章主要給大家介紹了關于C#深淺拷貝的深入解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用C#具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • c#編寫webservice服務引用實例分享

    c#編寫webservice服務引用實例分享

    c#編寫webservice服務引用實例分享,大家參考使用吧
    2013-12-12
  • 深入c# GDI+簡單繪圖的具體操作步驟(二)

    深入c# GDI+簡單繪圖的具體操作步驟(二)

    本篇文章是對GDI+簡單繪圖的繪圖知識進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C#中sealed修飾符的具體使用

    C#中sealed修飾符的具體使用

    在 C# 中,sealed?是一個修飾符,用于限制繼承和重寫,本文就來介紹一下具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C#中[]的幾種用法示例代碼

    C#中[]的幾種用法示例代碼

    不像數(shù)學里面有方括號和花括號,在C#語法中”[]”與”{}”有專門的用途,下面這篇文章主要給大家介紹了關于C#中[]的幾種用法,需要的朋友可以參考下
    2023-01-01
  • 如何利用C#打印九九乘法表

    如何利用C#打印九九乘法表

    這篇文章主要給大家介紹了關于如何利用C#打印九九乘法表的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論

金湖县| 军事| 化隆| 紫阳县| 介休市| 高雄市| 越西县| 垣曲县| 凌海市| 武鸣县| 芦溪县| 吉水县| 蓬溪县| 曲周县| 昌邑市| 临沂市| 南木林县| 兴安盟| 内黄县| 河北省| 子长县| 思茅市| 田阳县| 广东省| 新沂市| 汉源县| 潢川县| 阜宁县| 荔波县| 长岛县| 雷山县| 太原市| 巩义市| 锡林郭勒盟| 马鞍山市| 那曲县| 松原市| 额尔古纳市| 大石桥市| 五峰| 乐清市|