我在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");
}
3条答案
按热度按时间bkhjykvo1#
首先,远程共享的文件系统监控总是有些不可靠。你不应该依赖于你的应用获取所有事件-事实上,我建议你提供一个备份轮询机制来检查你可能错过的更改。GUI中的刷新按钮可能是另一个选项,这取决于你的应用。
也就是说,你的问题似乎并不罕见。我在谷歌上搜索了一下,发现了这些东西:
我猜这是桑巴舞的某些版本(或配置)与Windows结合时出现的问题。Linux服务器上的Samba日志中是否有任何内容可以向您指出问题的原因?
作为一种直接的解决方法,我建议您尝试以下操作:
EnableRaisingEvents
是否设置为false
-也许您可以将其设置为true以再次开始接收事件。ojsjcaue2#
我创建了一个基于Windows Service FileSystemWatcher的类来监视桑巴舞共享文件夹的变化,并使用CodeProject中的DifferenceEngine来检查差异,如果有变化,则将其复制到Windows共享文件夹路径。我还添加了一个计时器来每10秒检查一次,以处理网络故障。有一个列表数组来存储变化计数。在引发文件更改事件时添加到列表中,并在成功时删除列表。
我已经测试了两个惠普笔记本电脑上的窗口7专业操作系统,工作正常。
但无法在其他Windows 7 Pro笔记本电脑和Windows XP Pro SP3桌面上工作。(我们在同一公司网络/VLAN和Service Pack上)
失败是指如果我修改了桑巴舞共享文件夹中的内容,它不会将最新内容同步到窗口共享路径。
我还加了这些
[权限集属性(安全操作.链接要求,名称=“完全信任”)] [权限集属性(安全操作.继承要求,名称=“完全信任”)]
在顶部的编码,它似乎不工作
carvr3hs3#
对于最近遇到这种问题的人,引用my answer to this question:
我们还没有测试这在我们的情况下是否是一个合适的替代方案,但微软似乎在一段时间前就引入了PhysicalFileProvider。
它有一个UsePollingFileWatcher属性,专门针对这类问题。
然后对于文件监视,您似乎需要Watch方法。
文档目前显示它在某些平台或目标框架上不可用,但实际上the NuGet package声称与.NET Standard 2.0兼容,因此基本上应该涵盖所有内容。