.Net读取XP文件夹中的Thumbs.db文件

一般在XP文件夹里面,特别是图片和视频文件夹里有一个文件—Thumbs.db文件。这个文件是XP用来缓存图片和影音文件的缩略图的,有了这个文件,XP在打开保存大量图片文件的文件夹的时候,显示速度会明显比没有Thumbs.db文件的文件夹快—因为后者需要实时生成缩略图。

最近在做一个自己的图片管理程序,需要快速生成缩略图,就想到复用这个文件,这样我的程序可以无缝地继承视窗系统的资源管理器功能。因为Thumbs.db文件的文件结构和访问API没有被公开,所以在Google查了一些资料,发现Thumbs.db文件采用的是结构化存储文件(Structured Storage File)结构,这个文件在COM时代非常的流行,不知道为什么在.Net里面,微软把这个文件结构扔掉了。

结构化存储概述

结构化存储文件结构说白了就是一个保存在文件里面的文件系统,就是说在一个结构化存储文件里面,保存有“文件夹”信息,也保存有“文件”信息和其内容。例如,我们熟悉的Winrar的打包多个文件的过程,就可以使用结构化存储文件结构来保存(当然啦,我没有Winrar的源代码,不是说Winrar就是这样实现打包的啊)。

使用结构化存储文件的一个好处是,使得更新文件内容非常方便。 举个例子,比如我们日常使用的Word吧,当我们编辑一个文件的时候,如果Word采用的顺序存储结构—文件内容是按照内容的逻辑结构顺序存储在磁盘里的,即在硬盘里,第一页保存在第二页的前面。顺序存储方式的问题在于,它使得修改Word文档的时候,会变得非常麻烦。假设你的文档有几千页,当你增删第一页的内容的时候,顺序存储的方式就要求你必须移动后面几千页内容—可以想象到这个过程有多慢了。 如果我们将Word文档看作一个小的文件系统的话,那么对于文档中的每一页我们可以看成是一个“文件夹”,然后所有的文字段落可以看成是“文件夹”里面的文件。如果文档里面插入了图片的话,可以另外在“文件夹”里创建一个小的文件夹—“图片”文件夹,而在使用到这个图片的位置上加入一个快捷方式链接到每一页的内容里就可以了。下图演示了前一段描述的概念(注意-我没有看到Office的源代码,上述内容只不过是我的一个小猜想而已):

结构化存储文件的COM接口 

刚才讲完了概念,在COM中,IStorage接口就相当于结构化存储文件中的 “文件夹”,而IStream接口就是“文件”啦。下面就是IStorage的接口:

MIDL_INTERFACE("0000000b-0000-0000-C000-000000000046")
IStorage : public IUnknown
{

public:

virtual HRESULT STDMETHODCALLTYPE CreateStream(
        /* [string][in] */ __RPC__in const OLECHAR *pwcsName,
        /* [in] */ DWORD grfMode,
        /* [in] */ DWORD reserved1,
        /* [in] */ DWORD reserved2,
        /* [out] */ __RPC__deref_out_opt IStream **ppstm) = 0;

    virtual /* [local] */ HRESULT STDMETHODCALLTYPE OpenStream(
        /* [string][in] */ const OLECHAR *pwcsName,
        /* [unique][in] */ void *reserved1,
        /* [in] */ DWORD grfMode,
        /* [in] */ DWORD reserved2,
        /* [out] */ IStream **ppstm) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStorage(
        /* [string][in] */ __RPC__in const OLECHAR *pwcsName,
        /* [in] */ DWORD grfMode,
        /* [in] */ DWORD reserved1,
        /* [in] */ DWORD reserved2,
        /* [out] */ __RPC__deref_out_opt IStorage **ppstg) = 0;

    virtual HRESULT STDMETHODCALLTYPE OpenStorage(
        /* [string][unique][in] */ __RPC__in_opt const OLECHAR *pwcsName,
        /* [unique][in] */ __RPC__in_opt IStorage *pstgPriority,
        /* [in] */ DWORD grfMode,
        /* [unique][in] */ __RPC__deref_opt_in_opt SNB snbExclude,
        /* [in] */ DWORD reserved,
        /* [out] */ __RPC__deref_out_opt IStorage **ppstg) = 0;

    virtual /* [local] */ HRESULT STDMETHODCALLTYPE CopyTo(
        /* [in] */ DWORD ciidExclude,
        /* [size_is][unique][in] */ const IID *rgiidExclude,
        /* [unique][in] */ SNB snbExclude,
        /* [unique][in] */ IStorage *pstgDest) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveElementTo(
        /* [string][in] */ __RPC__in const OLECHAR *pwcsName,
        /* [unique][in] */ __RPC__in_opt IStorage *pstgDest,
        /* [string][in] */ __RPC__in const OLECHAR *pwcsNewName,
        /* [in] */ DWORD grfFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Commit(
        /* [in] */ DWORD grfCommitFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Revert( void) = 0;

    virtual /* [local] */ HRESULT STDMETHODCALLTYPE EnumElements(
        /* [in] */ DWORD reserved1,
        /* [size_is][unique][in] */ void *reserved2,
        /* [in] */ DWORD reserved3,
        /* [out] */ IEnumSTATSTG **ppenum) = 0;

    virtual HRESULT STDMETHODCALLTYPE DestroyElement(
        /* [string][in] */ __RPC__in const OLECHAR *pwcsName) = 0;

    virtual HRESULT STDMETHODCALLTYPE RenameElement(
        /* [string][in] */ __RPC__in const OLECHAR *pwcsOldName,
        /* [string][in] */ __RPC__in const OLECHAR *pwcsNewName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetElementTimes(
        /* [string][unique][in] */ __RPC__in_opt const OLECHAR *pwcsName,
        /* [unique][in] */ __RPC__in_opt const FILETIME *pctime,
        /* [unique][in] */ __RPC__in_opt const FILETIME *patime,
        /* [unique][in] */ __RPC__in_opt const FILETIME *pmtime) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetClass(
        /* [in] */ __RPC__in REFCLSID clsid) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStateBits(
        /* [in] */ DWORD grfStateBits,
        /* [in] */ DWORD grfMask) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stat(
        /* [out] */ __RPC__out STATSTG *pstatstg,
        /* [in] */ DWORD grfStatFlag) = 0;
};

时间: 2024-08-17 14:50:35

.Net读取XP文件夹中的Thumbs.db文件的相关文章

Win7系统中的Thumbs.db文件是什么?

  相信在win7系统下,在设置显示所有文件后,会在一些文件夹中都遇到thumbs.db名字的文件,而在win7系统下thumbs.db文件默认是处于隐藏状态,用户只要在显示所有文件的前提下才能发现这些文件,在部分用户看到该文件后,都在问thumbs.db文件是什么,其实thumbs.db文件通常出现在带有图片的文件夹中,它是win7系统下的图片缓存文件,对于不想让系统中出现thumbs.db文件的用户,可对策略组进行修改,从而禁止该缓存文件的自动生成,下面我们看下操作方法吧! 操作方法 1.按

脚本-如何把图片移到文件夹中并自动创建文件夹?

问题描述 如何把图片移到文件夹中并自动创建文件夹? 一张图片用一个文件夹装,比如说有100张图片,就自动创建100个文件夹,每个文件夹装一张图片,这功能要怎么实现? 解决方案 java代码可以吗,就这么个逻辑 shell或python应该更简单 public static void main(String[] args) { File file = new java.io.File("/home/jerome/Pictures"); file.getAbsoluteFile(); St

想做一个vc程序,后台监控指定文件夹中是否存在数据库文件,如果有则将文件内容上传到服务器数据库中。

问题描述 想做一个vc程序,后台监控指定文件夹中是否存在数据库文件,如果有则将文件内容上传到服务器数据库中. 有说可以写服务来后台监控的,但是我不太明白原理,服务是怎么实现后台监控, vc倒是可以直接生成一个服务,但是不清楚原理,完全不知道应该从哪下手. 希望有高手给解答一下. 解决方案 参考:http://blog.sina.com.cn/s/blog_a6fb6cc901017us1.html

文件夹中怎么把所有文件改成平铺模式?

怎么把所有文件改成平铺模式?有时候我们改了一个文件夹里的,其它文件夹还是没变,很是郁闷啊.如何把所有文件夹里的文件改成默认平铺图标模式呢?其实很简单. 你先打开一个文件夹,然后把这个文件夹里的文件改成平铺模式的,然后在上边的菜单栏上选择"工具"->"文件夹选项"->"查看"->"文件夹视图"->"应用到所有的文件夹".

php批量删除指定文件夹中指定后缀名文件

直接上代码: 下面的例子我们是以删除指定目录的html为例子哦,如果你要其它文件我们只要把html改成你自己要删除的后缀名就可以了.  代码如下 复制代码 <?php $lanmu = array("action","tiyu","yizhi","sheji","gaoxiao","maoxian","qipai","celue","

遍历-如何读取一个大文件夹中全部xml文件。将其路径放入哪种容器

问题描述 如何读取一个大文件夹中全部xml文件.将其路径放入哪种容器 现在在一个大的文件夹中,包含了若干个子文件夹,每个文件夹可能包含N个xml,txt等其他文件.现在想通过遍历把这个大的文件夹中所有的xml文件保存到一个容器中.1.请问用什么容器比较好vector?2.最好能来个详细的例子 让鄙人学习下 解决方案 你这种方法用递归比较好,至于容器,你说的是将找到的文件的路径存放起来吧.那个就随便都可以.用List吧. public void findFileByEndStr(String di

求助怎么用C# 取一个文件夹中所有的txt的行数并且写入dataGridView

问题描述 计算txt的行数和dataGridView单元格一一对应各个txt文件内容为(例):E00401504EB9FE7DE00401504EB9FE7DE00401504EB9FE7DE00401502BB0D3DFE00401502BB0D3DFtxt第一站第一时段第一站第二时段.........dataGridView站数/时段第1时段第2时段第3时段第4时段第1站第2站第3站本人纯属菜鸟需要各位大神源代码 解决方案 解决方案二:技术差,连描述都不清楚,txt例子和gv的描述看不懂是怎

android-如何捕捉图像并保存在文件夹中

问题描述 如何捕捉图像并保存在文件夹中 下面的代码是用于捕捉一个图像,并将它保存到手机图像目录.如何修改代码在内存中创建一个新的文件夹,然后再保存捕捉的图像,再在主屏中显示所有的图像. package makemachine.android.examples; import java.io.File; import android.provider.MediaStore; import android.util.Log; import android.view.View; import andr

c语言-读取文件夹中所有文件的名称(含后缀)

问题描述 读取文件夹中所有文件的名称(含后缀) 用C++或C程序读取目标文件夹中所有文件的名称,有没有具体的方法,比如命令,算法,函数.思路也可以! 解决方案 需要api,比如windows API或者linux APIhttp://www.cnblogs.com/chenkunyun/archive/2012/03/24/2415727.html 解决方案二: http://blog.csdn.net/lin_fs/article/details/7335573