2016-01-20 50 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

相关问题