线程上的FileSystemWatcher

时间:2012-03-29 01:30:32

标签: c# filesystemwatcher

感谢您提供任何帮助..

我正在尝试编写一个监视本地目录的FileWatcher应用程序,并将所有更改复制到另一个本地目录。我在.Net中使用了FileSystemWatcher类,在我的btnStart上单击我运行四个线程,每个线程都有自己的FileSysWatcher实例,观察不同的更改类型。所以我想要找的第一个是创建的事件。

new Thread(Created).Start();

然后我有:

void Created()
{
    FileSystemWatcher Watcher2 = new FileSystemWatcher();

    Watcher2.Path = txtBxDirToWatch.Text;
    Watcher2.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.DirectoryName;

    //watch all files in the path 

    Watcher2.Filter = "*.*";

    //dont watch sub dir as default
    Watcher2.IncludeSubdirectories = false;
    if (chkBxIncSub.Checked)
    {
        Watcher2.IncludeSubdirectories = true;
    }

    Watcher2.Created += new FileSystemEventHandler(OnCreated);
    Watcher2.EnableRaisingEvents = true;
}

我想要做的就是将任何更改复制到硬编码的本地路径,但我无法获得任何结果。这是我处理事件的地方

public static void OnCreated(object source, FileSystemEventArgs e)
{
    //combine new path into a string
    string created = Path.Combine(@"C:\WatcherChanges", e.Name);
    File.Create(created);
}

3 个答案:

答案 0 :(得分:1)

在您的代码线程中完成,然后GC收集并释放Watcher。

请勿将线程用于观察者或“挂起”线程:

new Thread(Created){IsBackground = true}.Start(); 

void Created() 
{ 
  ...

  Thread.CurrentThread.Join();
} 

答案 1 :(得分:0)

在您告诉观察者启用引发事件后,您的线程正在退出。 Create方法中没有任何内容可以保持线程运行。在Create方法结束时,FileSystemWatcher超出范围并且线程退出。它永远不会看到任何事件。

有很多方法可以让线程等待。这是一个简单的。

public class Watcher
{
    private ManualResetEvent resetEvent = new ManualResetEvent(false);

    public ManualResetEvent ResetEvent { get { return resetEvent; }

    void Created()
    {
        FileSystemWatcher Watcher2 = new FileSystemWatcher();

        Watcher2.Path = txtBxDirToWatch.Text;
        Watcher2.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.DirectoryName;

        //watch all files in the path 

        Watcher2.Filter = "*.*";

        //dont watch sub dir as default
        Watcher2.IncludeSubdirectories = false;
        if (chkBxIncSub.Checked)
        {
            Watcher2.IncludeSubdirectories = true;
        }

        Watcher2.Created += new FileSystemEventHandler(OnCreated);
        Watcher2.EnableRaisingEvents = true;

        resetEvent.WaitOne();
    }

然后将调用Thread.Start的方法更改为

Watcher watcher = new Watcher();
new Thread(watcher.Created).Start();

当你想停止观看时

watcher.ResetEvent.Set();

你看过RoboCopy了吗?它会为你做到这一点。

答案 2 :(得分:0)

没有理由在单独的线程中创建观察者。

当您观看的目录上出现某些内容时,他们会在thread pool个帖子上回复您。当他们这样做时 - 你在线程池线程上做你的工作,如果它不是UI相关的。如果是 - 您必须使用control.Invoke进行SynchronizationContext或发送/发送到Gui主题。

是的 - 其他人已经说过 - 不要让你的观察者得到GC。