好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#中如何获取文件图标

 本文给大家介绍如何去获取一个文件的关联图标呢?现总结如下:

  首先明确问题:获取一个文件的关联图标或者是某个类型文件的显示图标。

  在网上搜了一圈,发现方法还是比较多的,但是应用C#进行获取的方法不多。我选择一种用.Net库的方法。

 使用的类:

    System.Drawing.Icon ,位于System.Drawing 命名空间。

  具体方法:  

    System.Drawing.Icon 类中的静态方法:public static Icon ExtractAssociatedIcon(string filePath)

  此方法接收一个文件路径,返回一个 Icon 类型的对象。此对象既是指定文件的 Icon 图标对象。

  此 Icon 类提供了 Save 方法,可以将 Icon 文件写入流中,进而保存至硬盘文件。

  当然要在程序中显示也是可以的,Icon 类提供了 ToBitmap 方法,可以将 Icon 文件转换为 Bitmap。Bitmap 就可以在 PictureBox 中显示了。

  如果要根据后缀名来获取文件图标,那要怎么办呢?我想了一个比较笨的办法。看代码~

?

string fileName = "tmp." + houzhuiming;

    File.Create(fileName).Close();

    Image img = System.Drawing.Icon.ExtractAssociatedIcon(fileName).ToBitmap();

    File.Delete(fileName);

  如此,新建一个指定后缀名的文件,获取图标后直接删除,就能获得指定文件后缀名的图标了。嘻嘻~

下面给大家分享一段代码介绍C#获取文件关联图标

?

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 参数的常量定义

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>

/// 获取文件类型的关联图标

/// </summary>

/// <param name="fileName">文件类型的扩展名或文件的绝对路径</param>

/// <param name="isLargeIcon">是否返回大图标</param>

/// <returns>获取到的图标</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>

/// 获取文件夹图标

/// </summary>

/// <returns>图标</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;

}

}

}

dy("nrwz");

查看更多关于C#中如何获取文件图标的详细内容...

  阅读:43次