我在我的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");
}
答案 0 :(得分:5)
首先,远程共享的文件系统监控总是有点不可靠。您不应该依赖于您的应用程序获取所有事件 - 事实上,我建议您提供备份轮询机制来检查您可能错过的更改。 GUI中的刷新按钮可能是另一种选择,具体取决于您的应用程序。
那就是说,你的特殊问题似乎并不常见。我用Google搜索了一下,发现了这些东西:
我的猜测是,这与Samba与Windows结合的某些版本(或配置)存在问题。 Linux服务器上的Samba日志中是否有任何可以指向问题原因的内容?
作为一种直接的解决方法,我建议你试试这些:
EnableRaisingEvents
是否设置为false
- 也许您可以将其设置为true以重新开始接收事件。答案 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”)]
在编码的顶部,似乎不起作用