【问题标题】:FileSystemWatcher with Samba on Linux在 Linux 上使用 Samba 的 FileSystemWatcher
【发布时间】:2012-07-03 14:42:28
【问题描述】:

我在我的 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");
    }

【问题讨论】:

  • 你提到了 linux,你的意思是你的客户端代码也运行在 linux 上(即 Mono)还是仅仅在 Samba 共享的服务器上运行?
  • 没有客户端在Windows上运行,服务器在Linux上运行(Ubuntu Server 10.04)
  • 并添加...您确定您有正确的共享权限来执行这些操作吗? filesystemwatcher 需要此处列出的权限msdn.microsoft.com/en-us/library/aa365465%28v=vs.85%29.aspx

标签: c# linux filesystemwatcher samba


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 非常感谢,其实我只需要在用户浏览的目录发生变化时得到通知。我的问题主要是错误事件后丢失的事件。通过在 FileSystemWatcher 中断时创建新的 FileSystemWatcher,我会不断收到有关文件系统更改的通知。
【解决方案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!");

        }

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

我在 Window 7 Pro OS 上测试了两台 HP 笔记本电脑,运行良好。

但无法在其他 Window 7 Pro 笔记本电脑和 Window XP Pro SP3 Desktop 上工作。 (我们在同一个公司网络/VLAN 和 Service Pack 上)

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

这些我也加了

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

上面的编码,好像不行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多