admin管理员组

文章数量:1566355

2024年7月22日发(作者:)

使用前说明:

PS:

如果您想正常使用该类,需要在添加一个资源文件(如果是Win Form项目,该文件已

存在),然后在资源文件中添加五个图标ICON元素,用于充当默认图标。命名为:Application、CDDriver、

Empty、Folder、HardDriver。如下图所示:

← 资源文件

PPS:

每个图标文件均包括48*48,32*32和16*16三种像素大小。如果您使用VS2008自带的图标库中的图标,

则自动包含这三种像素大小(本例所使用的图标即是取自该库)。

PPPS:

VS2008的默认路径为(如果您安装VS2008时选择安装该图标库的话):C:Program FilesMicrosoft

Visual Studio 9.0Common7VS2008ImageLibrary2052。

位于该路径下的一个压缩文件

素。

包含几乎所有的系统图标元

PPPPS:

如果你确定不需要使用默认图标,请将静态构造函数注释。但此时程序有可能返回空的图标对象

null,

/* 该类是从最近编写的一个FTP软件中抽取出来的。

* 该类基础原型来自网络,经过大量的修改和注释添加才得以完成,其中SHFileInfoFlags枚举值注释

* 是从英文文档逐个翻译的,由于本人英语水平有限,难免有翻译不当之处,敬请谅解。

* 类中各函数作用请参见注释。

*

* 使用时请您尊重他人的劳动成果,如果您需要分享该文档,请务必使用免费方式分享。

*

* 因为最近发现有人将我文库的文档分享到自己的文库、空间、CSDN上面,而且提供索要积分的方式下载

//于北京海淀区东升科技园内 3/9/2012 YJWang

using System;

using pServices;

using g;

using ;

namespace FTPComponent

{

///

/// 获取系统文件图标,Designed by YJWang 2/20/2012

///

public class SystemIcon

{

#region 【内部类型定义】

#region 【Enums】

///

/// 文件信息标识枚举类,所有枚举定义值前省略SHGFI投标,比如Icon 完整名称应为SHGFI_ICON

///

[Flags]

private enum SHFileInfoFlags : uint

{

///

/// 允许有叠加图案的文件图标,该标识必须和Icon同时使用

///

AddOveylays = 0x20,

///

/// 只获取由参数FileAttribute指定的文件信息,并将其写入SHFileInfo结构的dwAttributes属性,

如果不指定该标识,将同时获取所有文件信息。该标志不能和Icon标识同时使用

* 关键是我在百度搜关键词,竟然搜不到我自己的,只搜到别人的,气愤ing o(╯□╰)o

*/

///

Attr_Specified = 0x20000,

///

/// 将获取的文件属性复制到SHFileInfo结构的dwAttributes属性中

///

Attributes = 0x800,

///

/// 获取文件的显示名称(长文件名称),将其复制到SHFileInfo结构的dwAttributes属性中

///

DisplayName = 0x200,

///

/// 如果文件是可执行文件,将检索其信息,并将信息作为返回值返回

///

ExeType = 0x2000,

///

/// 获得图标和索引,将图标句柄返回到SHFileInfo结构的hIcon属性中,索引返回到iIcon属性中

///

Icon = 0x100,

///

/// 检索包含图标的文件,并将文件名,图标句柄,图标索引号,放回到SHFileInfo结构中

///

IconLocation = 0x1000,

///

/// 获得大图标,该标识必须和Icon标识同时使用

///

LargeIcon = 0x0,

///

/// 获取链接覆盖文件图标,该标识必须和Icon标识同时使用。

///

LinkOverlay = 0x8000,

///

/// 获取文件打开时的图标,该标识必须和Icon或SysIconIndex同时使用

///

OpenIcon = 0x2,

///

/// 获取链接覆盖文件图标索引,该标识必须和Icon标识同时使用。

///

OverlayIndex = 0x40,

///

/// 指示传入的路径是一个ITEMIDLIST结构的文件地址而不是一个路径名。

///

Pidl = 0x8,

///

/// 获取系统的高亮显示图标,该标识必须和Icon标识同时使用。

///

Selected = 0x10000,

///

/// 获取 Shell-sized icon ,该标志必须和Icon标识同时使用。

///

ShellIconSize = 0x4,

///

/// 获得小图标,该标识必须和Icon或SysIconIndex同时使用。

///

SmallIcon = 0x1,

///

/// 获取系统图像列表图标索引,返回系统图像列表句柄

///

SysIconIndex = 0x4000,

///

/// 获得文件类型,类型字符串被写入SHFileInfo结构的szTypeName属性中

///

TypeName = 0x400,

///

/// 指示如果由pszPath指定的路径不存在,SHGetFileInfo方法变不会试图去操作文件。指示返回与

文件类型相关的信息。该标识不能和Attributes、ExeType和Pidl同时使用

///

UseFileAttributes = 0x10

}

///

/// 文件属性枚举

///

[Flags]

private enum FileAttribute

{

ReadOnly = 0x00000001,

Hidden = 0x00000002,

System = 0x00000004,

Directory = 0x00000010, //路径信息

Archive = 0x00000020,

Device = 0x00000040,

Normal = 0x00000080, //普通文件信息

Temporary = 0x00000100,

Sparse_File = 0x00000200,

Reparse_Point = 0x00000400,

Compressed = 0x00000800,

Offline = 0x00001000,

Not_Content_Indexed = 0x00002000,

Encrypted = 0x00004000

}

#endregion 【Enums】

#region 【FileStruct】

///

/// 定义返回的文件信息结构

///

[StructLayout(tial, CharSet = )]

private struct SHFileInfo

{

///

/// 文件的图标句柄

///

public IntPtr hIcon;

///

/// 图标的系统索引号

///

public IntPtr iIcon;

///

/// 文件的属性值,由FileAttribute指定的属性。

///

public uint dwAttributes;

///

/// 文件的显示名,如果是64位系统,您可能需要制定SizeConst=258而非260才能够显示完整的

TypeName

///

[MarshalAs(Str, SizeConst = 260)]

public string szDisplayName;

///

/// 文件的类型名

///

[MarshalAs(Str, SizeConst = 80)]

public string szTypeName;

}

#endregion 【FileStruct】

#endregion 【内部类型定义】

#region 【DLLImport】

///

/// 引用shell32文件的SHGetFileInfo API方法

///

/// 指定的文件名

/// 文件属性

/// 返回获得的文件信息,是一个记录类型

/// 文件的类型名

/// 文件信息标识

///

[DllImport("shell32", EntryPoint = "SHGetFileInfo", ExactSpelling = false, CharSet = ,

SetLastError = true)]

private static extern IntPtr SHGetFileInfo(string pszPath, FileAttribute dwFileAttributes, ref

SHFileInfo sfi, int cbFileInfo, SHFileInfoFlags uFlags);

#endregion 【DLLImport】

#region 【静态字段定义】

private static Icon _folderIcon; //文件夹图标

private static Icon _emptyIcon; //空白文件图标

private static Icon _hardDriverIcon; //本地磁盘图标

private static Icon _CDDriverIcon; //本地光驱图标

private static Icon _applicationIcon; //应用程序图标

///

/// 当读取文件图标失败的默认图标索引号

///

public static readonly long ErrorFileIndex = -2;

///

/// 当读取文件夹图标失败的默认图标索引号

///

public static readonly long ErrorFolderIndex = -4;

///

/// 当读取磁盘驱动器图标失败的默认图标索引号

///

public static readonly long ErrorDriverIndex = -8;

///

/// 当读取可执行文件图标失败的默认图标索引号

///

public static readonly long ErrorApplicationIndex = -16;

#endregion 【静态字段定义】

#region 【静态属性】

///

/// 获取 封装的文件夹大图标

///

public static Icon FolderIconLarge

{

get

{

try

{

return new Icon(SystemIcon._folderIcon, new Size(32, 32));

}

catch { return SystemIcon._folderIcon; }

}

}

///

/// 获取 封装的文件夹小图标

///

public static Icon FolderIconSmall

{

get

{

try

{

return new Icon(SystemIcon._folderIcon, new Size(16, 16));

}

catch { return SystemIcon._folderIcon; }

}

}

///

/// 获取 封装的未知文件大图标

///

public static Icon EmptyIconLarge

{

get

{

try

{

return new Icon(SystemIcon._emptyIcon, new Size(32, 32));

}

catch { return SystemIcon._emptyIcon; }

}

}

///

/// 获取 封装的未知文件小图标

///

public static Icon EmptyIconSmall

{

get

{

try

{

return new Icon(SystemIcon._emptyIcon, new Size(16, 16));

}

catch { return SystemIcon._emptyIcon; }

}

}

///

/// 获取 封装的本地磁盘大图标

///

public static Icon HardDriverIconLarge

{

get

{

try

{

return new Icon(SystemIcon._hardDriverIcon, new Size(32, 32));

}

catch { return SystemIcon._hardDriverIcon; }

}

}

///

/// 获取 封装的本地磁盘小图标

///

public static Icon HardDriverIconSmall

{

get

{

try

{

return new Icon(SystemIcon._hardDriverIcon, new Size(16, 16));

}

catch { return SystemIcon._hardDriverIcon; }

}

}

///

/// 获取 封装的本地光驱大图标

///

public static Icon CDDriverIconLarge

{

get

{

try

{

return new Icon(SystemIcon._CDDriverIcon, new Size(32, 32));

}

catch { return SystemIcon._CDDriverIcon; }

}

}

///

/// 获取 封装的本地光驱小图标

///

public static Icon CDDriverIconSmall

{

get

{

try

{

return new Icon(SystemIcon._CDDriverIcon, new Size(16, 16));

}

catch { return SystemIcon._CDDriverIcon; }

}

}

///

/// 获取 封装的应用程序大图标,一般指exe文件

///

public static Icon ApplicationIconLarge

{

get

{

try

{

return new Icon(SystemIcon._applicationIcon, new Size(32, 32));

}

catch { return SystemIcon._applicationIcon; }

}

}

///

/// 获取 封装的应用程序小图标,一般指exe文件

///

public static Icon ApplicationIconSmall

{

get

{

try

{

return new Icon(SystemIcon._applicationIcon, new Size(16, 16));

}

catch { return SystemIcon._applicationIcon; }

}

}

#endregion 【静态属性】

#region 【静态构造函数】

///

/// 静态构造函数,初始化静态变量,不能确定该构造函数在何时执行

///

static SystemIcon()

{

_folderIcon = ;

_emptyIcon = ;

_hardDriverIcon = iver;

_CDDriverIcon = er;

_applicationIcon = ation;

}

#endregion 【静态构造函数】

#region 【公共方法】

#region 【获取文件图标】

///

/// 获取系统文件图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄

///

/// 文件名,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)

/// 标识是获取小图标还是获取大图标

/// 返回一个Icon类型的文件图标对象

public static Icon GetFileIcon(string fileName, bool smallIcon)

{

long lValue;

return GetFileIcon(fileName, smallIcon, out lValue);

}

///

/// 获取系统文件图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄

///

/// 文件名,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)

/// 标识是获取小图标还是获取大图标

/// 输出与返回图标对应的系统图标索引号

/// 返回一个Icon类型的文件图标对象

public static Icon GetFileIcon(string fileName, bool smallIcon, out long imageIndex)

{

if (fileName == null)

{

imageIndex = ErrorFileIndex;

return _emptyIcon;

}

try

{

SHFileInfoFlags uFlags = | conSize;

if (smallIcon)

uFlags |= con;

else

uFlags |= con;

FileInfo fi = new FileInfo(fileName);

if (r().EndsWith(".EXE"))

uFlags |= e;

else

uFlags |= eAttributes;

Icon ic = GetIcon(fileName, , uFlags, out imageIndex);

if (imageIndex == ErrorFileIndex)

{

//是否是exe文件

if (r().EndsWith(".EXE"))

{

imageIndex = ErrorApplicationIndex;

ic = smallIcon ? ApplicationIconSmall : ApplicationIconLarge;

}

else

ic = smallIcon ? EmptyIconSmall : EmptyIconLarge;

}

return ic;

}

catch

{

imageIndex = ErrorFileIndex;

return _emptyIcon;

}

}

///

/// 获取系统图标索引

///

/// 文件名,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)

/// 一个long型的系统图标索引号

public static long GetFileImageIndex(string fileName)

{

if (fileName == null)

{

return ErrorFileIndex;

}

try

{

SHFileInfoFlags uFlags = | conSize |

con;

FileInfo fi = new FileInfo(fileName);

if (r().EndsWith(".EXE"))

uFlags |= e;

else

uFlags |= eAttributes;

long lValue = GetIndex(fileName, , uFlags);

if (lValue == ErrorFileIndex)

{

//是否是exe文件

if (r().EndsWith(".EXE"))

lValue = ErrorApplicationIndex;

}

return lValue;

}

catch

{

return ErrorFileIndex;

}

}

#endregion 【获取文件图标】

#region 【获取文件夹图标】

///

/// 获取系统默认的文件夹图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄

///

/// 标识是获取小图标还是获取大图标

/// 返回一个Icon类型的文件夹图标对象

public static Icon GetFolderIcon(bool smallIcon)

{

long lValue;

return GetFolderIcon(Directory, smallIcon, out lValue);

}

///

/// 获取自定义的文件夹图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄

///

/// 文件夹名称,如果想获取自定义文件夹图标,请指定完整的文件夹名称(如

F:test)

/// 标识是获取小图标还是获取大图标

/// 输出与返回图标对应的系统图标索引号

/// 返回一个Icon类型的文件夹图标对象

public static Icon GetFolderIcon(string fileName, bool smallIcon, out long imageIndex)

{

if (fileName == null)

{

imageIndex = ErrorFolderIndex;

return _folderIcon;

}

SHFileInfoFlags uFlags = | conSize |

eAttributes;

if (smallIcon)

uFlags |= con;

else

uFlags |= con;

Icon ic = GetIcon(fileName, ory, uFlags, out imageIndex);

if (imageIndex < 0)

ic = smallIcon ? FolderIconSmall : FolderIconLarge;

return ic;

}

///

/// 获取系统图标索引

///

/// 文件夹名称,如果想获取自定义文件夹图标索引号,请指定完整的文件夹名

称(如 F:test)

/// 一个long型的系统图标索引号

public static long GetFolderImageIndex(string fileName)

{

if (fileName == null)

{

return ErrorFolderIndex;

}

return GetIndex(fileName, ory,

| conSize

| con

| eAttributes);

}

#endregion 【获取文件夹图标】

#region 【获取磁盘驱动器图标】

///

/// 获取磁盘驱动器图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄

///

/// 有效的磁盘标号,如C、D、I等等,不区分大小写

/// 标识是获取小图标还是获取大图标

/// 返回一个Icon类型的磁盘驱动器图标对象

public static Icon GetDriverIcon(char driverMark, bool smallIcon)

{

long lValue;

return GetDriverIcon(driverMark, smallIcon, out lValue);

}

///

/// 获取磁盘驱动器图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄

///

/// 有效的磁盘标号,如C、D、I等等,不区分大小写

/// 标识是获取小图标还是获取大图标

/// 输出与返回图标对应的系统图标索引号

/// 返回一个Icon类型的磁盘驱动器图标对象

public static Icon GetDriverIcon(char driverMark, bool smallIcon, out long imageIndex)

{

//非有效盘符,返回封装的磁盘图标

if (driverMark < 'a' && driverMark > 'z' && driverMark < 'A' && driverMark > 'Z')

{

imageIndex = ErrorDriverIndex;

return _hardDriverIcon;

}

string driverName = ng().ToUpper() + ":";

SHFileInfoFlags uFlags = | conSize |

eAttributes;

if (smallIcon)

uFlags |= con;

else

uFlags |= con;

Icon ic = GetIcon(driverName, , uFlags, out imageIndex);

if (imageIndex == ErrorFileIndex)

{

imageIndex = ErrorDriverIndex;

ic = smallIcon ? HardDriverIconSmall : HardDriverIconLarge;

}

return ic;

}

///

/// 获取系统图标索引

///

/// 文件夹名称,如果想获取自定义文件夹图标索引号,请指定完整的文件夹名

称(如 F:test)

/// 一个long型的系统图标索引号

public static long GetDriverImageIndex(char driverMark)

{

//非有效盘符,返回封装的磁盘图标

if (driverMark < 'a' && driverMark > 'z' && driverMark < 'A' && driverMark > 'Z')

{

return ErrorDriverIndex;

}

string driverName = ng().ToUpper() + ":";

long lValue = GetIndex(driverName, ,

| conSize

| con

|

eAttributes);

if (lValue == ErrorFileIndex)

{

lValue = ErrorDriverIndex;

}

return lValue;

}

#endregion 【获取磁盘驱动器图标】

#region 【获取文件类型】

///

/// 获取指定文件的类型描述

///

/// 文件名

/// 返回文件所属类型的类型描述

public static string GetTypeName(string fileName)

{

string typeName = GetTypeName(fileName, ,

eAttributes | me | yName);

if (OrEmpty(typeName))

return "";

else

return ();

}

#endregion 【获取文件类型】

#endregion 【公共方法】

#region 【私有方法】

///

/// 获取系统图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄

///

/// 文件名或路径名

/// 文件信息

/// 信息控制字

/// 输出与返回图标对应的系统图标索引号

/// 获取到的Icon对象

private static Icon GetIcon(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag, out long

imageIndex)

{

try

{

SHFileInfo fi = new SHFileInfo();

Icon ic = null;

int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag);

ic = ndle();

imageIndex = 64(); //设置图标索引号

return ic;

}

catch (Exception ex)

{

if (dwAttr == ory)

{

imageIndex = ErrorFolderIndex;

return _folderIcon;

}

else

{

imageIndex = ErrorFileIndex;

return _emptyIcon;

}

}

}

///

/// 获取系统图标索引号

///

/// 文件名或路径名

/// 文件信息

/// 信息控制字

/// 一个long型的系统图标索引号

private static long GetIndex(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag)

{

try

{

SHFileInfo fi = new SHFileInfo();

int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag);

return 64();

}

catch (Exception ex)

{

if (dwAttr == ory)

return ErrorFolderIndex;

else

return ErrorFileIndex;

}

}

///

/// 获取文件类型

///

/// 文件名

/// 文件信息

/// 信息控制字

///

private static string GetTypeName(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag)

{

try

{

SHFileInfo fi = new SHFileInfo();

int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag);

return Name;

}

catch

{

return "";

}

}

#endregion 【私有方法】

}

}

本文标签: 图标获取文件返回信息