如何在C#中正确使用FileSystemWatcher - 多个文件并让我“懒惰”

时间:2016-09-21 15:34:09

标签: c# filesystemwatcher

我要做的是查看添加的新文件夹的目录。

添加文件夹后,我将标准目录结构从不同的文件夹复制到此文件夹中,然后使用Open Office XML对源文件中包含的某个Microsoft Word文档的内容执行搜索和替换文件夹。

一切都很好......除了:

1)如果我将多个文件夹复制到“监视”目录,其中一个文件夹将被处理,其他文件夹都不会被处理。此外,在此之后,应用程序“卡住”并需要重新启动才能再次运行。

2)出于某种原因,它偶尔会对我“懒惰”,只是放弃工作。观察控制台窗口,它显示它位于代码的WaitForChanged部分,但没有任何反应。这似乎不一致。

这是代码的FileSystemWatcher部分(不想让你厌烦OOXML和文件夹复制位):

class soClass
{
    private const string strDirectory = @"C:\[DIRECTORY-TO-WATCH\]";
    private static FileSystemWatcher fw = new FileSystemWatcher(strDirectory);
    private static void WatchIt()
    {
        // WHILE TRUE -- JUST MAKES IT RUN OVER AND OVER AGAIN...
        while (true)
        {

            Console.WriteLine("Waiting on file/folder changes...");

            // HANGS HERE ON THE 'REG
            string strName = fw.WaitForChanged(WatcherChangeTypes.Created, -1).Name;

            Console.WriteLine("File/Folder Added!");

            Console.WriteLine("Starting over...");
            Console.WriteLine("--------------------------------------------------------");

        }

    }
}

与往常一样,非常感谢任何帮助。

更新

这是最终的代码,感谢@openshac

class soClass
{

    private const string strDirectory = @"C:\[DIRECTORY-TO-WATCH]";

    private static void Main()
    {
        WatchIt();
    }

    public static void WatchIt()
    {

        FileSystemWatcher fw = new FileSystemWatcher();
        fw.Path = strDirectory;
        fw.Created += new FileSystemEventHandler(OnCreated);
        Console.WriteLine("Waiting on file/folder changes...");

        // BEGIN WATCHING
        fw.EnableRaisingEvents = true;

        // WAIT FOR USER TO QUIT THE PROGRAM
        Console.WriteLine("Press \'q\' to quit the sample.");
        while (Console.Read() != 'q') ;
    }

    private static void OnCreated(object sender, FileSystemEventArgs fileSystemEventArgs)
    {

        Console.WriteLine("File/Folder Added!");

        string strName = fileSystemEventArgs.Name;

        // DO STUFF HERE!!

        Console.WriteLine("Starting over...");
        //rwlock.ExitWriteLock();
        Console.WriteLine("--------------------------------------------------------");

    }
}

在这里也找到了一些帮助: https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

2 个答案:

答案 0 :(得分:2)

来自文件:

  

此方法无限期等待,直到第一次更改发生,然后   回报。

https://msdn.microsoft.com/en-us/library/67220zhk(v=vs.110).aspx

如果您想收听多个事件,请尝试使用OnCreated事件:

    var fw = new FileSystemWatcher();
    fw.EnableRaisingEvents = true;
    fw.Created += OnCreated;
}

private static void OnCreated(object sender, FileSystemEventArgs fileSystemEventArgs)
{
    var name = fileSystemEventArgs.Name;
}

答案 1 :(得分:-1)

实际上,一段时间以来它一直是一个问题,它不幸地停止了工作。我看到的唯一解决方法是处理它并重新启动它。

更多信息:FileSystemWatcher stops catching events

祝你好运。希望有一天他们能解决这个问题。