关于 c#:如何在 Windows 资源管理器中刷新文件的缩略图?

How do I refresh a file's thumbnail in Windows Explorer?

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 资源管理器会刷新文件并显示正确的缩略图,因此您可以看到每个文件的缩略图,因为它们是未Stubbing的。但是,在 Windows XP 中,资源管理器在程序退出之前不会刷新文件,这迫使用户等到所有文件都被取消Stubbing后才能浏览它们。

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


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

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

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


使用 SHCNE_UPDATEITEM 尝试 SHChangeNotify。