<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      使用C#如何監控選定文件夾中文件的變動情況?

      目錄?

      1、前言

      2、效果

      3、具體實現

      ? 頁面設計

      ? 全部代碼

      ? FileSystemWatcher的介紹

      ? FileSystemWatcher的構造函數

      ? FileSystemWatcher的屬性

      ? FileSystemWatcher的事件

      4、總結

      前言?

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

      效果?

      文件監控效果

      image-20231227100851391

      具體實現?

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

      界面設計

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

      image-20231227101050127

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

      全部代碼

      namespace FileSystemWatcherDemo
      {
          public partial class Form1 : Form
          {
              public Form1()
              {
                  InitializeComponent();
              }
      
              private void button1_Click(object sender, EventArgs e)
              {
      
                  // 創建一個 FolderBrowserDialog 實例
                  FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
      
                  // 設置對話框的標題
                  folderBrowserDialog.Description = "選擇文件夾";
      
                  // 如果用戶點擊了“確定”按鈕
                  if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
                  {
                      richTextBox1.Text = "";
                      // 獲取用戶選擇的文件夾路徑
                      string selectedFolder = folderBrowserDialog.SelectedPath;
      
                      // 提示被監控文件夾路徑
                      richTextBox1.Text += $"被監控的文件夾為:{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的介紹

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

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

      FileSystemWatcher的構造函數

      該類有三種構造函數,如下所示:

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

      本文中我選擇的就是第二種構造函數,指定要監視的目錄。

      FileSystemWatcher的屬性

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

      名稱 類型 含義
      EnableRaisingEvents bool 設置FileSystemWatcher是否有效
      Filter string 設置一個要監控的文件的格式
      Filters Collection 設置多個要監控的文件的格式
      IncludeSubdirectories bool 獲取或設置一個值,該值指示是否應監視指定路徑中的子目錄
      NotifyFilter NotifyFilters 獲取或設置要監視的更改的類型
      Path string 獲取或設置要監視的目錄的路徑

      現在來解釋下所用到的代碼的含義:

      watcher.Filter = "*.txt";
      

      表示要監控的文件為.txt格式。

       watcher.IncludeSubdirectories = true;
      

      表示指定路徑中的子目錄也要監視。

       watcher.EnableRaisingEvents = true;
      

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

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

      設置要監視的更改的類型。NotifyFilter屬性的類型為NotifyFilters枚舉類型。

      NotifyFilters枚舉類型:

      [System.Flags]
      public enum NotifyFilters
      

      指定要在文件或文件夾中監視的更改。

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

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

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

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

      FileSystemWatcher的事件

      FileSystemWatcher中的事件如下:

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

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

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

       watcher.Changed += OnChanged;
      

      這行代碼的含義。

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

      /// <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;
          }
      }
      

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

       // Event handlers
       private FileSystemEventHandler? _onChangedHandler;
      

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

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

      發現是一個參數類型分別為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;
          }
      }
       }
      

      發現FileSystemEventArgs繼承自EventArgs,而EventArgs表示包含事件數據的類的基類,因此可以明白FileSystemEventArgs表示為目錄事件:Changed, Created, Deleted提供數據的類。

      FileSystemEventArgs提供三個數據分別為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
       }
      

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

      現在回過頭來看:

      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);
      

      現在已經理解了訂閱事件,那么什么時候觸發事件呢?

      查看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);
           }
       }
      

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

      總結?

      本文通過一個實例,介紹了如何通過C#中的FileSystemWatcher類實現監控選定的文件夾,希望對你有所幫助。

      posted @ 2023-12-28 17:00  mingupupup  閱讀(2518)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 国产一区二区精品久久岳| 亚洲熟妇自偷自拍另亚洲| 精品女同一区二区三区在线| 四虎成人精品无码| 无码人妻斩一区二区三区| 色五月丁香五月综合五月| 美日韩精品一区二区三区| 国产 麻豆 日韩 欧美 久久| 国产成人一区二区三区免费| 熟女女同亚洲女同中文字幕| 欧洲精品色在线观看| 亚洲欧美日韩成人综合一区| 图片区小说区av区| 亚洲性夜夜天天天| 日韩精品区一区二区三vr| 国产热A欧美热A在线视频| 人妻系列无码专区免费| 久久久精品波多野结衣av| 国产一区二区不卡精品视频| 性欧美VIDEOFREE高清大喷水| 久久亚洲精品中文字幕波多野结衣| 久久精品蜜芽亚洲国产AV| 亚洲一区二区三区自拍偷拍| AV无码免费不卡在线观看| 亚洲免费视频一区二区三区| 精品国产午夜福利理论片| 中文字幕在线精品视频入口一区| 国产AV无码专区亚洲AV漫画| 国产一区国产二区在线视频 | 欧美性猛交xxxx乱大交丰满| 国产精品免费看久久久无码| 日韩精品专区在线影院重磅| 欧美熟妇乱子伦XX视频| 日日躁夜夜躁狠狠久久av| 偷拍一区二区三区在线视频| 国产中文成人精品久久久| 达拉特旗| 综合久久婷婷综合久久| 免费无码又爽又刺激网站| 在线涩涩免费观看国产精品| 人妻在线无码一区二区三区|