2016-01-20 41 views
0

使用文件系統觀察程序觀察目錄並處理新文件時創建的文件。我使用帶後臺工作的定時器來防止併發問題和內存溢出。在使用文件系統觀察程序時處理文件不止一次

這是我

//creating the watcher 

      watcher = new FileSystemWatcher(); 
      watcher.Path = @"C:\Users\me\Desktop\watch"; 
      watcher.Filter = "*.*"; 
      watcher.Created += new FileSystemEventHandler(copied); 
      watcher.EnableRaisingEvents = true; 



//hooking to creation event 

void copied(object sender, FileSystemEventArgs e) 
     { 
      if (bwork.IsBusy == false) 
      { 
       bworkprocesslist.Add(e.FullPath); 

      } 
      else 
      { 
       bworkpendinglist.Add(e.FullPath); 

      } 


      } 

    //used timer to prevent concurrent access of resources and memory overflow 

private void timer1_Tick(object sender, EventArgs e) 
     { 
      if (bwork.IsBusy==false) 
      { 
       bwork.RunWorkerAsync(); 
      } 

     } 


// Maintaining Lists and removed processed file from the main list 

private void bwork_DoWork(object sender, DoWorkEventArgs e) 
     { 
      List<string> removedfiles = new List<string>(); 
      foreach (string pfile in bworkprocesslist) 
      { 
      process(pfile) //Do processing of pfile 
      removedfiles.Add(pfile); 
      } 
     foreach (string x in removedfiles) 
     { 

      bworkprocesslist.Remove(x); 
     } 


     } 

//Add files from pending list after background worker completion 



void bwork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      foreach (string s in bworkpendinglist) 
      { 
       bworkprocesslist.Add(s); 
       bworkpendinglist.Remove(s); 
      } 
     } 

代碼工作沒有任何問題。但有時候處理一個文件超過once.I當錯誤發生時想不通。

回答

1

它看起來不像這裏有一些錯誤。

MSDN article

常見的文件系統操作可能會引發多個事件。例如,對於 示例,當文件從一個目錄移動到另一個目錄時,可能會引發幾個OnChanged和一些OnCreated和OnDeleted事件。 移動文件是一個複雜的操作,它由多個簡單的操作組成,因此引發了多個事件。

+0

那麼你是否打算在我的程序中扔掉這個功能? – techno

+0

這取決於你的程序。 :)如果蒼蠅監測是核心功能 - 那麼顯然你不能把它扔掉。但是因爲這個事件可以多次提交一個文件 - 你必須以某種方式處理它。可能你必須檢查這個文件是否已經加入到處理列表中,或者檢查是否已經處理過或者類似的東西。在應用程序上下文之外很難提出更多建議。 –

+0

它不是核心功能,但其功能之一。即使文件被處理兩次也沒有損害,因爲它會被替換。但爲了防止浪費的資源和CPU週期,我會檢查文件是否已被添加到清單:) – techno

0

好像裏面bwork_RunWorkerCompleted您從bworkpendinglist採取的條目,並將它們添加到您的bworkprocesslist,但沒有什麼地方在代碼中,我可以看到你從bworkpendinglist移除。

即一旦你將它們添加到您的bworkprocesslist,則應該從bworkpendinglist刪除它們。

+0

請參閱更新。添加bworkpendinglist.Remove(s); – techno

+0

這是否解決了您遇到的問題? –

+0

再次沒有相同的問題。 – techno

相關問題