• <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>
            C++分析研究  
            C++
            日歷
            <2014年2月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            2324252627281
            2345678
            統(tǒng)計
            • 隨筆 - 92
            • 文章 - 4
            • 評論 - 4
            • 引用 - 0

            導(dǎo)航

            常用鏈接

            留言簿

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

             
              本文主要描述如何通過C#實現(xiàn)實時監(jiān)控文件目錄下的變化,包括文件和目錄的添加,刪除,修改和重命名等操作。
             
               首先,我們需要對。net提供的FileSystemWatcher類有所了解。我有些懶,找了MSDN對該類的描述。
             
               FileSystemWatcher類偵聽文件系統(tǒng)更改通知,并在目錄或目錄中的文件發(fā)生更改時引發(fā)事件。
             
               使用 FileSystemWatcher 監(jiān)視指定目錄中的更改。可監(jiān)視指定目錄中的文件或子目錄的更改。可以創(chuàng)建一個組件來監(jiān)視本地計算機(jī)、網(wǎng)絡(luò)驅(qū)動器或遠(yuǎn)程計算機(jī)上的文件。
             
               若要監(jiān)視所有文件中的更改,請將 Filter 屬性設(shè)置為空字符串 ("") 或使用通配符("*.*")。若要監(jiān)視特定的文件,請將 Filter 屬性設(shè)置為該文件名。例如,若要監(jiān)視文件 MyDoc.txt 中的更改,請將 Filter 屬性設(shè)置為"MyDoc.txt".也可以監(jiān)視特定類型文件中的更改。例如,若要監(jiān)視文本文件中的更改,請將 Filter 屬性設(shè)置為"*.txt". www.yz-jx.com 
             
               可監(jiān)視目錄或文件中的若干種更改。例如,可監(jiān)視文件或目錄的 Attributes、LastWrite 日期和時間或 Size 方面的更改。通過將 NotifyFilter 屬性設(shè)置為 NotifyFilters 值之一來達(dá)到此目的。有關(guān)可監(jiān)視的更改類型的更多信息,請參見 NotifyFilters. www.lefeng123.com
             
               可監(jiān)視文件或目錄的重命名、刪除或創(chuàng)建。例如,若要監(jiān)視文本文件的重命名,請將 Filter 屬性設(shè)置為"*.txt",并使用為其參數(shù)指定的 Renamed 來調(diào)用 WaitForChanged 方法。
             
               Windows 操作系統(tǒng)在 FileSystemWatcher 創(chuàng)建的緩沖區(qū)中通知組件文件發(fā)生更改。如果短時間內(nèi)有很多更改,則緩沖區(qū)可能會溢出。這將導(dǎo)致組件失去對目錄更改的跟蹤,并且它將只提供一般性通知。使用 InternalBufferSize 屬性來增加緩沖區(qū)大小的開銷較大,因為它來自無法換出到磁盤的非頁面內(nèi)存,所以應(yīng)確保緩沖區(qū)大小適中(盡量小,但也要有足夠大小以便不會丟失任何文件更改事件)。若要避免緩沖區(qū)溢出,請使用 NotifyFilter 和 IncludeSubdirectories 屬性,以便可以篩選掉不想要的更改通知 www.yztrans.com
             
               使用 FileSystemWatcher 類時,請注意以下事項。
             
               1) 對包括隱藏文件(夾)在內(nèi)的所有文件(夾)進(jìn)行監(jiān)控。
             
               2) 您可以為 InternalBufferSize 屬性(用于監(jiān)視網(wǎng)絡(luò)上的目錄)設(shè)置的最大大小為 64 KB.
             
               FileSystemWatcher的實例監(jiān)控到文件(夾)的變化后,會觸發(fā)相應(yīng)的事件,其中文件(夾)的添加,刪除和修改會分別觸發(fā)Created,Deleted,Changed事件,文件(夾)重命名時觸發(fā)OnRenamed事件。
             
               然后,在熟悉了FileSystemWatcher類后,我們開始自己的程序編寫。
             
               實例化FileSystemWatcher類,并傳入需要監(jiān)控的目錄路徑,以及是否制定監(jiān)控的文件類型(文章前面有所介紹)。
             
               _watcher = new FileSystemWatcher(_path, _filter);
             
               注冊監(jiān)聽事件,以及編寫事件觸發(fā)后相關(guān)的處理邏輯。
             
               _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類,是一個數(shù)據(jù)先進(jìn)先出的集合,用來存儲所有的文件變化消息,并提供數(shù)據(jù)持久化功能。
             
               監(jiān)控類 - FileWatcher,代碼如下:
             
               復(fù)制代碼
             
               1 /// <summary>
             
               2 /// 文件監(jiān)控類,用于監(jiān)控指定目錄下文件以及文件夾的變化
             
               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 /// 監(jiān)控是否正在運(yùn)行
             
               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">監(jiān)控路徑</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">監(jiān)控路徑</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類,并指定是否監(jiān)控指定類型文件
             
               57 /// </summary>
             
               58 /// <param name="path">監(jiān)控路徑</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類,并指定是否監(jiān)控指定類型文件,是否持久化文件變更消息
             
               69 /// </summary>
             
               70 /// <param name="path">監(jiān)控路徑</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 /// 打開文件監(jiān)聽器
             
               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 //注冊監(jiān)聽事件
             
               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 /// 關(guān)閉監(jiān)聽器
             
               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 /// 監(jiān)聽事件觸發(fā)的方法
             
               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 //部分文件創(chuàng)建時同樣觸發(fā)文件變化事件,此時記錄變化操作沒有意義
             
               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 //文件夾的變化,只針對創(chuàng)建,重命名和刪除動作,修改不做任何操作。
             
               175 //因為文件夾下任何變化同樣會觸發(fā)文件的修改操作,沒有任何意義。
             
               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 //創(chuàng)建消息,并壓入隊列中
             
               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 /// 文件或目錄重命名時觸發(fā)的事件
             
               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 //創(chuàng)建消息,并壓入隊列中
             
               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 }
             
               復(fù)制代碼
             
               最后,功能調(diào)用如下:
             
               復(fù)制代碼
             
               1 //初始化監(jiān)控器
             
               2 FileWatcher watcher = new FileWatcher(@"D:\");
             
               3 watcher.Open();
             
               4
             
               5 FileChangeInformation fci = null;
             
               6 //獲取消息
             
               7 while (true)
             
               8 {
             
               9 //如果IsWatch為False,則可能監(jiān)控內(nèi)部發(fā)生異常終止了監(jiān)控,需要重新開啟監(jiān)控
             
               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 }
             
               復(fù)制代碼
             
               該程序?qū)崿F(xiàn)了對文件目錄下所有子目錄和子文件的變化進(jìn)行監(jiān)控,并可通過FileChangeQueue屬性訪問文件變更消息,同時也可以設(shè)置其是否需要將數(shù)據(jù)持久化到磁盤文件中。
             
             
            posted on 2014-02-16 15:26 HAOSOLA 閱讀(424) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


             
            Copyright © HAOSOLA Powered by: 博客園 模板提供:滬江博客
            PK10開獎 PK10開獎
            国产精品久久影院| 亚洲AV乱码久久精品蜜桃| 亚洲一区二区三区日本久久九| 嫩草影院久久99| 一本色综合久久| 国产精品久久久福利| 久久国产热这里只有精品| 精品综合久久久久久98| 欧美精品一区二区精品久久| 人妻无码久久精品| aaa级精品久久久国产片| 亚洲国产小视频精品久久久三级| 久久久久久久久久久久中文字幕| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久久精品久久久久影院| 伊人色综合久久天天人手人婷| 久久美女网站免费| 欧美噜噜久久久XXX| 中文字幕无码久久人妻| 免费观看久久精彩视频| 欧美黑人激情性久久| 精品综合久久久久久98| 综合久久一区二区三区| 伊人色综合久久天天| 久久国产亚洲精品麻豆| 国内精品久久久人妻中文字幕| 久久人人爽人人爽AV片| 精品综合久久久久久88小说| 久久亚洲精品视频| 久久久久综合网久久| 久久r热这里有精品视频| 亚洲精品乱码久久久久久按摩| 久久这里只精品99re66| 久久久久av无码免费网| 一本一本久久a久久综合精品蜜桃| 看全色黄大色大片免费久久久 | 久久精品国产99久久久| 久久精品国产亚洲av影院| 97久久精品无码一区二区| 久久er99热精品一区二区| 久久99国产精品久久久|