如何在c#中正确使用FileSystemWatcher——多文件和获取“懒惰”在我身上

本文关键字:获取 懒惰 文件 FileSystemWatcher | 更新日期: 2023-09-27 18:08:19

我想做的是观察目录中添加的新文件夹。

一旦添加了一个文件夹,我就从另一个文件夹复制一个标准目录结构到这个文件夹,然后使用Open Office XML对源文件夹中包含的一个Microsoft Word文档的内容进行搜索和替换。

一切都很好…除了:

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

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

如何在c#中正确使用FileSystemWatcher——多文件和获取“懒惰”在我身上

来自文档:

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

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;
}

实际上,它已经有一段时间的问题了,它只是不幸地停止工作。我所看到的唯一的方法来纠正这个是处理它并重新启动它。

更多信息:FileSystemWatcher停止捕捉事件

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