C# FileSystemWatcher没有';t在Windows 10上检测JPG旋转

C# FileSystemWatcher没有';t在Windows 10上检测JPG旋转,c#,wpf,rotation,windows-10,filesystemwatcher,C#,Wpf,Rotation,Windows 10,Filesystemwatcher,在我们的WPF应用程序中有一个FileSystemWatcher,它监视一个目录并显示该目录中文件的实时视图。每次文件夹更改(创建、重命名、删除或更改文件)时,FileSystemWatcher都会刷新此实时视图 我们注意到,当使用Windows资源管理器中的旋转按钮旋转JPG文件时,不会触发FileSystemWatcher事件(它确实适用于PNG、BMP、TIFF和TIF文件): 双击文件并在照片应用程序中旋转JPG会触发事件,因此这里一定有差异 我只能在Windows 10上测试它,但我

在我们的WPF应用程序中有一个
FileSystemWatcher
,它监视一个目录并显示该目录中文件的实时视图。每次文件夹更改(创建、重命名、删除或更改文件)时,
FileSystemWatcher
都会刷新此实时视图

我们注意到,当使用Windows资源管理器中的旋转按钮旋转JPG文件时,不会触发
FileSystemWatcher
事件(它确实适用于PNG、BMP、TIFF和TIF文件):

双击文件并在照片应用程序中旋转JPG会触发事件,因此这里一定有差异

我只能在Windows 10上测试它,但我的同事确认它在以前的Windows版本中工作

是否有方法使用
FileSystemWatcher
检测JPG文件旋转,或者这是一个已知的错误?

可以使用以下代码测试该问题:

    public MainWindow()
    {
        InitializeComponent();

        var watcher = new System.IO.FileSystemWatcher();
        watcher.Path = Environment.GetFolderPath(System.Environment.SpecialFolder.MyPictures);
        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size;
        watcher.Filter = "*.*";
        watcher.IncludeSubdirectories = true;
        watcher.EnableRaisingEvents = true;

        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Changed += new FileSystemEventHandler(OnChanged);
    }

    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        Debug.WriteLine("The file " + e.Name + " was " + e.ChangeType);
    }

这很可能是因为在JPEG中,旋转通常由EXIF元数据标志控制。因此,当您在资源管理器中旋转jpeg时,不会执行任何实际旋转。相反,它只是改变EXIF旋转值(我记得可以是0,1,2,3等等)。在某些查看器中打开文件时,它会读取旋转标志并执行旋转以显示。因为标志的大小是固定的(文件中的字节数是固定的),所以此操作不会更改文件的大小,您只跟踪大小的更改。要修复-将
NotifyFilters.LastWrite
添加到
FileSystemWatcher
过滤器。还有一些操作不会改变文件的大小,所以这样做无论如何都是有益的。

也许我错了,但你只是在过滤
NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.size
和旋转是
NotifyFilters.LastWrite
或者根本不设置NotifyFilter。保留其默认值,即LastWrite、FileName和DirectoryName。