Linux上带有桑巴舞的文件系统监视器

o3imoua4  于 2023-01-20  发布在  Linux
关注(0)|答案(3)|浏览(145)

我在C#应用程序上使用FileSystemWatcher(运行在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");
    }
bkhjykvo

bkhjykvo1#

首先,远程共享的文件系统监控总是有些不可靠。你不应该依赖于你的应用获取所有事件-事实上,我建议你提供一个备份轮询机制来检查你可能错过的更改。GUI中的刷新按钮可能是另一个选项,这取决于你的应用。
也就是说,你的问题似乎并不罕见。我在谷歌上搜索了一下,发现了这些东西:

我猜这是桑巴舞的某些版本(或配置)与Windows结合时出现的问题。Linux服务器上的Samba日志中是否有任何内容可以向您指出问题的原因?
作为一种直接的解决方法,我建议您尝试以下操作:

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

ojsjcaue2#

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

        }

我创建了一个基于Windows Service FileSystemWatcher的类来监视桑巴舞共享文件夹的变化,并使用CodeProject中的DifferenceEngine来检查差异,如果有变化,则将其复制到Windows共享文件夹路径。我还添加了一个计时器来每10秒检查一次,以处理网络故障。有一个列表数组来存储变化计数。在引发文件更改事件时添加到列表中,并在成功时删除列表。
我已经测试了两个惠普笔记本电脑上的窗口7专业操作系统,工作正常。
但无法在其他Windows 7 Pro笔记本电脑和Windows XP Pro SP3桌面上工作。(我们在同一公司网络/VLAN和Service Pack上)
失败是指如果我修改了桑巴舞共享文件夹中的内容,它不会将最新内容同步到窗口共享路径。
我还加了这些
[权限集属性(安全操作.链接要求,名称=“完全信任”)] [权限集属性(安全操作.继承要求,名称=“完全信任”)]
在顶部的编码,它似乎不工作

carvr3hs

carvr3hs3#

对于最近遇到这种问题的人,引用my answer to this question
我们还没有测试这在我们的情况下是否是一个合适的替代方案,但微软似乎在一段时间前就引入了PhysicalFileProvider。
它有一个UsePollingFileWatcher属性,专门针对这类问题。
然后对于文件监视,您似乎需要Watch方法。
文档目前显示它在某些平台或目标框架上不可用,但实际上the NuGet package声称与.NET Standard 2.0兼容,因此基本上应该涵盖所有内容。

相关问题