首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的文件系统监视器

C#中的文件系统监视器
EN

Stack Overflow用户
提问于 2011-07-13 21:32:52
回答 4查看 788关注 0票数 1

目前,我有一个Windows服务,它不断地监控4个文件夹。我使用过FileSystemWatchers来监控文件夹。

但每次添加新文件夹时,我都必须卸载该服务,添加一个新的filesystemwatcher,然后安装该服务。

我正在考虑使它成为动态的或数据库驱动的,这样我就不必在每次程序需要监控新文件夹时卸载并重新安装该服务。

我如何才能做到这一点?

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-13 22:06:44

这里有一个使用XML和Linq2XML的演示,并检查配置文件的更改:

代码语言:javascript
复制
class Program
{
    static List<FileSystemWatcher> _watchers = new List<FileSystemWatcher>();
    static bool _shouldReload = false;

    static void WaitReady(string fileName)
    {
        while (true)
        {
            try
            {
                using (Stream stream = System.IO.File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    if (stream != null)
                    {
                        System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} ready.", fileName));
                        break;
                    }
                }
            }
            catch (FileNotFoundException ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", fileName, ex.Message));
            }
            catch (IOException ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", fileName, ex.Message));
            }
            catch (UnauthorizedAccessException ex)
            {
                System.Diagnostics.Trace.WriteLine(string.Format("Output file {0} not yet ready ({1})", fileName, ex.Message));
            }
            Thread.Sleep(500);
        }
    }

    static void Main(string[] args)
    {
        var configWatcher = new FileSystemWatcher(Path.GetDirectoryName(Path.GetFullPath("config.xml")), "config.xml");
        configWatcher.Changed += (o, e) =>
        {
            lock (_watchers)
            {
                _watchers.ForEach(w => { w.EnableRaisingEvents = false; w.Dispose(); });
                _watchers.Clear();
            }

            _shouldReload = true;
        };

        configWatcher.EnableRaisingEvents = true;

        Thread t = new Thread((ThreadStart)(() => {
            while (true)
            {
                Thread.Sleep(5000); // reload only every five seconds (safety measure)
                if (_shouldReload)
                {
                    _shouldReload = false;
                    Console.WriteLine("Reloading configuration.");
                    WaitReady(Path.GetFullPath("config.xml"));
                    loadConfigAndRun();
                }
            }
        }));

        t.IsBackground = true;
        t.Start();

        loadConfigAndRun();

        Console.ReadLine();
    }

    static void loadConfigAndRun()
    {
        var config = XElement.Load("config.xml").Elements();
        var paths = from watcher in config select watcher.Attribute("Folder").Value;

        foreach (var path in paths)
        {
            var watcher = new FileSystemWatcher(path);
            watcher.Created += new FileSystemEventHandler(watcher_Changed);
            watcher.Changed += new FileSystemEventHandler(watcher_Changed);
            watcher.Deleted += new FileSystemEventHandler(watcher_Changed);
            watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
            watcher.EnableRaisingEvents = true;
            _watchers.Add(watcher);
        }
    }

    static void toggleWatcher(string path)
    {
        var watcher = _watchers.FirstOrDefault(w => w.Path == path);

        if (watcher != null)
        {
            watcher.EnableRaisingEvents = !watcher.EnableRaisingEvents;
        }
    }

    static void watcher_Renamed(object sender, RenamedEventArgs e)
    {
        var watcher = sender as FileSystemWatcher;

        Console.WriteLine("Something renamed in " + watcher.Path);
    }

    static void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        var watcher = sender as FileSystemWatcher;

        Console.WriteLine("Something changed in " + watcher.Path);
    }
}

这是config.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<Watchers>
  <Watcher Folder="d:\ktm"></Watcher>
  <Watcher Folder="c:\windows"></Watcher>
</Watchers>
票数 0
EN

Stack Overflow用户

发布于 2011-07-13 21:34:35

您可以使用XML配置文件,应用程序定期读取该文件并缓存新文件夹。这些将放在app.settings文件中。

代码语言:javascript
复制
<configuration>
    <appSettings>
        <add key = "FolderToWatch" value = "C:\SomeFolder\" />
        <add key = "FolderToWatch" value = "C:\SomeFolder\AnotherOne\" />
        <add key = "FolderToWatch" value = "D:\LastOne\" />
    </appSettings>
</configuration>
票数 3
EN

Stack Overflow用户

发布于 2011-07-13 21:34:56

使用配置文件添加新位置。然后,只要将新位置添加到配置文件中,就需要重新启动该服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6679746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档