为了账号安全,请及时绑定邮箱和手机立即绑定

两次引发FileSystemWatcher更改事件

两次引发FileSystemWatcher更改事件

C#
LEATH 2019-07-06 15:14:09
两次引发FileSystemWatcher更改事件我有一个应用程序,我在其中查找文本文件,如果对该文件进行了任何更改,则使用OnChanged更好地处理这件事。我正在使用NotifyFilters.LastWriteTime但这件事还是被炒了两次。这是密码。public void Initialize(){    FileSystemWatcher _fileWatcher = new FileSystemWatcher();   _fileWatcher.Path = "C:\\Folder";   _fileWatcher.NotifyFilter = NotifyFilters.LastWrite;   _fileWatcher.Filter = "Version.txt";   _fileWatcher.Changed += new FileSystemEventHandler(OnChanged);   _fileWatcher.EnableRaisingEvents = true;}private void OnChanged(object source, FileSystemEventArgs e){    .......}就我而言OnChanged被调用两次,当我更改文本文件时。version.txt保存它。
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

任何复制OnChanged事件FileSystemWatcher可以通过检查File.GetLastWriteTime有关文件的时间戳。就像这样:

DateTime lastRead = DateTime.MinValue;void OnChanged(object source, FileSystemEventArgs a){
    DateTime lastWriteTime = File.GetLastWriteTime(uri);
    if (lastWriteTime != lastRead)
    {
        doStuff();
        lastRead = lastWriteTime;
    }
    // else discard the (duplicated) OnChanged event}


查看完整回答
反对 回复 2019-07-06
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

恐怕这是一个众所周知的bug/特性FileSystemWatcher班级,等级。这是来自这个类的文档:

您可能会注意到,在某些情况下,单个创建事件生成由组件处理的多个创建事件。例如,如果使用FileSystemWatcher组件监视目录中新文件的创建,然后使用记事本创建文件进行测试,则可能会看到两个已创建的事件生成,即使只创建了一个文件。这是因为记事本在写入过程中执行多个文件系统操作。记事本以批方式写入磁盘,从而创建文件的内容,然后创建文件属性。其他应用程序可以相同的方式执行。因为FileSystemWatcher监视操作系统活动,因此将捕获这些应用程序触发的所有事件。

现在这段文字是关于Created事件,但同样的情况也适用于其他文件事件。在某些应用程序中,您可以通过使用NotifyFilter属性,但我的经验是,有时您还必须进行一些手工复制过滤(Hack)。

一段时间前,我在一页上标了几页FileSystemWatcher提示..你可能想去看看。


查看完整回答
反对 回复 2019-07-06
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

我已经在我的代表中使用以下策略“修正”了这个问题:

// fsw_ is the FileSystemWatcher instance used by my application.private void OnDirectoryChanged(...){
   try
   {
      fsw_.EnableRaisingEvents = false;

      /* do my stuff once asynchronously */
   }

   finally
   {
      fsw_.EnableRaisingEvents = true;
   }}


查看完整回答
反对 回复 2019-07-06
  • 3 回答
  • 0 关注
  • 759 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信