要在我的网络应用程序中发送批量电子邮件,我使用filewatcher发送应用程序。
我计划用控制台应用程序而不是Windows服务或调度程序来编写filewatcher。
我已在以下路径中复制了可执行文件快捷方式。
%appdata%\ Microsoft \ Windows \ Start Menu \ Programs
参考: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);
答案 0 :(得分:9)
由于它是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();
}
您还必须了解缓冲区溢出。 FROM MSDN FileSystemWatcher
Windows操作系统会通知组件文件更改 在FileSystemWatcher创建的缓冲区中。 如果有很多 在短时间内发生变化,缓冲区可能会溢出。这导致了 组件忘记跟踪目录中的更改,它只会 提供全面通知。增加缓冲区的大小 InternalBufferSize属性很昂贵,因为它来自 非分页内存,无法换出磁盘,所以保持 缓冲区虽小但足够大,不会错过任何文件更改事件。 要避免缓冲区溢出,请使用NotifyFilter和 IncludeSubdirectories属性,以便您可以过滤掉不需要的更改 通知。