感谢您提供任何帮助..
我正在尝试编写一个监视本地目录的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);
}
答案 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。