您的位置:首页 > 编程语言 > C#

C#读取系统文件信息(二)——调API读取系统文件及系统盘Icon图标

2016-07-06 20:31 459 查看
    上回说到读取文件信息,我们建立了一个工具类,该类可以读取系统文件信息。读取文件Icon的方法也在那里

    详见:C#读取系统文件信息(一)——调API读取文件类型


需求:

    做类似资源管理器的一个系统,现已读出各盘文件信息,需要我读出文件的类型以及图标,并显示在ListViewItem中。

    这次跟大家分享一下如何显示图标。
    逻辑是这样的:

    ListViewItem是不能直接显示图标的。我们需要先建立一个ImageList。然后将listView的SmallImageList(小图标)属性指定为建立的ImageList。

    过程中,我们会将读取的图标信息存放在ImageList的Images中。

    ListViewItem中有一个属性是ImageIndex。我们输入int值,它会返回Images中对应的Icon。

    但我们读图标,一般用扩展名,怎么对应上它的int值呢?我们可以用一个哈希表

    读取图标后,首先放在Images中,然后在哈希表中添加(extension(扩展名), _imgList.Images.Count - 1(图标在images中的位置))

    这样,我们就可以遍历文件,扩展名为key值,首先看哈希表中是否存在,若存在,返回int值,不存在,则通过工具类读取图标,然后添加到images和哈希表。

    有了int值(相应图标在images中的位置),我们就可以通过ListViewItem的ImageIndex属性来显示图标了。

    过程:

    建立一个ImageList(直接在listView中拉取控件也可,这里用C#代码示例) 

private ImageList _imgList = new ImageList();


    然后将listView的SmallImageList(小图标)的属性指定为添加的ImageList。(可以直接在窗体修改listView的属性,这里用C#代码示例)

this.lstView.SmallImageList = _imgList;
    实例化工具类和一个Hashtable

private Hashtable _icoHash = new Hashtable();
private FileIconUtil _iconUtil = new FileIconUtil();
    定义一个ListViewItem

ListViewItem itemMain;
    我将读取图标int的方法抽出来了

/// <summary>
/// 获得图标的index-赵寒-2016-6-22
/// </summary>
/// <param name="extension">扩展名</param>
/// <param name="isFile">false:表示文件夹</param>
/// <returns></returns>
int IcoIndex(string extension, bool isFile){
if (this._icoHash.ContainsKey(extension)) {
return (int)_icoHash[extension];
}
else{
if (isFile){
_imgList.Images.Add(this._iconUtil.GetIcon(extension, false).ToBitmap());
_icoHash.Add(extension, _imgList.Images.Count - 1);
return (int)_icoHash[extension];
}
else{
_imgList.Images.Add(_iconUtil.GetDirectoryIcon(false).ToBitmap());
_icoHash.Add(extension, _imgList.Images.Count - 1);
return (int)_icoHash[extension];
}
}
}
    直接调用即可,如:

itemMain.ImageIndex = IcoIndex(f.Extension,f.IsFile);
    这样图标就可以显示了。

    IsFile是标识是否为文件夹。文件夹没有扩展名,所以将其单另分开。

效果图:



    但如果想读取系统盘的图标,如:



    读系统盘的图标,就不能用扩展名了,因为其没有扩展名,而我们已经把无扩展名认为是文件夹了。所以读系统盘我们也单独分开了。
    这块是树显示图标。比listView就容易多了。因为它有image属性,直接赋值就可以了。

Icon fileico;//定义一个Icon
int pathIndex = tNode.Name.LastIndexOf("\\");//因为我获取到的tNode.Name是:C:\\或D:\\,这不是我要的格式,我需要把\\去掉
string name= tNode.Name.Substring(0, pathIndex);//去掉\\后,得到系统盘文件名,如C: D:通过盘名读图标。
fileico = getIco.GetIcon(name, false);//false是指定返回小图标的意思。这里的GetIcon还是上边抽出的那个方法
tNode.Image = fileico.ToBitmap();//这样就可以显示了
    这是我读取图标的过程。希望能帮到你。如果有不明白的地方,请联系:QQ:1027189006.

    没有做不出来的东西,但需要我们相信自己。还有,有不明白的一定要多问,没准别人的一句话就能让你豁然开朗。(其实我的这套思路,也是经组长点播之后才明白的)。

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: