从 C# 更新图像缩略图
Update Image Thumbnail from c#
我正在 Win 10 的 WinForms 应用程序中通过 C# 以编程方式操作 JPEG 图像,并希望文件资源管理器显示操作后的图像缩略图而不是原始图像缩略图。关闭资源管理器,删除 %LocalAppData%\Microsoft\Windows\Explorer\thumbcache_*.db 并重新启动会执行此操作,但它很慢且具有干扰性。我想以编程方式更新单个文件的缩略图。 Windows 在通过资源管理器上下文菜单旋转图像时执行此操作,但从程序执行此操作的方法尚不清楚。
我目前用来关闭资源管理器、删除缩略图缓存文件并重启的批处理文件是
taskkill /f /im explorer.exe
timeout 2 /nobreak>nul
DEL /F /S /Q /A %LocalAppData%\Microsoft\Windows\Explorer\thumbcache_*.db
timeout 2 /nobreak>nul
start "" %windir%\explorer.exe
start "" %windir%\explorer.exe "Folder To Update"
执行此类操作的正确方法是使用 SHChangeNotify()
函数。如果您使用的是 C#,您可以 p/invoke 像这样:
[DllImport( "Shell32.dll", CharSet = CharSet.Auto, SetLastError = true )]
static extern void SHChangeNotify(uint wEventId, uint uFlags, [MarshalAs(UnmanagedType.LPWStr)] string dwItem1, IntPtr dwItem2);
...然后用它来通知资源管理器某个项目已被修改(即您操作的图像):
private const uint SHCNE_UPDATEITEM = 0x00002000;
private const uint SHCNF_PATHW = 0x0005;
private const uint SHCNF_FLUSH = 0x1000;
string pathName = "your image file.jpg"
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW | SHCNF_FLUSH, pathName, IntPtr.Zero);
将文件修改日期增加 1 秒,然后将其改回触发 Windows 认为文件已更改,因此缩略图已更新。使用的代码是
DateTime modDate = System.IO.File.GetLastWriteTime(sFile);
System.IO.File.SetLastWriteTime(sFile, modDate.AddSeconds(1.0));
System.IO.File.SetLastWriteTime(sFile, modDate.AddSeconds(-1.0));
我正在 Win 10 的 WinForms 应用程序中通过 C# 以编程方式操作 JPEG 图像,并希望文件资源管理器显示操作后的图像缩略图而不是原始图像缩略图。关闭资源管理器,删除 %LocalAppData%\Microsoft\Windows\Explorer\thumbcache_*.db 并重新启动会执行此操作,但它很慢且具有干扰性。我想以编程方式更新单个文件的缩略图。 Windows 在通过资源管理器上下文菜单旋转图像时执行此操作,但从程序执行此操作的方法尚不清楚。
我目前用来关闭资源管理器、删除缩略图缓存文件并重启的批处理文件是
taskkill /f /im explorer.exe
timeout 2 /nobreak>nul
DEL /F /S /Q /A %LocalAppData%\Microsoft\Windows\Explorer\thumbcache_*.db
timeout 2 /nobreak>nul
start "" %windir%\explorer.exe
start "" %windir%\explorer.exe "Folder To Update"
执行此类操作的正确方法是使用 SHChangeNotify()
函数。如果您使用的是 C#,您可以 p/invoke 像这样:
[DllImport( "Shell32.dll", CharSet = CharSet.Auto, SetLastError = true )]
static extern void SHChangeNotify(uint wEventId, uint uFlags, [MarshalAs(UnmanagedType.LPWStr)] string dwItem1, IntPtr dwItem2);
...然后用它来通知资源管理器某个项目已被修改(即您操作的图像):
private const uint SHCNE_UPDATEITEM = 0x00002000;
private const uint SHCNF_PATHW = 0x0005;
private const uint SHCNF_FLUSH = 0x1000;
string pathName = "your image file.jpg"
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW | SHCNF_FLUSH, pathName, IntPtr.Zero);
将文件修改日期增加 1 秒,然后将其改回触发 Windows 认为文件已更改,因此缩略图已更新。使用的代码是
DateTime modDate = System.IO.File.GetLastWriteTime(sFile);
System.IO.File.SetLastWriteTime(sFile, modDate.AddSeconds(1.0));
System.IO.File.SetLastWriteTime(sFile, modDate.AddSeconds(-1.0));