1

我在 Windows 服务中有一个 FileSystemWatcher 对象。我将它写在一个控制台应用程序中,使用该应用程序作为我的组件的存根。

我的组件实例化 FileSystemWatcher 并设置为监视映射的驱动器。从测试存根控制台应用程序和可部署的 Windows 服务中,这对我来说非常有用。

我还将 onError 事件与 log4net 连接起来,记录一个致命级别的错误:

public FileSystemWatcher CreateFileWatcher()
    {
        FileSystemWatcher watcher = new FileSystemWatcher();

        try
        {
            log.Info("Configuring DPIFileWatcher");
            watcher.Filter = "*.xml";
            log.Info("DPIFileWatcher Filter set to: *.xml");
            string watcherPath = ConfigurationManager.AppSettings["InoundPath"].ToString();
            watcher.Path = watcherPath;
            log.Info(String.Format("DPIFileWatcher Path set to: {0}", watcherPath)); 

            watcher.Created += new FileSystemEventHandler(DPIWatcher_FileCreated);
            watcher.Changed += new FileSystemEventHandler(DPIWatcher_FileChanged);
            watcher.Error += new ErrorEventHandler(DPIWatcher_Error);
            watcher.EnableRaisingEvents = true;

            log.Info("DPIFileWatcher Configuration Successful.");
        }
        catch(Exception e)
        {
            log.Fatal(String.Format("Failed to configure DPIFileWatcher: {0}", e.Message));
        }

        return watcher;
    }

这是我的错误事件:

    private void DPIWatcher_Error(object source, ErrorEventArgs e)
    {
        log.Fatal(String.Format("FileWatacher error: {0}", e.GetException().Message));
    }

如果我通过拔下网卡来测试网络错误丢失,我会从控制台应用程序中收到以下日志错误:

FATAL   [  12] 2013-02-12 12:14:02,142 SMILLER-E6430 METHOD: DPIWatcher_Error     GenFileWatch.DPIFileWatcher- FileWatacher error: The specified network name is no longer available (C:\Development\GenFileWatch\GenFileWatch\DPIFileWatcher.cs: 447)

但是从 Windows 服务中运行时,此日志错误将不起作用。

有谁知道为什么或如何解决?

4

1 回答 1

0

首先,您的服务是否使用有权访问您尝试监控的目录的帐户运行。99% 的时间,运行“控制台”应用程序和运行“服务”在两个不同的用户上下文下运行。如果该用户上下文无权访问该目录(或 URL 仅表示另一个用户上下文中的某些内容),我认为不会调用 OnError。

FileSystemWatcher是相当不靠谱。它在大多数情况下都有效,但有时无效。它使用底层的原生函数 `` 记录在

当您第一次调用 ReadDirectoryChangesW 时,系统会分配一个缓冲区来存储更改信息。此缓冲区与目录句柄相关联,直到它被关闭并且其大小在其生命周期内不会改变。调用此函数之间发生的目录更改将添加到缓冲区中,然后在下一次调用中返回。如果缓冲区溢出,则丢弃缓冲区的全部内容,lpBytesReturned 参数包含零,ReadDirectoryChangesW 函数失败,错误代码为 ERROR_NOTIFY_ENUM_DIR

于 2013-02-12T22:13:20.690 回答