2016-11-29 191 views
1

要在我的Web應用程序中發送批量電子郵件我正在使用filewatcher發送應用程序。FileSystemWatcher與控制檯應用程序

我已經計劃用控制檯應用程序而不是windows服務或調度程序來編寫filewatcher。

我已經複製了以下路徑中的可執行文件快捷方式。

%APPDATA%\微軟\的Windows \開始菜單\程序

編號:https://superuser.com/questions/948088/how-to-add-exe-to-start-menu-in-windows-10

後運行可執行文件的文件守望者並不總是觀看。 搜索一些網站後,我發現,我們需要添加代碼

new System.Threading.AutoResetEvent(false).WaitOne(); 

這是在可執行文件添加和觀看的文件夾的正確的方法?

運行控制檯應用程序(沒有以上代碼)後,該文件將不會被始終監視?

什麼是使用文件監視器的正確方法?

FileSystemWatcher watcher = new FileSystemWatcher(); 
string filePath = ConfigurationManager.AppSettings["documentPath"]; 
watcher.Path = filePath; 
watcher.EnableRaisingEvents = true; 
watcher.NotifyFilter = NotifyFilters.FileName; 
watcher.Filter = "*.*"; 
watcher.Created += new FileSystemEventHandler(OnChanged); 
+0

開始觀看後,您是否已使程序在'MAIN'方法中等待? –

+0

我在這裏質疑什麼是正確的觀察方法。 是的,我已經等待主要方法。 –

+0

你的代碼似乎是正確的,但你應該知道它只監視文件在'root'中,而不是**文件在'子文件夾中'。 –

回答

4

因爲它是你需要寫在Main方法的代碼等,不屬於運行代碼後立即關閉Console Application

static void Main() 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     string filePath = ConfigurationManager.AppSettings["documentPath"]; 
     watcher.Path = filePath; 
     watcher.EnableRaisingEvents = true; 
     watcher.NotifyFilter = NotifyFilters.FileName; 
     watcher.Filter = "*.*"; 
     watcher.Created += new FileSystemEventHandler(OnChanged); 


     // wait - not to end 
     new System.Threading.AutoResetEvent(false).WaitOne(); 
    } 

你的代碼只,如果你想看着你需要設置IncludeSubdirectories=true爲您守望對象的子文件夾跟蹤在root文件夾的變化,

 static void Main(string[] args) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     string filePath = @"d:\watchDir"; 
     watcher.Path = filePath; 
     watcher.EnableRaisingEvents = true; 
     watcher.NotifyFilter = NotifyFilters.FileName; 
     watcher.Filter = "*.*"; 

     // will track changes in sub-folders as well 
     watcher.IncludeSubdirectories = true; 

     watcher.Created += new FileSystemEventHandler(OnChanged); 

     new System.Threading.AutoResetEvent(false).WaitOne(); 
    } 

您還必須瞭解緩衝區溢出。 FROM MSDN FileSystemWatcher

Windows操作系統會通知你的文件的組成部分由FileSystemWatcher的創造了一個緩衝改變 。 如果短時間內有很多變化,緩衝區溢出。這會導致 組件丟失跟蹤目錄中的更改,並且只會提供 提供一攬子通知。使用 來增加緩衝區的大小InternalBufferSize屬性是昂貴的,因爲它來自 非分頁內存不能換出到磁盤,所以請保持 緩衝區儘可能小但足夠大以便不會錯過任何文件更改事件。 爲避免緩衝區溢出,請使用NotifyFilter和IncludeSubdirectories屬性,以便過濾掉不需要的更改 通知。

+0

我將僅檢查僅添加到特定文件夾的xml文件(這將偶爾發生),並且我已經使用NotifyFilter僅知道文件名,我將僅檢查根文件夾。所以這會導致緩衝區溢出。 –

+0

@JeevaJsb文件多久改變一次?如果它非常頻繁,那麼你必須像上面提到的那樣增加'InternalBufferSize'。 –

+0

謝謝。 : - ).... –