首页 > 解决方案 > Filewatcher 和队列管理

问题描述

我文件监视一个目录以进行删除、添加和更改。我从加法开始。处理时间迫使我进行队列管理,否则我将跳过目录中添加的大量文件。这是代码: 声明:

static ConcurrentQueue<string> q = new ConcurrentQueue<string>();

然后在 Form_load 中:

Task.Factory.StartNew(filesAdded);

文件观察器功能:

private void fileSystemWatcher1_Created_1(object sender, FileSystemEventArgs e)
    {
        q.Enqueue(e.FullPath);
    }

然后是 filesAdded 函数:

        void filesAdded ()
    {
        bool run = true;
        AppDomain.CurrentDomain.DomainUnload += (s, e) =>
        {
            run = false;
            q.Enqueue("stop");
        };
        while (run)
        {
            string filename;
            if (q.TryDequeue(out filename) && run)
            {
                Globals.getTags(filename);
                Globals.ecritDs(filename, true);
            }
        }
    }

信贷去雷内这里

它工作正常,但我正在努力寻找一种方法来使用相同的机制来修改和删除文件。

 private void fileSystemWatcher1_Deleted(object sender, FileSystemEventArgs e)
    {}
 private void fileSystemWatcher1_Changed(object sender, FileSystemEventArgs e)
    {}

我想在 filesAdded 函数中获取触发器信息(显然需要重命名),但我不知道该怎么做,因为 Enqueue 方法只需要一个参数。任何帮助表示赞赏!

标签: c#winformsqueuefile-watcher

解决方案


感谢pinkfloydx33,我正在使用一个类:

 private class FileWatched
    {
        public string fp { get; set; }
        public string trigger { get; set; }
    }

然后在 filesAdded 循环中:

 while (run)
        {
            if (q.TryDequeue(out fw) && run)
            {
                switch (fw.trigger)
                    {
                    case "created":
                        Globals.getTags(fw.fp);
                        Globals.ecritDs(fw.fp, true);
                        break;
                    case "modified":
                        break;
                    case "deleted":
                        break;
                    }
            }
        }

推荐阅读