FileSystemWatcher 在 Windows 10 上未检测到 JPG 旋转
FileSystemWatcher doesn't detect JPG rotation on Windows 10
我们的 WPF 应用程序中有一个 FileSystemWatcher
,它监视目录并显示该目录中文件的实时视图。每次文件夹更改(创建、重命名、删除或更改文件)时,FileSystemWatcher
都会刷新此实时视图。
我们注意到当使用 Windows 中的 旋转按钮 旋转 JPG 文件时,不会触发 FileSystemWatcher
事件Explorer(它确实适用于 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
过滤器。还有其他操作不会改变文件的大小,所以无论如何这样做都是有益的。
我们的 WPF 应用程序中有一个 FileSystemWatcher
,它监视目录并显示该目录中文件的实时视图。每次文件夹更改(创建、重命名、删除或更改文件)时,FileSystemWatcher
都会刷新此实时视图。
我们注意到当使用 Windows 中的 旋转按钮 旋转 JPG 文件时,不会触发 FileSystemWatcher
事件Explorer(它确实适用于 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
过滤器。还有其他操作不会改变文件的大小,所以无论如何这样做都是有益的。