C#的期中作业做一个资源管理器.先想下整体思路.
资源管理器包括几个部分:
1菜单栏:文件.编辑,查看,收藏,工具,帮助
2标准按钮栏:前进,后退,向上,搜索,树型结构显示,查看
3地址栏:地址,转到
4树型结构,文件列表
5状态栏
当然还有标题栏.
首先考虑树型结构的实现
用treeview,首先建立根节点"我的电脑",然后遍历磁盘驱动器,依次添加到我的电脑根节点下面.如果用递归遍历磁盘下的每个文件添加相应节点显示,那么程序每次运行恐怕要先跑个三四分钟.网上较流行的办法是显示两层节点,既美观又能保证效率,即用两个事件每次节点展开前遍历所选节点下面的两层文件夹添加到次节点下.要用到几个函数和类
首先是遍历磁盘: string[] Drivers = Environment.GetLogicalDrives();这样就可以将本地所有磁盘名存入数组Drivers[]
然后遍历添加就到节点就可以了,添加节点方法:
TreeNode tn = new TreeNode(Drivers[i]);
treeView1.Nodes[0].Nodes.Add(tn);
最后遍历文件夹下的文件:
DirectoryInfo DirInfo = new DirectoryInfo(StrPath);
DirectoryInfo[] Dirs = DirInfo.GetDirectories();
同样得到文件夹下所有文件就用添加节点方法添加到所选节点便可实现想要效果
第二是文件列表的实现
用listView实现当点某个节点或者展开某个接点前获得节点信息,即对应磁盘下的某个文件夹.得到所有文件添加到listView中
首先设置文件显示方式大图标(也可以是小图标,详细信息,列表或者标题显示)添加标题列
listView1.View = View.LargeIcon;
listView1.Columns.Add("名称", 160, HorizontalAlignment.Left);
listView1.Columns.Add("类型", 120, HorizontalAlignment.Left);
listView1.Columns.Add("总大小", 120, HorizontalAlignment.Left);
listView1.Columns.Add("剩余空间", 200, HorizontalAlignment.Left);
为listView显示每行是这样的:把每行的第一列当作父节点,每行的后面几列为子节点;
ListViewItem fileItem = listView1.Items.Add("名称1");
fileItem.SubItems.Add("类型1");
fileItem.SubItems.Add("总大小1");
fileItem.SubItems.Add("剩余空间1");
ListViewItem fileItem = listView1.Items.Add("名称2");
fileItem.SubItems.Add("类型2");
fileItem.SubItems.Add("总大小2");
fileItem.SubItems.Add("剩余空间2");
ListViewItem fileItem = listView1.Items.Add("名称3");
fileItem.SubItems.Add("类型3");
fileItem.SubItems.Add("总大小3");
fileItem.SubItems.Add("剩余空间3");
这样就为listView添加了三行数据.
然后是文件图标的显示,显示原理是首先创建ImagesList集合,遍历文件获得文件信息将时文件图标添加到里面(根据文件扩展名或者文件名),设置为该项显示图标的键,显示的时候根据此键取出图标信息显示出来.只要将ImageList和listView中的ImageList邦定到一起就,系统显示的时候就会自动调用相应的图标具体实现
foreach (FileInfo file in files)
{
ListViewItem fileItem = listView1.Items.Add(file.Name);
if (file.Extension == ".exe" || file.Extension == "") //程序文件或无扩展名
{
Icon fileIcon = GetSystemIcon.GetIconByFileName(file.FullName);
this.LVLargeimageList.Images.Add(file.Name, fileIcon);
this.LVSmallimageList.Images.Add(file.Name, fileIcon);
fileItem.ImageKey = file.Name;
}
else //其它文件
{
if (!this.LVSmallimageList.Images.ContainsKey(file.Extension)) //ImageList中不存在此类图标
{
Icon fileIcon = GetSystemIcon.GetIconByFileName(file.FullName);
this.LVLargeimageList.Images.Add(file.Extension, fileIcon);
this.LVSmallimageList.Images.Add(file.Extension, fileIcon);
}
fileItem.ImageKey = file.Extension;
}
fileItem.Name = file.FullName;
fileItem.SubItems.Add(file.Length / 1000 + "KB");
fileItem.SubItems.Add(file.Extension);
fileItem.SubItems.Add(file.LastWriteTimeUtc.ToString());
}
这样就可以实现图标的显示,listView中图标的显示类似.
这样基本就可以实现资源管理器的大部分内容.
当然中间还涉及了一些,字符串文件名的细节处理.
当然里面还涉及一个问题就是系统图标的获得,网上一般都是调用Windows API
这是自己做的源代码,和大家分享下。