7

FileSystemWatcher在我的 C# 应用程序(在 Windows 上运行)上使用 a,以便在我的应用程序中更新我当前正在浏览的文件。当我浏览本地目录时效果很好。当文件被重命名、删除或添加时,我会收到通知。但是例如,当我第一次重命名网络驱动器上的文件时,FileSystemWatcher会通知我重命名操作,然后,当我重命名同一文件或另一个文件时,FileSystemWatcher会通知我错误:

the specified server cannot perform the requested operation.

然后 FileSystemWatcher 不会通知我任何事情。

有时我可以在 FileSystemWatcher 不通知我之前重命名两次...

这是我的测试代码:

    static void Main(string[] args)
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = @"N:\prive\defFolder";

        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;

        watcher.Changed += new FileSystemEventHandler(watcher_Changed);
        watcher.Created += new FileSystemEventHandler(watcher_Changed);
        watcher.Deleted += new FileSystemEventHandler(watcher_Changed);
        watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
        watcher.Error += new ErrorEventHandler(watcher_Error);

        watcher.EnableRaisingEvents = true;

        Console.Read();
        watcher.Dispose();
    }

    static void watcher_Error(object sender, ErrorEventArgs e)
    {
        Console.WriteLine("error : " + e.GetException().Message);
    }

    static void watcher_Renamed(object sender, RenamedEventArgs e)
    {
        Console.WriteLine("rename success");
    }

    static void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("change success");
    }
4

2 回答 2

7

首先,远程共享的文件系统监控总是有点不可靠。您不应该依赖您的应用程序获取所有事件 - 事实上,我建议您提供备用轮询机制来检查您可能错过的更改。GUI 中的刷新按钮可能是另一种选择,具体取决于您的应用程序。

也就是说,您的特定问题似乎并不少见。我用谷歌搜索了一下,发现了这些东西:

我的猜测是,这是 Samba 与 Windows 结合的某些版本(或配置)的问题。linux 服务器上的 Samba 日志中是否有任何内容可以指出问题的原因?

作为一种直接的解决方法,我建议您尝试以下方法:

  • 添加一个轮询机制,确保即使 FSW 发生故障,您也能获得文件夹更改
  • 当 FSW 中断时,尝试通过创建一个新的来“重新启动”它。您可能还想在收到错误时检查是否EnableRaisingEvents设置为false- 也许您可以将其设置为 true 以再次开始接收事件。
  • (在这里抓住稻草)尝试使用内部缓冲区大小以防出现问题(我对此表示怀疑,但值得一试)
于 2012-07-03T08:44:58.510 回答
0
        if (Directory.Exists(monitorPath))  
        {
            watcher.Path = monitorPath;
            watcher.IncludeSubdirectories = true;
            watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.CreationTime;
            watcher.InternalBufferSize = 65536;
            watcher.Filter = "test_prod-Pg1_ICT*";
            watcher.Changed += new FileSystemEventHandler(fileChangedEvent);
            watcher.EnableRaisingEvents = true;
            LogEvent("Folder Syncronization Service is Started!");

        }

我创建了一个基于 Window Service FileSystemWatcher 的类来监控 Samba 共享文件夹 onChanges,并使用 CodeProject 中的 DifferenceEngine 来检查不同之处,如果有更改,则复制到 Window 共享文件夹路径。我还添加了一个计时器,每 10 秒检查一次,以便在网络出现故障时进行处理。有一个列表数组来存储更改计数。引发文件更改事件时添加到列表中,成功时删除列表。

我在 Window 7 Pro OS 上测试了两台 HP 笔记本电脑,工作正常。

但无法在其他 Window 7 Pro 笔记本电脑和 Window XP Pro SP3 台式机上工作。(我们在同一个公司网络/VLAN 和服务包上)

失败的意思是如果我修改了 Samba 共享文件夹中的某些内容,它不会将最新内容同步到窗口共享路径。

我也添加了这些

[PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] [PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust")]

在编码的顶部,它似乎不起作用

于 2013-02-14T09:51:00.877 回答