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#代码示例)
然后将listView的SmallImageList(小图标)的属性指定为添加的ImageList。(可以直接在窗体修改listView的属性,这里用C#代码示例)
IsFile是标识是否为文件夹。文件夹没有扩展名,所以将其单另分开。
效果图:
但如果想读取系统盘的图标,如:
读系统盘的图标,就不能用扩展名了,因为其没有扩展名,而我们已经把无扩展名认为是文件夹了。所以读系统盘我们也单独分开了。
这块是树显示图标。比listView就容易多了。因为它有image属性,直接赋值就可以了。
没有做不出来的东西,但需要我们相信自己。还有,有不明白的一定要多问,没准别人的一句话就能让你豁然开朗。(其实我的这套思路,也是经组长点播之后才明白的)。
详见: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.
没有做不出来的东西,但需要我们相信自己。还有,有不明白的一定要多问,没准别人的一句话就能让你豁然开朗。(其实我的这套思路,也是经组长点播之后才明白的)。
相关文章推荐
- C#OpenFileDialog会改变当前路径
- 使用C# 未解决的问题(VS2012)
- C#之WCF
- C# UDP NAT 打洞 代码示例
- 使用C#和Thrift来访问Hbase实例
- 使用C#和Thrift来访问Hbase实例
- C# 在字符串指定位置之前插入新的字符串
- extern和DLLImport(c#)
- C# 判断远程文件是否存在
- 无废话WCF入门教程四[WCF的配置文件]
- [转]大白话系列之C#委托与事件讲解(三)
- .net C# 中 thread 开启线程之后获取当前线程的信息
- C# 6.0的属性(Property)的语法与初始值
- C#中List<T>的用法
- 《C#开发常用免费WebServices集合》
- C# 复制幻灯片(包括格式、背景、图片等)到同/另一个PPT文档
- 文件保存方法
- C# 复制幻灯片(包括格式、背景、图片等)到同/另一个PPT文档
- c# 操作Word
- c# dynamic的属性是个变量