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