FileSystemWatcher在Windows 10上无法检测JPG旋转

时间:2017-11-09 11:21:53

标签: c# wpf rotation windows-10 filesystemwatcher

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

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

Rotate buttons

双击文件并在照片应用中旋转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);
    }

1 个答案:

答案 0 :(得分:4)

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