文件类型探测程序

原创 2001年02月27日 08:25:00

 

文件类型探测程序
文/赵湘宁
本文例子程序
    记得我以前写过一篇文章是关于如何从一个可执行程序中吸取图标。本文将讨论如何得到与特定的文件类型关联的文件图标?
    这个问题依赖于你是想要得到一个指定文件的图标还是只想得到普通文件的图标。如果你有一个特定的文件,如C:/MyFile/SomeFile.zzp。那你可以调用ExtractAssociatedIcon函数获得于特定文件关联的图标。但这个函数只适用于磁盘上存在实际的文件(或某处可存取)。
    如果你想查找与一般文件类型关联的图标,那你就必须读注册表。例如,为了查找出.cpp文件使用的图标,你就要察看注册表的HKEY_CLASSES_ROOT/.cpp入口,在我的机器上,其第一行的值是“cppfile”,然后继续察看HKEY_CLASSES_ROOT/cppfile的DefaultIcon键值,在我的机器上是:

HKEY_CLASSES_ROOT/cppfile/DefaultIcon =
"C:/PROGRA~1/MICROS~4/Common/MSDev98/Bin/msdev.exe,-20209"

    所以.cpp文件的图标在C:/PROGRA~1/MICROS~4/Common/MSDev98/Bin/msdev.exe文件中的图标资源ID号为20209。一般情况下,HKCR/.foo有一个类似foofile的入口值,并在HKCR /foofile/DefaultIcon中指定了cpp文件的图标。
    但是,有的时候.foo的入口值不是foofile,而是象“SuperApp.Document.5”,它的意思是SuperApp文档的第五个版本,在HKEY_CLASSES_ROOT/ SuperApp.Document.5中没有DefaultIcon键值,但有键值CLSID={又长又丑的十六进制GUID},这就告诉你.foo是COM对象,其类的ID值就是那又长又丑的十六进制GUID。要得到关联的图标,必须到/CLSID/{又长又丑的十六进制GUID}/ DefaultIcon查找。哭吧!太痛苦了。但是还没完呢!因为foofile还可能有一个定制的以外壳扩展形式实现的图标处理器。为此你还要检查一下,加载这个图标处理器,调用IShellIcon或者IExtractIcon 并且继续哭吧,这真是太荒唐啦!
    所幸的是,有一个更好的方法来避开令人厌恶的注册表,那就是使用SHGetFileInfo函数,调用这个函数可以获得所有关于文件的信息。它有一个聪明的选项,SHGFI_USEFILEATTRIBUTES,这个选项允许你传递一个假文件名,如mumble.txt。即便文件不存在,SHGetFileInfo也能获得你要的信息。

SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo("foo.bmp", 
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);

为了展示它的使用方法,我写了一个小应用程序,FileType(参见图一),
cfig110001.jpg
图一
    对话框中有一个编辑框,在这个编辑框中可以输入任何文件的扩展名如txt、jpg、bmp等来察看与相应文件关联的图标。实现方法很直接:当用户敲入新的扩展名,Windows发送一个EN_UPDATE通知消息;然后对话框调用SHGetFileInfo函数获得图标,接着将图标显示在一个静态图标控制上,详细的实现细节请参考本文附带的程序








文件类型图标探测程序

文件类型探测程序文/赵湘宁本文例子程序    记得我以前写过一篇文章是关于如何从一个可执行程序中吸取图标。本文将讨论如何得到与特定的文件类型关联的文件图标?    这个问题依赖于你是想要得到一个指定文...
  • Orangecode
  • Orangecode
  • 2005年08月10日 16:48
  • 1222

文件类型探测程序

文/赵湘宁 本文例子程序     记得我以前...
  • dlyhlq
  • dlyhlq
  • 2008年03月25日 21:57
  • 482

文件类型探测程序

2001年02月27日 08:25:00 文件类型探测程序文/赵湘宁本文例子程序 记得我以前写过一篇文章是关于如何从一个可执行程序中吸取图标。本文将讨论如何得到与特定的文件类型关联的文...
  • softart
  • softart
  • 2007年10月27日 07:53
  • 187

文件类型探测程序

文件类型探测程序本文例子程序    记得我以前写过一篇文章是关于如何从一个可执行程序中吸取图标。本文将讨论如何得到与特定的文件类型关联的文件图标?    这个问题依赖于你是想要得到一个指定文件的图标还...
  • i_like_cpp
  • i_like_cpp
  • 2005年04月27日 09:40
  • 1243

Python 探测图片文件类型

Table of Contents 1. 探测图片类型1.1. python magic 1.2. imghdr 1.3. PIL.Image探测图片类型今天遇到一个小问题,如何探测图片的文件类型。总...
  • imnisen1992
  • imnisen1992
  • 2016年11月23日 23:03
  • 168

探测图像文件类型

在移植多种图像格式解码器时,不知道该调用那个解码器,可以先探测图像文件类型,具体如下: 先读取文件开头的8字节的数据: FILE* file; unsigned char data[8]; dai...
  • MikeDai
  • MikeDai
  • 2017年03月14日 12:24
  • 337

绕开注册表探测文件类型

那就是使用SHGetFileInfo函数,调用这个函数可以获得所有关于文件的信息。它有一个聪明的选项,SHGFI_USEFILEATTRIBUTES,这个选项允许你传递一个假文件名,如mumble.t...
  • wuyanhuiyishi
  • wuyanhuiyishi
  • 2005年04月26日 17:25
  • 1236

散列表实现(平方探测法)

from 《数据结构与算法分析》 开放地址散列法中,如果有冲突发生,就尝试选择另外单元,直到找出空的单元为止。 更一般的,单元h0(X) ,h1(X),h2(X)等等 hi(X)=(Hash(X...
  • didihe1988
  • didihe1988
  • 2013年10月28日 12:15
  • 2748

Linux的文件类型分类

Linux文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。linux文件的删除方式是用rm 命令。 Linux文件类型; Linux文件类...
  • qq_32744005
  • qq_32744005
  • 2016年08月20日 20:59
  • 1615

统计指定目录下的文件的小程序

# this program use to list all files sort by time or size#   sys.stderr "filelist.py [filename] [-ti...
  • naive1010
  • naive1010
  • 2005年10月27日 09:35
  • 1233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:文件类型探测程序
举报原因:
原因补充:

(最多只允许输入30个字)