8

要在我的 Web 应用程序中发送批量电子邮件,我使用 filewatcher 来发送应用程序。

我计划用控制台应用程序而不是 Windows 服务或调度程序编写文件观察程序。

我已将可执行文件快捷方式复制到以下路径中。

%appdata%\Microsoft\Windows\开始菜单\程序

参考:https ://superuser.com/questions/948088/how-to-add-exe-to-start-menu-in-windows-10

运行可执行文件后,文件观察器并不总是被观察。在搜索了一些网站后,我发现我们需要添加代码

new System.Threading.AutoResetEvent(false).WaitOne();

这是添加可执行文件并监视文件夹的正确方法吗?

运行控制台应用程序(没有上面的代码)后,文件不会一直被监视吗?

使用文件观察器的正确方法是什么?

FileSystemWatcher watcher = new FileSystemWatcher();
string filePath = ConfigurationManager.AppSettings["documentPath"];
watcher.Path = filePath;
watcher.EnableRaisingEvents = true;
watcher.NotifyFilter = NotifyFilters.FileName; 
watcher.Filter = "*.*";
watcher.Created += new FileSystemEventHandler(OnChanged);
4

1 回答 1

16

由于它是一个Console Application你需要在Main方法中编写一个代码来等待而不是在运行代码后立即关闭。

static void Main()
{
   FileSystemWatcher watcher = new FileSystemWatcher();
   string filePath = ConfigurationManager.AppSettings["documentPath"];
   watcher.Path = filePath;
   watcher.EnableRaisingEvents = true;
   watcher.NotifyFilter = NotifyFilters.FileName;
   watcher.Filter = "*.*";
   watcher.Created += new FileSystemEventHandler(OnChanged);


   // wait - not to end
   new System.Threading.AutoResetEvent(false).WaitOne();
}

如果您想查看需要为观察者对象设置的子root文件夹,您的代码只会跟踪文件夹中的更改。IncludeSubdirectories=true

static void Main(string[] args)
{
   FileSystemWatcher watcher = new FileSystemWatcher();
   string filePath = @"d:\watchDir";
   watcher.Path = filePath;
   watcher.EnableRaisingEvents = true;
   watcher.NotifyFilter = NotifyFilters.FileName;
   watcher.Filter = "*.*";

   // will track changes in sub-folders as well
   watcher.IncludeSubdirectories = true;

   watcher.Created += new FileSystemEventHandler(OnChanged);

   new System.Threading.AutoResetEvent(false).WaitOne();
}

您还必须注意缓冲区溢出。来自 MSDN FileSystemWatcher

Windows 操作系统会通知您的组件有关 FileSystemWatcher 创建的缓冲区中的文件更改。如果短时间内有很多 变化,缓冲区可能会溢出。这会导致组件丢失对目录更改的跟踪,并且它只会提供一揽子通知。使用 InternalBufferSize 属性增加缓冲区的大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请保持缓冲区小而大,以免错过任何文件更改事件。要避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性,以便您可以过滤掉不需要的更改通知。

于 2016-11-29T09:40:46.657 回答