在Linux上使用Samba的FileSystemWatcher

时间:2012-07-03 07:25:58

标签: c# linux filesystemwatcher samba

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

2 个答案:

答案 0 :(得分:5)

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

那就是说,你的特殊问题似乎并不常见。我用Google搜索了一下,发现了这些东西:

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

作为一种直接的解决方法,我建议你试试这些:

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

答案 1 :(得分: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 Shared Folder Path。我还添加了一个Timer,每隔10秒检查一次,以便在网络出现故障时进行处理。有一个列表数组存储更改计数。当File Changed事件被提升时添加到List中,并在成功时删除List。

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

但未能使用其他Window 7 Pro笔记本电脑以及Window XP Pro SP3桌面。 (我们在同一公司网络/ VLAN和服务包上)

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

我也添加了这些

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

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