青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++分析研究  
C++
日歷
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
統計
  • 隨筆 - 92
  • 文章 - 4
  • 評論 - 4
  • 引用 - 0

導航

常用鏈接

留言簿

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 
  本文主要描述如何通過C#實現實時監控文件目錄下的變化,包括文件和目錄的添加,刪除,修改和重命名等操作。
 
   首先,我們需要對。net提供的FileSystemWatcher類有所了解。我有些懶,找了MSDN對該類的描述。
 
   FileSystemWatcher類偵聽文件系統更改通知,并在目錄或目錄中的文件發生更改時引發事件。
 
   使用 FileSystemWatcher 監視指定目錄中的更改。可監視指定目錄中的文件或子目錄的更改。可以創建一個組件來監視本地計算機、網絡驅動器或遠程計算機上的文件。
 
   若要監視所有文件中的更改,請將 Filter 屬性設置為空字符串 ("") 或使用通配符("*.*")。若要監視特定的文件,請將 Filter 屬性設置為該文件名。例如,若要監視文件 MyDoc.txt 中的更改,請將 Filter 屬性設置為"MyDoc.txt".也可以監視特定類型文件中的更改。例如,若要監視文本文件中的更改,請將 Filter 屬性設置為"*.txt". www.yz-jx.com 
 
   可監視目錄或文件中的若干種更改。例如,可監視文件或目錄的 Attributes、LastWrite 日期和時間或 Size 方面的更改。通過將 NotifyFilter 屬性設置為 NotifyFilters 值之一來達到此目的。有關可監視的更改類型的更多信息,請參見 NotifyFilters. www.lefeng123.com
 
   可監視文件或目錄的重命名、刪除或創建。例如,若要監視文本文件的重命名,請將 Filter 屬性設置為"*.txt",并使用為其參數指定的 Renamed 來調用 WaitForChanged 方法。
 
   Windows 操作系統在 FileSystemWatcher 創建的緩沖區中通知組件文件發生更改。如果短時間內有很多更改,則緩沖區可能會溢出。這將導致組件失去對目錄更改的跟蹤,并且它將只提供一般性通知。使用 InternalBufferSize 屬性來增加緩沖區大小的開銷較大,因為它來自無法換出到磁盤的非頁面內存,所以應確保緩沖區大小適中(盡量小,但也要有足夠大小以便不會丟失任何文件更改事件)。若要避免緩沖區溢出,請使用 NotifyFilter 和 IncludeSubdirectories 屬性,以便可以篩選掉不想要的更改通知 www.yztrans.com
 
   使用 FileSystemWatcher 類時,請注意以下事項。
 
   1) 對包括隱藏文件(夾)在內的所有文件(夾)進行監控。
 
   2) 您可以為 InternalBufferSize 屬性(用于監視網絡上的目錄)設置的最大大小為 64 KB.
 
   FileSystemWatcher的實例監控到文件(夾)的變化后,會觸發相應的事件,其中文件(夾)的添加,刪除和修改會分別觸發Created,Deleted,Changed事件,文件(夾)重命名時觸發OnRenamed事件。
 
   然后,在熟悉了FileSystemWatcher類后,我們開始自己的程序編寫。
 
   實例化FileSystemWatcher類,并傳入需要監控的目錄路徑,以及是否制定監控的文件類型(文章前面有所介紹)。
 
   _watcher = new FileSystemWatcher(_path, _filter);
 
   注冊監聽事件,以及編寫事件觸發后相關的處理邏輯。
 
   _watcher.Created += new FileSystemEventHandler(OnChanged);
 
   _watcher.Changed += new FileSystemEventHandler(OnChanged);
 
   _watcher.Deleted += new FileSystemEventHandler(OnChanged);
 
   _watcher.Renamed += new RenamedEventHandler(OnRenamed);
 
   _watcher.IncludeSubdirectories = true;
 
   _watcher.EnableRaisingEvents = true;
 
   在本程序中,專門定義了一個FileChangeInformation類來記錄文件變化信息,并定義了一個CustomQueue類,該類類似于Queue類,是一個數據先進先出的集合,用來存儲所有的文件變化消息,并提供數據持久化功能。
 
   監控類 - FileWatcher,代碼如下:
 
   復制代碼
 
   1 /// <summary>
 
   2 /// 文件監控類,用于監控指定目錄下文件以及文件夾的變化
 
   3 /// </summary>
 
   4 public class FileWatcher
 
   5 {
 
   6 private FileSystemWatcher _watcher = null;
 
   7 private string _path = string.Empty;
 
   8 private string _filter = string.Empty;
 
   9 private bool _isWatch = false;
 
   10 private CustomQueue<FileChangeInformation> _queue = null;
 
   11
 
   12 /// <summary>
 
   13 /// 監控是否正在運行
 
   14 /// </summary>
 
   15 public bool IsWatch
 
   16 {
 
   17 get
 
   18 {
 
   19 return _isWatch;
 
   20 }
 
   21 }
 
   22
 
   23 /// <summary>
 
   24 /// 文件變更信息隊列
 
   25 /// </summary>
 
   26 public CustomQueue<FileChangeInformation> FileChangeQueue
 
   27 {
 
   28 get
 
   29 {
 
   30 return _queue;
 
   31 }
 
   32 }
 
   33
 
   34 /// <summary>
 
   35 /// 初始化FileWatcher類
 
   36 /// </summary>
 
   37 /// <param name="path">監控路徑</param>
 
   38 public FileWatcher(string path)
 
   39 {
 
   40 _path = path;
 
   41 _queue = new CustomQueue<FileChangeInformation>();
 
   42 }
 
   43 /// <summary>
 
   44 /// 初始化FileWatcher類,并指定是否持久化文件變更消息
 
   45 /// </summary>
 
   46 /// <param name="path">監控路徑</param>
 
   47 /// <param name="isPersistence">是否持久化變更消息</param>
 
   48 /// <param name="persistenceFilePath">持久化保存路徑</param>
 
   49 public FileWatcher(string path, bool isPersistence, string persistenceFilePath)
 
   50 {
 
   51 _path = path;
 
   52 _queue = new CustomQueue<FileChangeInformation>(isPersistence, persistenceFilePath);
 
   53 }
 
   54
 
   55 /// <summary>
 
   56 /// 初始化FileWatcher類,并指定是否監控指定類型文件
 
   57 /// </summary>
 
   58 /// <param name="path">監控路徑</param>
 
   59 /// <param name="filter">指定類型文件,格式如:*.txt,*.doc,*.rar</param>
 
   60 public FileWatcher(string path, string filter)
 
   61 {
 
   62 _path = path;
 
   63 _filter = filter;
 
   64 _queue = new CustomQueue<FileChangeInformation>();
 
   65 }
 
   66
 
   67 /// <summary>
 
   68 /// 初始化FileWatcher類,并指定是否監控指定類型文件,是否持久化文件變更消息
 
   69 /// </summary>
 
   70 /// <param name="path">監控路徑</param>
 
   71 /// <param name="filter">指定類型文件,格式如:*.txt,*.doc,*.rar</param>
 
   72 /// <param name="isPersistence">是否持久化變更消息</param>
 
   73 /// <param name="persistenceFilePath">持久化保存路徑</param>
 
   74 public FileWatcher(string path, string filter, bool isPersistence, string persistenceFilePath)
 
   75 {
 
   76 _path = path;
 
   77 _filter = filter;
 
   78 _queue = new CustomQueue<FileChangeInformation>(isPersistence, persistenceFilePath);
 
   79 }
 
   80
 
   81 /// <summary>
 
   82 /// 打開文件監聽器
 
   83 /// </summary>
 
   84 public void Open()
 
   85 {
 
   86 if (!Directory.Exists(_path))
 
   87 {
 
   88 Directory.CreateDirectory(_path);
 
   89 }
 
   90
 
   91 if (string.IsNullOrEmpty(_filter))
 
   92 {
 
   93 _watcher = new FileSystemWatcher(_path);
 
   94 }
 
   95 else
 
   96 {
 
   97 _watcher = new FileSystemWatcher(_path, _filter);
 
   98 }
 
   99 //注冊監聽事件
 
   100 _watcher.Created += new FileSystemEventHandler(OnProcess);
 
   101 _watcher.Changed += new FileSystemEventHandler(OnProcess);
 
   102 _watcher.Deleted += new FileSystemEventHandler(OnProcess);
 
   103 _watcher.Renamed += new RenamedEventHandler(OnFileRenamed);
 
   104 _watcher.IncludeSubdirectories = true;
 
   105 _watcher.EnableRaisingEvents = true;
 
   106 _isWatch = true;
 
   107 }
 
   108
 
   109 /// <summary>
 
   110 /// 關閉監聽器
 
   111 /// </summary>
 
   112 public void Close()
 
   113 {
 
   114 _isWatch = false;
 
   115 _watcher.Created -= new FileSystemEventHandler(OnProcess);
 
   116 _watcher.Changed -= new FileSystemEventHandler(OnProcess);
 
   117 _watcher.Deleted -= new FileSystemEventHandler(OnProcess);
 
   118 _watcher.Renamed -= new RenamedEventHandler(OnFileRenamed);
 
   119 _watcher.EnableRaisingEvents = false;
 
   120 _watcher = null;
 
   121 }
 
   122
 
   123 /// <summary>
 
   124 /// 獲取一條文件變更消息
 
   125 /// </summary>
 
   126 /// <returns></returns>
 
   127 public FileChangeInformation Get()
 
   128 {
 
   129 FileChangeInformation info = null;
 
   130 if (_queue.Count > 0)
 
   131 {
 
   132 lock (_queue)
 
   133 {
 
   134 info = _queue.Dequeue();
 
   135 }
 
   136 }
 
   137 return info;
 
   138 }
 
   139
 
   140 /// <summary>
 
   141 /// 監聽事件觸發的方法
 
   142 /// </summary>
 
   143 /// <param name="sender"></param>
 
   144 /// <param name="e"></param>
 
   145 private void OnProcess(object sender, FileSystemEventArgs e)
 
   146 {
 
   147 try
 
   148 {
 
   149 FileChangeType changeType = FileChangeType.Unknow;
 
   150 if (e.ChangeType == WatcherChangeTypes.Created)
 
   151 {
 
   152 if (File.GetAttributes(e.FullPath) == FileAttributes.Directory)
 
   153 {
 
   154 changeType = FileChangeType.NewFolder;
 
   155 }
 
   156 else
 
   157 {
 
   158 changeType = FileChangeType.NewFile;
 
   159 }
 
   160 }
 
   161 else if (e.ChangeType == WatcherChangeTypes.Changed)
 
   162 {
 
   163 //部分文件創建時同樣觸發文件變化事件,此時記錄變化操作沒有意義
 
   164 //如果
 
   165 if (_queue.SelectAll(
 
   166 delegate(FileChangeInformation fcm)
 
   167 {
 
   168 return fcm.NewPath == e.FullPath && fcm.ChangeType == FileChangeType.Change;
 
   169 })。Count<FileChangeInformation>() > 0)
 
   170 {
 
   171 return;
 
   172 }
 
   173
 
   174 //文件夾的變化,只針對創建,重命名和刪除動作,修改不做任何操作。
 
   175 //因為文件夾下任何變化同樣會觸發文件的修改操作,沒有任何意義。
 
   176 if (File.GetAttributes(e.FullPath) == FileAttributes.Directory)
 
   177 {
 
   178 return;
 
   179 }
 
   180
 
   181 changeType = FileChangeType.Change;
 
   182 }
 
   183 else if (e.ChangeType == WatcherChangeTypes.Deleted)
 
   184 {
 
   185 changeType = FileChangeType.Delete;
 
   186 }
 
   187
 
   188 //創建消息,并壓入隊列中
 
   189 FileChangeInformation info = new FileChangeInformation(Guid.NewGuid()。ToString(), changeType, e.FullPath, e.FullPath, e.Name, e.Name);
 
   190 _queue.Enqueue(info);
 
   191 }
 
   192 catch
 
   193 {
 
   194 Close();
 
   195 }
 
   196 }
 
   197
 
   198 /// <summary>
 
   199 /// 文件或目錄重命名時觸發的事件
 
   200 /// </summary>
 
   201 /// <param name="sender"></param>
 
   202 /// <param name="e"></param>
 
   203 private void OnFileRenamed(object sender, RenamedEventArgs e)
 
   204 {
 
   205 try
 
   206 {
 
   207 //創建消息,并壓入隊列中
 
   208 FileChangeInformation info = new FileChangeInformation(Guid.NewGuid()。ToString(), FileChangeType.Rename, e.OldFullPath, e.FullPath, e.OldName, e.Name);
 
   209 _queue.Enqueue(info);
 
   210 }
 
   211 catch
 
   212 {
 
   213 Close();
 
   214 }
 
   215 }
 
   216 }
 
   復制代碼
 
   最后,功能調用如下:
 
   復制代碼
 
   1 //初始化監控器
 
   2 FileWatcher watcher = new FileWatcher(@"D:\");
 
   3 watcher.Open();
 
   4
 
   5 FileChangeInformation fci = null;
 
   6 //獲取消息
 
   7 while (true)
 
   8 {
 
   9 //如果IsWatch為False,則可能監控內部發生異常終止了監控,需要重新開啟監控
 
   10 if (watcher.IsWatch)
 
   11 {
 
   12 //隊列頂端的變更消息
 
   13 fci = watcher.Get();
 
   14 //處理消息的代碼
 
   15 //Print(fci);
 
   16 }
 
   17 else
 
   18 {
 
   19 watcher.Open();
 
   20 }
 
   21 Thread.Sleep(1000);
 
   22 }
 
   復制代碼
 
   該程序實現了對文件目錄下所有子目錄和子文件的變化進行監控,并可通過FileChangeQueue屬性訪問文件變更消息,同時也可以設置其是否需要將數據持久化到磁盤文件中。
 
 
posted on 2014-02-16 15:26 HAOSOLA 閱讀(442) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
PK10開獎 PK10開獎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区av在线| 亚洲成在人线av| 午夜精品久久久久久久99黑人| 欧美日韩成人综合天天影院| 亚洲网站视频福利| 亚洲一级网站| 一区二区三区亚洲| 国产精品影视天天线| 在线播放日韩欧美| 亚洲国产日韩欧美| 国产精品国产三级国产专区53| 欧美一区二区三区另类| 久久精品视频一| 亚洲美女中文字幕| 亚洲在线网站| 亚洲国产精品一区二区www| 亚洲精品在线三区| 国产视频在线观看一区 | 欧美国产另类| 亚洲欧美在线x视频| 久久国产精品久久国产精品| 亚洲高清电影| 亚洲天堂成人在线观看| 精品电影在线观看| 亚洲精品久久久久久下一站| 国产乱码精品一区二区三区不卡| 农村妇女精品| 欧美调教vk| 久久亚洲综合网| 欧美日韩精品一区二区| 久久久久久九九九九| 欧美激情第二页| 久久本道综合色狠狠五月| 欧美r片在线| 欧美在线观看视频在线| 欧美电影打屁股sp| 欧美专区在线观看一区| 欧美电影电视剧在线观看| 久久激情五月激情| 欧美精品一区二区三区久久久竹菊| 欧美尤物巨大精品爽| 欧美第一黄色网| 久久成人免费网| 欧美激情亚洲激情| 久久午夜精品一区二区| 欧美午夜宅男影院在线观看| 母乳一区在线观看| 国产精品一二一区| 91久久精品日日躁夜夜躁国产| 国产亚洲美州欧州综合国| 亚洲精品日日夜夜| 在线观看日韩av| 亚洲摸下面视频| 一区二区日韩欧美| 麻豆av福利av久久av| 欧美在线亚洲在线| 欧美三级电影精品| 亚洲大胆美女视频| 好看不卡的中文字幕| 亚洲视频播放| 一本色道久久综合精品竹菊| 久久久久久精| 久久se精品一区二区| 国产精品草莓在线免费观看| 亚洲高清久久网| 久久精品国产一区二区三区免费看 | 午夜视频久久久| 亚洲图片欧美一区| 欧美大香线蕉线伊人久久国产精品| 久久午夜影视| 国产欧美日韩一区| 亚洲视频欧美视频| 一本色道久久综合亚洲精品不卡| 久久综合网络一区二区| 久久精品99国产精品| 欧美午夜视频在线观看| 亚洲精品乱码久久久久久蜜桃麻豆 | 一本大道久久a久久精二百| 美女性感视频久久久| 老**午夜毛片一区二区三区| 国产欧美日韩综合一区在线播放| 一区二区三区久久精品| 一本色道久久综合精品竹菊 | 久久不射电影网| 国产精品劲爆视频| 亚洲精品三级| av成人激情| 欧美裸体一区二区三区| 亚洲国产天堂久久国产91| 亚洲国产精品嫩草影院| 久久天堂成人| 美女免费视频一区| 国产视频自拍一区| 欧美一级播放| 久久精品99国产精品酒店日本| 国产精品久久一区主播| 亚洲午夜精品久久久久久app| 在线午夜精品| 欧美视频导航| 一区二区三区欧美成人| 亚洲综合好骚| 国产精品裸体一区二区三区| 亚洲视频在线观看| 亚洲欧美在线视频观看| 国产精品激情电影| 亚洲欧美日韩系列| 久久精品国产亚洲a| 狠狠88综合久久久久综合网| 久久久国产精品一区| 免费欧美在线视频| 亚洲国产高清aⅴ视频| 欧美 日韩 国产一区二区在线视频| 欧美电影在线观看完整版| 亚洲激情在线观看视频免费| 欧美jjzz| 99精品黄色片免费大全| 亚洲专区在线| 国产欧美日韩麻豆91| 久久精品网址| 欧美国产日韩一二三区| 男男成人高潮片免费网站| 亚洲精品色婷婷福利天堂| 欧美精品黄色| 一本久道综合久久精品| 性欧美激情精品| 国产曰批免费观看久久久| 久久免费视频在线| 亚洲韩国青草视频| 亚洲一区二区三区精品动漫| 国产精品综合色区在线观看| 欧美一区二视频在线免费观看| 麻豆精品视频在线观看| 亚洲精品在线观| 欧美午夜国产| 欧美一区二区视频在线观看2020| 免费黄网站欧美| 99综合在线| 国产精品一区二区你懂的| 久久九九久久九九| 亚洲国产精品久久91精品| 亚洲视频在线看| 国产欧美一区二区三区沐欲| 久久亚洲色图| 99精品国产在热久久| 久久久久久香蕉网| 亚洲国产高清aⅴ视频| 欧美日韩精品免费观看| 日韩视频―中文字幕| 欧美在线视频观看| 亚洲精品影视在线观看| 国产精品99免视看9| 久久精品国产久精国产一老狼| 亚洲国产精品第一区二区| 亚洲欧美国产精品va在线观看| 韩日视频一区| 欧美另类一区| 欧美一区二区三区在线观看 | 国产一区二区三区视频在线观看| 可以看av的网站久久看| 一区二区三区欧美在线| 另类av导航| 亚洲欧美国产三级| 亚洲国产福利在线| 国产精品亚洲综合久久| 欧美www视频在线观看| 亚洲欧美日韩爽爽影院| 亚洲国产欧美国产综合一区 | 欧美二区在线看| 午夜精品国产精品大乳美女| 亚洲激情网址| 久久天堂成人| 亚洲一区二区视频在线| 在线看片第一页欧美| 国产精品久久999| 美女主播视频一区| 午夜精品久久久久久久久久久| 亚洲国产成人一区| 久久久久9999亚洲精品| 国产精品99久久不卡二区| 激情成人av| 国产精品毛片a∨一区二区三区|国| 美女成人午夜| 性欧美长视频| 99在线视频精品| 欧美国产亚洲精品久久久8v| 久久激情综合| 亚洲综合色丁香婷婷六月图片| 亚洲黄色影院| 韩日精品视频| 国产精品一区二区久久| 欧美黄在线观看| 亚洲欧美日韩国产| 国产精品毛片一区二区三区 | 伊人久久大香线| 国产精品黄色在线观看| 欧美黄网免费在线观看| 久久网站免费| 欧美专区在线观看一区| 亚洲视频综合| 亚洲免费观看高清完整版在线观看|