出于某种原因,我无法从FileSystemWatcher中删除事件处理程序.
这就是我所拥有的
void Start()
{
ivFileSystemWatcher = new FileSystemWatcher();
ivFileSystemWatcher.Changed +=
new FileSystemEventHandler(ivFileSystemWatcher_Changed);
}
void Stop()
{
ivFileSystemWatcher.Changed -=
new FileSystemEventHandler(ivFileSystemWatcher_Changed);
ivFileSystemWatcher.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
当我打电话给开始时,我开始接收更改事件,但是当我呼叫停止时,我希望事件停止,但它们仍在被提升.
我正在创建一个使用 FileSystemWatcher 的 Windows 应用程序。FileSystemWatcher 观察一些目录的变化。每次将某个文件添加到此目录时,FileSystemWatcher 都必须将有关此文件的信息添加到 XML 文件中。一切正常,但是,例如,当我同时添加 100 个文件时(比如某些应用程序将这些文件添加到目录中),并不是每个文件的信息都出现在这个 xml 文件中。
我想使用队列。并使用它向此集合添加项目。并使用计时器。计时器将从该集合向 XML 添加信息。这是个好主意吗?
谁能建议我该怎么做?
所以我认为我必须创建一个 Windows 应用程序和一个 Windows 服务。WinApp 只会向 EventLog 添加信息,Windows Service 会读取信息 EventLog 并将其写入 XML。我认为这将是最好的方法。我在等待好的建议
这是一个关于实现这一目标的最佳实践的问题.
我有一个FileSystemWatcher应该通知我用户对文件和文件夹的更改.还观察了细分市场.在同一目录中,我的程序有时也会发生变化.我不希望FileSystemWatcher检测这些程序更改的事件.
我的第一个实现是一个列表,我可以添加预期的事件.当我收到文件系统事件时,我检查列表并忽略它,如果它在那里.这听起来不太健壮,但似乎有效.
现在我发现了真正的问题:
D:被观看了FileSystemWatcher.
我有两个这样的文件夹:D:\ folder1\folder2
现在我想用我的应用程序删除folder1(其中包含folder2).所以我把D:\ folder1放在我的删除列表中.然后我打电话给像Directory.Delete(@"D:\folder1", true).现在我注意到在异常中无法删除folder1(为什么有).我从列表中删除了删除条目,但是folder2已被删除,我得到了他的FileSystemEvent.所以我得到了D:\ folder1\folder2的FileSystem事件.我的程序现在认为用户已经删除了这个文件夹并且做错了.
我现在有一些想法:
1.)通过删除每个文件和每个文件夹来递归删除文件夹.有了这个,我得到每个子文件夹并提交一个自己的列表条目.我已经实现了它,但它非常非常慢.
2.)也许有更好的方法FileSystemWatcher来使我的列表过时的聪明的过滤器?
3.)如果可以删除所有内容,也许只能删除目录树.所以如果它失败了我仍然拥有一切,如果不是,一切都被删除.这对我来说似乎是最优雅的解决方案,但不知道这是否可行?
4.)是否可以通过我的软件专门锁定所有文件和文件夹?如果这样就可以了,应该可以用一个删除命令删除所有内容,或者像这样删除?
我也愿意接受其他解决方案.
编辑1以使其更清晰:
我只想"看到"文件夹上的用户操作.如果我在这里操作我的程序中的东西,我不想看到这个事件.
通过我的实现,如果文件夹被锁定且无法删除,我将获得子文件夹的事件.
用英语解释并不容易,因为我不是英语母语者;).
编辑2:
5.)也许可以过滤FileSystemWatcher定义过程中的所有事件?
我开发了文件队列系统,其中来自不同 Windows 机器的几个应用程序监视相同的映射网络驱动器以进行文件更改并处理文件。要查看映射驱动器的更改,我使用 FileSystemWatcher (c# .NET 4.0) 并且在 FileSystemWatcher 停止监视后的大约一天内一切正常。我尝试使用FileSystemWatcher.Error事件来捕获异常(如果有)。不幸的是Error 事件并不总是被触发。我没有找到解决问题的方法,FileSystemWatcher 停止工作并且没有抛出错误。有什么建议吗?
我正在使用FileSystemWatcher我的C#应用程序(在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, …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种方法可以将Azure Blob自动同步到本地文件系统.因此,无论何时将文件添加到容器,它都应该触发事件并下载到本地文件夹.
我将更多的Sync本地文件系统添加到Azure blob,但不是其他方式..
如果我使用轮询我需要多长时间轮询一次以及它对性能有多大影响.
使用共享相同事件处理程序的 FileSystemWatchers 安全吗?
让多个 FileSystemWatcher 使用相同的事件处理程序监视不同的目录是否安全?
Class Snippets
Private _watchPaths As New List(Of String) From {"x:\Dir1", "x:\Dir2"}
Private _watchers As List(Of FileSystemWatcher)
Private _newFiles As New BlockingCollection(Of String)
Sub Watch()
Dim _watchPaths As New List(Of String) From {"x:\Dir1", "x:\Dir2"}
Dim watchers As List(Of FileSystemWatcher)
For Each path In _watchPaths
Dim watcher As New FileSystemWatcher
AddHandler watcher.Created, Sub(s, e)
_trace.DebugFormat("New file {0}", e.FullPath)
'Do a little more stuff
_newFiles.Add(e.FullPath)
End Sub
Next
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
或者我们必须将 FileSystemWatcher 包装在如下所示的类中以使事件处理程序线程安全?
Class FileWatcher …Run Code Online (Sandbox Code Playgroud) 正如所示这篇文章,FileSystemWatcher是不可靠的,因为Windows磁盘缓存的.海报显示,无论优化和InternalBufferSize如何,该类错过了大约0.15% - 0.35%的所有事件.即使是驱动程序也会受此影响,因此它本身并不是FileSystemWatcher的错误.
海报提出了解决这个问题的方法 - 冲洗整个卷.但是我不想这样做 - 缓存是有原因的,它需要管理员权限.是否可以只刷新被监视的目录并获得使FileSystemWatcher 100%准确的相同结果?我对FlushFileBuffers知之甚少,但海报的解决方案专门刷新整个卷,即使只是刷新目录显然是一个更好的解决方案.
有没有.NET方法来刷新目录或指定的文件(未打开)?我的意思是真正的刷新,它等待磁盘本身的确认.例如,FileStream.Flush(无效),刷新刚刚在.NET的缓冲区,而不是OS缓冲(不像FileStream.Flush(布尔)与真正的参数在.NET 4和更好).我想刷新其他应用程序打开的文件.
如果没有,是否甚至可以使用FlushFileBuffers来刷新目录(也许它只支持文件和卷,但这会很奇怪)?此外,非管理员解决方案将非常理想,因为在管理模式下我可以使用Change Journal.
当我尝试使用PyCharm Community Edition调试Python文件时,IDE会打开一个新选项卡(以黄色突出显示),尽管我已经在预先存在的选项卡中打开了该文件.
有时,该重复选项卡包含该文件的旧版本,而不进行我刚才所做的更改.
虽然上述两个都是不同的问题,并不总是一起出现,但我怀疑这是一个共同的原因.如何禁用这些非直观行为?
如果你谷歌FileSystemWatcher问题,你会发现很多关于FileSystemWatcher跳过一些事件的文章(没有解雇所有事件).基本上,如果您更改了监视文件夹中的大量文件,其中一些文件将不会被处理FileSystemWatcher.
为什么会这样,我怎样才能避免错过事件?