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