在 Windows 資源管理器中,我們可以使用圖標(biāo)方式來(lái)查看文件,圖標(biāo)可以讓我們快速判斷文件的類(lèi)型,如下圖中所選中的文件,相信大家一眼就能看出是一個(gè) Word 文檔。
設(shè)計(jì)美觀的圖標(biāo)讓我們賞心悅目,如果可以把這些小圖標(biāo)直接用在我們寫(xiě)的程序中,一定會(huì)增色不少。
但 .Net 并沒(méi)有直接提供給我們一個(gè)可以直接獲取文件圖標(biāo)的辦法,如果使用搜索引擎查找解決辦法的話,你會(huì)找到很多解決辦法,但大多是以零散的代碼提供的,質(zhì)量和來(lái)源都沒(méi)有保證。
我找到一位國(guó)外大牛寫(xiě)的 IconHandler,分享給大家!
IconHandler
IconHandler 是由 MVolo 分享的一個(gè)類(lèi)庫(kù),目前為 2.0 版本,網(wǎng)址為:
http://mvolo.com/blogs/serverside/archive/2008/04/27/IconHandler-2.0-File-icons-in-ASP.NET-applications.aspx
下載后打開(kāi)壓縮包里面如下包含兩個(gè) dll 文件:
第一個(gè)文件 ShellIcons.dll 用于從系統(tǒng)中獲取圖標(biāo)。第二個(gè)文件 ShellIconHandler.dll 用于在 ASP.NET 顯示圖標(biāo)。先看第一個(gè)文件。
ShellIcons.dll
獲取圖標(biāo)我們只需要調(diào)用 ShellIcons.GetIconForFile 靜態(tài)方法,這個(gè)方法有三個(gè)參數(shù):
publicclass ShellIcons{
publicstatic IconContainer GetIconForFile(string path, bool useExtension, bool largeIcon);
}
先來(lái)看兩段代碼,這三個(gè)參數(shù)的含義就自然明白了:
//WinForm:獲取 rar 文件的大圖標(biāo)并顯示在 pictureBox1 上
using (var container = ShellIcons.GetIconForFile(".rar", true, true))
{
Icon rarFileLargeIcon = container.Icon;
Bitmap rarFileLargeBmp = rarFileLargeIcon.ToBitmap();
pictureBox1.Image = rarFileLargeBmp;}//WinForm:WinForm:獲取 Fiddler.exe 的小圖標(biāo)并顯示在 pictureBox2 上
using (var container = ShellIcons.GetIconForFile(@"C:\Program Files\Fiddler2\Fiddler.exe", false, false)){
pictureBox2.Image = container.Icon.ToBitmap();
}
顯示如下:
ShellIconHandler.dll
這個(gè) dll 用在 ASP.NET 中顯示圖片,我們先看作者文件中的一張圖片:
這個(gè)調(diào)用酷吧,使用也比較簡(jiǎn)單,首先引用上面這兩個(gè) dll 文件,然后修改 web.config 文件(加入帶下劃線的部分):
<configuration><!-- ShellIconHandler configuration section declaration --><configSections><sectionname="iconHandler"type="Mvolo.ShellIcons.Web.ShellIconHandlerConfigurationSection"/></configSections><system.webServer><!-- Add IconHandler for IIS 7.0 Integrated mode --><handlers><addname="iconhandler"path="geticon.axd"verb="GET"type="Mvolo.ShellIcons.Web.ShellIconHandler"/></handlers><validationvalidateIntegratedModeConfiguration="false"/></system.webServer><system.web><!-- Add IconHandler for IIS 6.0 / IIS 7.0 Classic mode --><httpHandlers><addpath="geticon.axd"verb="GET"type="Mvolo.ShellIcons.Web.ShellIconHandler"/></httpHandlers></system.web><!-- Icon Handler by Mike Volodarsky Retrieves the shell icon for the specified file name. --><iconHandlerenabled="true"alwaysUseExtension="true"enableClientCaching="true"enableServerCaching="true" /></configuration>
OK 了,我們?cè)谑醉?yè)顯示幾個(gè)圖標(biāo)試試:
<imgsrc="geticon.axd?file=.docx&size=small"alt=".docx"/><imgsrc="geticon.axd?file=.xlsx&size=small"alt=".xlsx"/><imgsrc="geticon.axd?file=.pptx&size=small"alt=".pptx"/><br/><imgsrc="geticon.axd?file=.docx"alt=".docx"/><imgsrc="geticon.axd?file=.xlsx"alt=".xlsx"/><imgsrc="geticon.axd?file=.pptx"alt=".pptx"/>
顯示如下:
效果不錯(cuò)吧! (還可以在配置文件中,通過(guò) iconHandler 節(jié)的選項(xiàng)來(lái)指定是否進(jìn)行緩存。)
寫(xiě)到這里,也許有的朋友會(huì)問(wèn),網(wǎng)站通常部署在服務(wù)器上,如果服務(wù)器上沒(méi)有安裝 Office 這些圖標(biāo)能正確顯示嗎?很不幸,不能顯示,IconHandler 通過(guò) shell API SHGetFileInfo 來(lái)獲取圖標(biāo),如果文件類(lèi)型沒(méi)有在系統(tǒng)中注冊(cè)的話,是獲取不到的。但慶幸的是 MVolo 考慮到了這個(gè)問(wèn)題,并給我們供了一個(gè)解決辦法:
在 Web 項(xiàng)目中新建立一個(gè)名為 /App_Resources/Icons 的文件夾中,將圖片以下面的方式放入:
還要再修改下 iconHandler 配置節(jié)(加入帶下劃線的部分):
<configuration><iconHandlerenabled="true"alwaysUseExtension="true"enableClientCaching="true"enableServerCaching="true"useSavedIcons="true"/></configuration>
我們?cè)贉y(cè)試一下,在首頁(yè)中加入以下代碼:
<imgsrc="geticon.axd?file=.hctx&size=small"alt=".hctx"/><imgsrc="geticon.axd?file=.hctx"alt=".hctx"/><br/>
預(yù)覽如下:
解決了,但實(shí)際文件類(lèi)型可能有好幾百甚至上千種,一個(gè)個(gè)來(lái)太麻煩,幸好 MVolo 也為我們提供了另外一個(gè)工具。
IconGen.exe
使用這個(gè)工具我們可以批量生成文件對(duì)應(yīng)的大小圖標(biāo),這是一個(gè)控件臺(tái)應(yīng)用程序,只需要執(zhí)行以下兩個(gè)命令:
> IconGen.exe c:\Icons large> IconGen.exe c:\Icons small
分別生成大小圖標(biāo),如下:
大大小小一共生成了 2038 個(gè)圖標(biāo)!