在Linux上使用Samba的FileSystemWatcher

Akh*_*eus 5 c# linux samba filesystemwatcher

我正在使用FileSystemWatcher我的C#应用​​程序(在Windows上运行),以便在我的应用程序中更新我当前正在浏览的文件.当我浏览本地目录时,它工作得很好.重命名,删除或添加文件时会通知我.但是,例如,当我第一次在网络驱动器上重命名文件时,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");
    }
Run Code Online (Sandbox Code Playgroud)

Isa*_*avo 5

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

也就是说,你的特殊问题似乎并不常见.我google了一下,找到了这些东西:

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

作为一个直接的解决方法,我建议你尝试这些东西:

  • 添加轮询机制,确保即使FSW发生故障也可以更改文件夹
  • 当FSW中断时,尝试通过创建一个新的"重新启动"它.您可能还想检查是否在收到错误时EnableRaisingEvents设置为false- 也许您可以将其设置为true以再次开始接收事件.
  • (在这里抓住吸管)尝试使用内部缓冲区大小,以防出现问题(我对此表示怀疑,但值得一试)