C#中如何獲取文件圖標(biāo)
本文給大家介紹如何去獲取一個(gè)文件的關(guān)聯(lián)圖標(biāo)呢?現(xiàn)總結(jié)如下:
首先明確問(wèn)題:獲取一個(gè)文件的關(guān)聯(lián)圖標(biāo)或者是某個(gè)類型文件的顯示圖標(biāo)。
在網(wǎng)上搜了一圈,發(fā)現(xiàn)方法還是比較多的,但是應(yīng)用C#進(jìn)行獲取的方法不多。我選擇一種用.Net庫(kù)的方法。
使用的類:
System.Drawing.Icon ,位于System.Drawing 命名空間。
具體方法:
System.Drawing.Icon 類中的靜態(tài)方法:public static Icon ExtractAssociatedIcon(string filePath)
此方法接收一個(gè)文件路徑,返回一個(gè) Icon 類型的對(duì)象。此對(duì)象既是指定文件的 Icon 圖標(biāo)對(duì)象。
此 Icon 類提供了 Save 方法,可以將 Icon 文件寫(xiě)入流中,進(jìn)而保存至硬盤(pán)文件。
當(dāng)然要在程序中顯示也是可以的,Icon 類提供了 ToBitmap 方法,可以將 Icon 文件轉(zhuǎn)換為 Bitmap。Bitmap 就可以在 PictureBox 中顯示了。
如果要根據(jù)后綴名來(lái)獲取文件圖標(biāo),那要怎么辦呢?我想了一個(gè)比較笨的辦法。看代碼~
string fileName = "tmp." + houzhuiming; File.Create(fileName).Close(); Image img = System.Drawing.Icon.ExtractAssociatedIcon(fileName).ToBitmap(); File.Delete(fileName);
如此,新建一個(gè)指定后綴名的文件,獲取圖標(biāo)后直接刪除,就能獲得指定文件后綴名的圖標(biāo)了。嘻嘻~
下面給大家分享一段代碼介紹C#獲取文件關(guān)聯(lián)圖標(biāo)
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using Microsoft.Win32;
namespace ifmdp.DeviceManager
{
class SystemIcon
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}
[DllImport("Shell32.dll", EntryPoint = "SHGetFileInfo", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);
[DllImport("User32.dll", EntryPoint = "DestroyIcon")]
public static extern int DestroyIcon(IntPtr hIcon);
#region API 參數(shù)的常量定義
public enum FileInfoFlags : uint
{
SHGFI_ICON = 0x000000100, // get icon
SHGFI_DISPLAYNAME = 0x000000200, // get display name
SHGFI_TYPENAME = 0x000000400, // get type name
SHGFI_ATTRIBUTES = 0x000000800, // get attributes
SHGFI_ICONLOCATION = 0x000001000, // get icon location
SHGFI_EXETYPE = 0x000002000, // return exe type
SHGFI_SYSICONINDEX = 0x000004000, // get system icon index
SHGFI_LINKOVERLAY = 0x000008000, // put a link overlay on icon
SHGFI_SELECTED = 0x000010000, // show icon in selected state
SHGFI_ATTR_SPECIFIED = 0x000020000, // get only specified attributes
SHGFI_LARGEICON = 0x000000000, // get large icon
SHGFI_SMALLICON = 0x000000001, // get small icon
SHGFI_OPENICON = 0x000000002, // get open icon
SHGFI_SHELLICONSIZE = 0x000000004, // get shell size icon
SHGFI_PIDL = 0x000000008, // pszPath is a pidl
SHGFI_USEFILEATTRIBUTES = 0x000000010, // use passed dwFileAttribute
SHGFI_ADDOVERLAYS = 0x000000020, // apply the appropriate overlays
SHGFI_OVERLAYINDEX = 0x000000040 // Get the index of the overlay
}
public enum FileAttributeFlags : uint
{
FILE_ATTRIBUTE_READONLY = 0x00000001,
FILE_ATTRIBUTE_HIDDEN = 0x00000002,
FILE_ATTRIBUTE_SYSTEM = 0x00000004,
FILE_ATTRIBUTE_DIRECTORY = 0x00000010,
FILE_ATTRIBUTE_ARCHIVE = 0x00000020,
FILE_ATTRIBUTE_DEVICE = 0x00000040,
FILE_ATTRIBUTE_NORMAL = 0x00000080,
FILE_ATTRIBUTE_TEMPORARY = 0x00000100,
FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200,
FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400,
FILE_ATTRIBUTE_COMPRESSED = 0x00000800,
FILE_ATTRIBUTE_OFFLINE = 0x00001000,
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000,
FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
}
#endregion
/// <summary>
/// 獲取文件類型的關(guān)聯(lián)圖標(biāo)
/// </summary>
/// <param name="fileName">文件類型的擴(kuò)展名或文件的絕對(duì)路徑</param>
/// <param name="isLargeIcon">是否返回大圖標(biāo)</param>
/// <returns>獲取到的圖標(biāo)</returns>
public static Icon GetIcon(string fileName, bool isLargeIcon)
{
SHFILEINFO shfi = new SHFILEINFO();
IntPtr hI;
if (isLargeIcon)
hI = SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), (uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_USEFILEATTRIBUTES | (uint)FileInfoFlags.SHGFI_LARGEICON);
else
hI = SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), (uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_USEFILEATTRIBUTES | (uint)FileInfoFlags.SHGFI_SMALLICON);
Icon icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
DestroyIcon(shfi.hIcon); //釋放資源
return icon;
}
/// <summary>
/// 獲取文件夾圖標(biāo)
/// </summary>
/// <returns>圖標(biāo)</returns>
public static Icon GetDirectoryIcon(bool isLargeIcon)
{
SHFILEINFO _SHFILEINFO = new SHFILEINFO();
IntPtr _IconIntPtr;
if (isLargeIcon)
{
_IconIntPtr = SHGetFileInfo(@"", 0, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), ((uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_LARGEICON));
}
else
{
_IconIntPtr = SHGetFileInfo(@"", 0, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), ((uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_SMALLICON));
}
if (_IconIntPtr.Equals(IntPtr.Zero)) return null;
Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon);
return _Icon;
}
}
}
- C#實(shí)現(xiàn)托盤(pán)程序并禁止多個(gè)應(yīng)用實(shí)例運(yùn)行的方法
- C#實(shí)現(xiàn)系統(tǒng)托盤(pán)通知的方法
- C#程序最小化到托盤(pán)圖標(biāo)操作步驟與實(shí)現(xiàn)代碼
- c# 托盤(pán)雙擊不觸發(fā)單擊事件的實(shí)現(xiàn)方法
- C# WinForm窗口最小化到系統(tǒng)托盤(pán)
- C#怎樣才能實(shí)現(xiàn)窗體最小化到托盤(pán)呢?
- C#實(shí)現(xiàn)用戶自定義控件中嵌入自己的圖標(biāo)
- C#實(shí)現(xiàn)帶消息數(shù)的App圖標(biāo)
- C#禁用雙擊窗體圖標(biāo)關(guān)閉窗體的方法
- C#實(shí)現(xiàn)WinForm禁止最大化、最小化、雙擊標(biāo)題欄、雙擊圖標(biāo)等操作的方法
- C#實(shí)現(xiàn)位圖轉(zhuǎn)換成圖標(biāo)的方法
- 用 C# 編寫(xiě)一個(gè)停放在任務(wù)欄上的圖標(biāo)程序
- C#實(shí)現(xiàn)閃動(dòng)托盤(pán)圖標(biāo)效果的方法
相關(guān)文章
unity AudioSource播放完聲音后要執(zhí)行的函數(shù)或條件操作
這篇文章主要介紹了unity AudioSource播放完聲音后要執(zhí)行的函數(shù)或條件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
講解.NET環(huán)境下繪制模糊數(shù)學(xué)中隸屬函數(shù)分布圖
講解.NET環(huán)境下繪制模糊數(shù)學(xué)中隸屬函數(shù)分布圖...2007-11-11
c# 動(dòng)態(tài)構(gòu)建LINQ查詢表達(dá)式
這篇文章主要介紹了c# 如何動(dòng)態(tài)構(gòu)建LINQ查詢表達(dá)式,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下2020-11-11
C#實(shí)現(xiàn)只運(yùn)行單個(gè)實(shí)例應(yīng)用程序的方法(使用VB.Net的IsSingleInstance)
這篇文章主要介紹了C#實(shí)現(xiàn)只運(yùn)行單個(gè)實(shí)例應(yīng)用程序的方法,本文使用的是VB.Net的IsSingleInstance方法實(shí)現(xiàn),優(yōu)于Mutex 和 Process 這兩種只運(yùn)行單個(gè)應(yīng)用程序?qū)嵗姆椒?需要的朋友可以參考下2014-07-07
C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù)
這篇文章主要介紹了C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02

