FileSystemWatcher的与Linux上的Samba(FileSystemWatcher

2019-06-26 00:06发布

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

Answer 1:

首先,远程共享的文件系统监视总是会有些不可靠。 你不应该依赖于你的应用程序让所有的事件 - 事实上,我建议你提供一个备份轮询机制来检查,你可能已经错过了变化。 在GUI刷新按钮可能是另一种选择,这取决于您的应用程序。

似乎是说,您的具体问题并没有是少见。 我用Google搜索了一下周围,发现这些东西:

  • 与FileSystemWatcher的2003服务器上箱问题 -似乎是同样的问题,因为你有一个桑巴份额和“指定的服务器无法执行请求的操作”错误消息。
  • SO问题关于同样的问题, 其中一个答案表明,它的工作对一些客户,而不是为别人

我的猜测是,这是与Windows结合的Samba的某些版本(或配置)的问题。 是否有可能为您指出的问题的原因在Linux服务器上的Samba的日志什么?

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

  • 补充一下,保证你得到的文件夹的变化,即使FSW分解轮询机制
  • 当FSW休息,尽量通过创建一个新的“重新启动”它。 您可能还需要检查是否EnableRaisingEvents设置为false时,你得到的错误-也许你可以将其设置为true,以重新开始接收事件。
  • (抓用于秸秆在这里)尝试玩弄的内部缓冲区大小的情况下,这就是问题所在(我怀疑这一点,但它是值得一试)


Answer 2:

        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!");

        }

我创建了一个窗口服务FileSystemWatcher的基于类的监视Samba共享文件夹onChanges和使用DifferenceEngine从CodeProject检查不同,并复制到窗口共享文件夹路径,如果有一个变化。 我还添加了一个计时器检查每隔10秒来处理,当网络出现故障。 有一个列表数组存储的变化计数。 加入到列表时募集的文件更改事件,当是成功删除列表。

我已经测试了微软Windows 7专业版操作系统两台HP笔记本,做工精细。

但未能对其他Window 7 Pro笔记本也视窗XP专业版SP3的桌面工作。 (我们是在同一家公司的网络/ VLAN和服务包)

失败的就是这个意思,如果我在桑巴共享文件夹修改的东西,它不会同步最新的内容窗口共享路径。

我还增加了这些

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

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



文章来源: FileSystemWatcher with Samba on Linux