使用File System Watcher

时间:2016-01-20 09:09:53

标签: c# .net timer concurrency filesystemwatcher

我正在使用文件系统观察程序来查看目录并在创建新文件时处理文件。我使用带后台工作程序的计时器来防止并发问题和内存溢出。

这就是我所拥有的

 //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);
            }
        }

代码没有任何问题。但它有时会多次处理文件。我无法确定错误发生的位置。

2 个答案:

答案 0 :(得分:1)

这里似乎没有错误。

来自MSDN article

  

通用文件系统操作可能会引发多个事件。对于   例如,当一个文件从一个目录移动到另一个目录时,有几个   可能会引发OnChanged和一些OnCreated和OnDeleted事件。   移动文件是一个复杂的操作,由多个简单组成   操作,因此提出了多个事件。

答案 1 :(得分:0)

似乎在 bwork_RunWorkerCompleted 内部,您正在从 bworkpendinglist 中输入条目并将其添加到 bworkprocesslist ,但无处可去在代码中,我可以看到您正在从 bworkpendinglist 中删除。

即。将它们添加到 bworkprocesslist 后,您应将其从 bworkpendinglist 中删除。