带控制台应用程序

时间:2016-11-29 06:28:05

标签: c# file-watcher

要在我的网络应用程序中发送批量电子邮件,我使用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);

1 个答案:

答案 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属性,以便您可以过滤掉不需要的更改   通知。