尽管对其采取了措施,但FileSystemWatcher事件仍然提升了两次

MrG*_*sen 4 .net c# filesystemwatcher

我在这里和其他网站浏览了不少线程,以解决这个问题.

这是我的FileMonitor类:

class FileMonitor
{
    public FileMonitor(String path)
    {
        try
        {
            var watcher = new FileSystemWatcher()
            {
                Path = path,
                IncludeSubdirectories = true,
                InternalBufferSize = 65536,
                EnableRaisingEvents = true
            };

            watcher.Changed += new FileSystemEventHandler(OnFileChanged);
            watcher.Created += new FileSystemEventHandler(OnFileCreated);
            watcher.Deleted += new FileSystemEventHandler(OnFileDeleted);
            watcher.Renamed += new RenamedEventHandler(OnFileRenamed);
            watcher.Error += new ErrorEventHandler(OnWatcherError);
        }
        catch (Exception)
        {

            throw;
        }
    }

    private void OnWatcherError(object sender, ErrorEventArgs e)
    {

    }

    private void OnFileChanged(object sender, FileSystemEventArgs e)
    {
        try
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = false;

            LogFileSystemChanges(e);
        }

        finally
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = true;
        }
    }

    private void OnFileCreated(object sender, FileSystemEventArgs e)
    {
        try
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = false;

            LogFileSystemChanges(e);
        }

        finally
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = true;
        }
    }

    private void OnFileDeleted(object sender, FileSystemEventArgs e)
    {
        try
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = false;

            LogFileSystemChanges(e);
        }

        finally
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = true;
        }
    }

    private void OnFileRenamed(object sender, RenamedEventArgs e)
    {
        try
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = false;

            LogFileSystemRenaming(e);
        }

        finally
        {
            ((FileSystemWatcher)sender).EnableRaisingEvents = true;
        }
    }

    private void LogFileSystemChanges(FileSystemEventArgs e)
    {
        string log = string.Format("{0:G}: {1} | {2}", DateTime.Now, e.FullPath, e.ChangeType);
        Console.WriteLine(log);
    }

    private void LogFileSystemRenaming(RenamedEventArgs e)
    {
        string log = string.Format("{0:G}: {1} | Old name: {2}", DateTime.Now, e.FullPath, e.OldName);
        Console.WriteLine(log);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以告诉我,我已经尝试了"锁定" ((FileSystemWatcher)sender).EnableRaisingEvents = false;,但我可以从我的控制台输出告诉我的事件触发了两次.

有什么想法吗?我真的不确定从哪里开始.

pid*_*pid 6

我遇到了同样的问题,经过多次努力得出结论,记事本在行中写了三次(!)文件.如果一个应用程序真的经常保存(可能是对备份进行三角测量等),那么你可以做的事情就不多了.

我还注意到你已经附加了所有事件,你应该将它缩小到你需要的最小范围,并过滤掉那些你对NotifyFilters不感兴趣的东西.


Ste*_*mul 5

我之前尝试过使用FileSystemWatcher类(事实证明是很多年前 - 2008 年),并且遇到了重大问题。这充其量只是一个有漏洞的抽象。我当时在CodeProject上报告了我的发现。在评论列表中查找“Glytzhkof”。我记得我在课堂上几乎各个方面都存在问题,但这么多年过去了,现在可能已经有所改善了

总而言之,我当时的经验是,事件完全消失或堆积,导致基于变量的异常,例如磁盘的写入缓存是否启用、是否访问 RAID、NAS 或常规磁盘,以及其他我不知道的随机硬件问题准确地回忆起来。有趣的是,它似乎适用于 UNC 路径。不知道为什么。映射驱动器失败。

查看代码项目讨论中的摘要。我确信自从我尝试以来已经有了一些改进,也许还有一些新的错误:-)。磁盘存储硬件似乎很难作为高级抽象来处理——它会泄漏。就我个人而言,我最终使用服务和常规磁盘功能手动扫描文件。在手动做事情之前我浪费了很多时间。

更新:在此处查看新信息:https ://stackoverflow.com/a/23704476/129130