如何在 Windows 资源管理器中刷新文件的缩略图?

Posted

技术标签:

【中文标题】如何在 Windows 资源管理器中刷新文件的缩略图?【英文标题】:How do I refresh a file's thumbnail in Windows Explorer? 【发布时间】:2011-04-03 02:49:43 【问题描述】:

我们的 Windows 文件服务器安装了一个存档服务,用于“存根”在定义的时间段内未访问的文件。当对存根文件的请求发送到服务器时,存档服务会用原始文档替换存根并将其提供给用户。

有关存档服务的主要抱怨是照片的缩略图不再可用。我决定在 C# 中创建一个程序,允许用户选择一个文件夹并取消存根其中的所有文件。它通过读取文件夹中每个文件的第一个字节来做到这一点:

if (Directory.Exists(path))

    DirectoryInfo di = new DirectoryInfo(path);
    FileInfo[] potentiallyStubbedFiles = di.GetFiles();
    foreach (FileInfo fi in potentiallyStubbedFiles)
    
        //ignore Thumbs.db files
        if(!fi.Name.Equals("Thumbs.db"))
        
            Console.WriteLine("Reading " + fi.Name);
            try
            
                FileStream fs = File.Open(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.None);

                try
                
                    //read the first byte of the file, forcing it to be unstubbed
                    byte[] firstByte = new byte[1];
                    fs.Read(firstByte, 0, 1);
                
                catch (Exception ex)
                
                    Console.WriteLine("An error occurred trying to read " + fi.Name + ":");
                

                fs.Close();
            
            catch (Exception ex)
            
                Console.WriteLine("An error occurred trying to open " + fi.Name + ":");
            
        
    
    Console.WriteLine("Finished reading files.");

else

    Console.WriteLine("\"" + path + "\" is not a valid directory.");

效果很好,但我有一个小问题想解决。

在 Windows 7 中,当 FileStream 关​​闭时,Windows 资源管理器会刷新文件并显示正确的缩略图,因此您可以看到每个文件的缩略图,因为它们是未存根的。然而,在 Windows XP 中,资源管理器在程序退出之前不会刷新文件,这迫使用户等到所有文件都被取消存根后才能浏览它们。

有什么方法可以强制 Windows XP 在读取文件后立即重新创建文件的缩略图?程序关闭后刷新文件的信号是什么?还是我完全走错了路?

【问题讨论】:

这个问题让我很感兴趣。我添加了赏金。 从那以后我就没有运气了。但是,我注意到如果我强制线程休眠几秒钟,任何已处理的文件都会被刷新。 好吧,如果你解决了它,请在一周内将你的答案作为这篇文章的答案,我会给你赏金:p。 在下面接受的答案中查看我的 cmets。非常感谢您在获得解决方案方面的帮助! :) 既然您认为这是正确的,我已授予赏金。没问题,这是一个有趣的问题。 【参考方案1】:

似乎没有与 Windows XP 相关的界面。 Vista及以上版本引入IThumbnailCache接口。

你不能删除 thumbs.db 并强制这样做吗?

thumbs 的格式没有记录,但http://vinetto.sourceforge.net/ 有一个项目试图理解它,如果您想深入研究,可能会提供一些指示。

【讨论】:

感谢您的回答,但更改 thumbs.db 不会让我实时刷新文件缩略图。【参考方案2】:

使用 SHCNE_UPDATEITEM 尝试 SHChangeNotify。

【讨论】:

我花了很多时间试图让 SHChangeNotify 工作但没有成功。如果我可以调试 dll 方法调用,那将是一个很大的帮助。有没有办法做到这一点? 小心传递正确的 SHCNF_PATH 参数(例如,Unicode 的 SHCNF_PATHW)。如果可以的话,传递文件的pidl。 谢谢。我最终让它工作了。这里是 ShellNotification 类,我可以在取消存根文件后调用 refreshThumbnail(fi.FullName) :pastebin.com/7VnfiKX6 目前有点粗糙,但可以完成工作。我使用的其他来源是:viewontv.codeplex.com/SourceControl/changeset/view/52406#939762 和 social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/… 您正在泄漏 pidl。使用 ILFree 释放 SHParseDisplayName 中分配的 pidl。

以上是关于如何在 Windows 资源管理器中刷新文件的缩略图?的主要内容,如果未能解决你的问题,请参考以下文章

怎么将WIN10的文档图片缩略图显示出来?

Visual Studio 解决方案资源管理器中的刷新按钮不起作用

如何告诉 Windows 资源管理器不要请求特定文件夹中的文件详细信息和缩略图?

将文件拖放到 wpf/C# 应用程序时,如何在 Windows 资源管理器中维护文件顺序?

win 10 如何取消桥接

如何在 Windows 资源管理器中添加“在此处打开 git-bash ...”上下文菜单?