twzheng's cppblog

『站在风口浪尖紧握住鼠标旋转!』 http://www.cnblogs.com/twzheng

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  136 随笔 :: 78 文章 :: 353 评论 :: 0 Trackbacks

 

//C#资源管理器源码
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;

namespace myTree
{
    
/// <summary>
    
/// Form1 的摘要说明。
    
/// </summary>

    public class Form1 : System.Windows.Forms.Form
    
{
        
private System.Windows.Forms.ImageList TreeImageList;
        
private System.Windows.Forms.MainMenu mainMenu1;
        
private System.Windows.Forms.MenuItem menuItem1;
        
private System.Windows.Forms.ListView listView1;
        
private System.Windows.Forms.TextBox textBox1;
        
private System.Windows.Forms.TreeView treeView1;
        
private System.Windows.Forms.Panel panel2;
        
private System.Windows.Forms.Panel panel1;
        
private System.Windows.Forms.Splitter splitter1;
        
private System.Windows.Forms.Button button1;
        
private System.Windows.Forms.ImageList LisrimageList;
        
private System.Windows.Forms.ImageList LisrimageList2;
        
private System.Windows.Forms.StatusBar statusBar1;
        
private System.Windows.Forms.StatusBarPanel statusBarPanel1;
        
private System.Windows.Forms.StatusBarPanel statusBarPanel2;
        
private System.Windows.Forms.MenuItem menuItem2;
        
private System.Windows.Forms.MenuItem menuItem3;
        
private System.Windows.Forms.MenuItem menuItem4;
        
private System.Windows.Forms.MenuItem menuItem5;
        
private System.Windows.Forms.MenuItem menuItem6;
        
private System.Windows.Forms.MenuItem menuItem7;
        
private System.Windows.Forms.Label label1;
        
private System.ComponentModel.IContainer components;

        
public Form1()
        
{
            
//
            
// Windows 窗体设计器支持所必需的
            
//
            InitializeComponent();

            Icon ic0 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"15);
            TreeImageList.Images.Add(ic0);
            Icon ic1 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"5);
            TreeImageList.Images.Add(ic1);
            Icon ic2 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"7);
            TreeImageList.Images.Add(ic2);
            Icon ic3 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"11);
            TreeImageList.Images.Add(ic3);

            Icon ic4 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"3);
            TreeImageList.Images.Add(ic4);
            Icon ic5 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"4);
            TreeImageList.Images.Add(ic5);
            Icon ic6 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"101);
            TreeImageList.Images.Add(ic6);


            GetDrive();
        }


        
/// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose(bool disposing)
        
{
            
if (disposing)
            
{
                
if (components != null)
                
{
                    components.Dispose();
                }

            }

            
base.Dispose(disposing);
        }


        
Windows Form Designer generated code

        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main()
        
{
            Application.Run(
new Form1());
        }


        
//*************************************************************************************
        [DllImport("Shell32.dll")]
        
public static extern int ExtractIcon(IntPtr h, string strx, int ii);

        [DllImport(
"Shell32.dll")]
        
public static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);

        
public struct SHFILEINFO
        
{
            
public IntPtr hIcon;
            
public int iIcon;
            
public uint dwAttributes;
            
public char szDisplayName;
            
public char szTypeName;
        }



        
string strFilePath = "";
        
//************************************************************************************* 

        
protected virtual Icon myExtractIcon(string FileName, int iIndex)
        
{
            
try
            
{
                IntPtr hIcon 
= (IntPtr)ExtractIcon(this.Handle, FileName, iIndex);
                
if (!hIcon.Equals(null))
                
{
                    Icon icon 
= Icon.FromHandle(hIcon);
                    
return icon;
                }

            }

            
catch (Exception ex)
            
{ MessageBox.Show(ex.Message, "错误提示"0, MessageBoxIcon.Error); }
            
return null;
        }

        
//*************************************************************************************

        
protected virtual void SetIcon(ImageList imageList, string FileName, bool tf)
        
{
            SHFILEINFO fi 
= new SHFILEINFO();
            
if (tf == true)
            
{
                
int iTotal = (int)SHGetFileInfo(FileName, 0ref fi, 10016640);//SHGFI_ICON|SHGFI_SMALLICON
                try
                
{
                    
if (iTotal > 0)
                    
{
                        Icon ic 
= Icon.FromHandle(fi.hIcon);
                        imageList.Images.Add(ic);
                        
//return ic;
                    }

                }

                
catch (Exception ex)
                
{ MessageBox.Show(ex.Message, "错误提示"0, MessageBoxIcon.Error); }
            }

            
else
            
{
                
int iTotal = (int)SHGetFileInfo(FileName, 0ref fi, 100257);
                
try
                
{
                    
if (iTotal > 0)
                    
{
                        Icon ic 
= Icon.FromHandle(fi.hIcon);
                        imageList.Images.Add(ic);
                        
//return ic;
                    }

                }

                
catch (Exception ex)
                
{ MessageBox.Show(ex.Message, "错误提示"0, MessageBoxIcon.Error); }
            }

            
// return null;
        }

        
//*************************************************************************************

        
public void GetDrive()
        
{
            treeView1.ImageList 
= TreeImageList;

            treeView1.BeginUpdate();
            treeView1.Nodes.Clear();

            TreeNode RootNode 
= new TreeNode("我的电脑"00);
            treeView1.Nodes.Add(RootNode);

            
int iImageIndex = 2int iSelectedIndex = 2;
            
string[] astrDrives = Directory.GetLogicalDrives();

            
foreach (string str in astrDrives)
            
{
                
if (str == "A:\\")
                
{ iImageIndex = 1; iSelectedIndex = 1; }
                
else if (str == "G:\\")
                
{ iImageIndex = 3; iSelectedIndex = 3; }
                
else
                
{ iImageIndex = 2; iSelectedIndex = 2; }

                TreeNode tnDrive 
= new TreeNode(str, iImageIndex, iSelectedIndex);
                treeView1.Nodes[
0].Nodes.Add(tnDrive);
                AddDirectories(tnDrive);

                
if (str == "C:\\")
                
{ treeView1.SelectedNode = tnDrive; }
            }

            treeView1.EndUpdate();
        }

        
//*************************************************************************************

        
void AddDirectories(TreeNode tn)
        
{
            tn.Nodes.Clear();

            
string strPath = tn.FullPath;
            strPath 
= strPath.Remove(05);

            
//获得当前目录
            DirectoryInfo dirinfo = new DirectoryInfo(strPath);
            DirectoryInfo[] adirinfo;
            
try
            
{
                adirinfo 
= dirinfo.GetDirectories();
            }

            
catch
            
return; }

            
int iImageIndex = 4int iSelectedIndex = 5;
            
foreach (DirectoryInfo di in adirinfo)
            
{
                
if (di.Name == "RECYCLER" || di.Name == "RECYCLED" || di.Name == "Recycled")
                
{ iImageIndex = 6; iSelectedIndex = 6; }
                
else
                
{ iImageIndex = 4; iSelectedIndex = 5; }

                TreeNode tnDir 
= new TreeNode(di.Name, iImageIndex, iSelectedIndex);
                tn.Nodes.Add(tnDir);
            }



            
/*
               //获得当前目录下的所有文件 
               FileInfo[] dirFiles;
               dirFiles=dirinfo.GetFiles();
               int iCount=7;

               foreach (FileInfo fi in dirFiles)
               {
              //得到每个文件的图标
              string str=fi.FullName;
              try
              {
                SetIcon(TreeImageList,str,false);
              }
              catch(Exception ex)
              { MessageBox.Show(ex.Message,"错误提示",0,MessageBoxIcon.Error);}
        
              TreeNode tnDir = new TreeNode(fi.Name, iCount, iCount);
              tn.Nodes.Add(tnDir);

              iCount++;
               }
            
*/

        }

        
//*************************************************************************************
        
//在大图标、小图标、详细列表切换时调用
        protected virtual void ListViewAB(int iii)
        
{
            
if (iii == 1)
            
{
                LisrimageList2.ImageSize 
= new Size(3232);
                listView1.LargeImageList 
= LisrimageList2;

                
if (listView1.View == View.Details || listView1.View == View.SmallIcon)
                
{ listView1.View = View.LargeIcon; }
            }

            
else if (iii == 2)
            
{
                
if (listView1.View == View.Details || listView1.View == View.LargeIcon)
                
{ listView1.View = View.SmallIcon; }
            }

            
else
            
{
                
if (listView1.View == View.LargeIcon || listView1.View == View.SmallIcon)
                
{ listView1.View = View.Details; }
            }

        }

        
//*************************************************************************************
        private void treeView1_BeforeExpand_1(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
        
{
            
//base.OnBeforeExpand(e);

            treeView1.BeginUpdate();

            
foreach (TreeNode tn in e.Node.Nodes)
            
{ AddDirectories(tn); }

            treeView1.EndUpdate();
        }


        
//*************************************************************************************

        
protected virtual void InitList(TreeNode tn)
        
{
            
this.statusBarPanel1.Text = "正在刷新文件夹,请稍等..";
            
this.Cursor = Cursors.WaitCursor;

            
this.LisrimageList2.Images.Clear();
            
this.LisrimageList.Images.Clear();
            listView1.SmallImageList 
= LisrimageList;
            Icon ic0 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"3);
            LisrimageList.Images.Add(ic0);
            LisrimageList2.Images.Add(ic0);

            listView1.Clear();
            
//设置列表框的表头
            listView1.Columns.Add("文件名"160, HorizontalAlignment.Left);
            listView1.Columns.Add(
"文件大小"120, HorizontalAlignment.Left);
            listView1.Columns.Add(
"创建时间"120, HorizontalAlignment.Left);
            listView1.Columns.Add(
"访问时间"200, HorizontalAlignment.Left);


            
string strPath = tn.FullPath;
            strPath 
= strPath.Remove(05);
            
//获得当前目录下的所有文件 
            DirectoryInfo curDir = new DirectoryInfo(strPath);//创建目录对象。
            FileInfo[] dirFiles;
            
try
            
{
                dirFiles 
= curDir.GetFiles();
            }

            
catch return; }

            
string[] arrSubItem = new string[4];
            
//文件的创建时间和访问时间。
            int iCount = 0int iconIndex = 1;//用1,而不用0是要让过0号图标。
            foreach (FileInfo fileInfo in dirFiles)
            
{
                
string strFileName = fileInfo.Name;

                
//如果不是文件pagefile.sys
                if (!strFileName.Equals("pagefile.sys"))
                
{
                    arrSubItem[
0= strFileName;
                    arrSubItem[
1= fileInfo.Length + " 字节";
                    arrSubItem[
2= fileInfo.CreationTime.ToString();
                    arrSubItem[
3= fileInfo.LastAccessTime.ToString();
                }

                
else
                
{ arrSubItem[1= "未知大小"; arrSubItem[2= "未知日期"; arrSubItem[3= "未知日期"; }


                
//得到每个文件的图标
                string str = fileInfo.FullName;
                
try
                
{
                    SetIcon(LisrimageList, str, 
false);
                    SetIcon(LisrimageList2, str, 
true);
                }

                
catch (Exception ex)
                
{ MessageBox.Show(ex.Message, "错误提示"0, MessageBoxIcon.Error); }


                
//插入列表项    
                ListViewItem LiItem = new ListViewItem(arrSubItem, iconIndex);
                listView1.Items.Insert(iCount, LiItem);

                iCount
++;
                iconIndex
++;
            }

            strFilePath 
= strPath;
            textBox1.Text 
= strPath;
            
this.statusBarPanel1.Text = strPath;
            
this.statusBarPanel2.Text = "文件数量: " + iCount.ToString() + "";
            
this.Cursor = Cursors.Arrow;

 

            
//以下是向列表框中插入目录,不是文件。获得当前目录下的各个子目录。
            int iItem = 0;

            DirectoryInfo Dir 
= new DirectoryInfo(strPath);
            
foreach (DirectoryInfo di in Dir.GetDirectories())
            
{
                ListViewItem LiItem 
= new ListViewItem(di.Name, 0);
                listView1.Items.Insert(iItem, LiItem);
                iItem
++;
            }


        }

        
//*************************************************************************************

        
protected virtual void InitList2(string strName)
        
{
            
this.statusBarPanel1.Text = "正在刷新文件夹,请稍等..";
            
this.Cursor = Cursors.WaitCursor;

            
this.LisrimageList2.Images.Clear();
            
this.LisrimageList.Images.Clear();
            listView1.SmallImageList 
= LisrimageList;
            Icon ic0 
= myExtractIcon("%SystemRoot%\\system32\\shell32.dll"3);
            LisrimageList.Images.Add(ic0);
            LisrimageList2.Images.Add(ic0);

            listView1.Clear();
            
//设置列表框的表头
            listView1.Columns.Add("文件名"160, HorizontalAlignment.Left);
            listView1.Columns.Add(
"文件大小"120, HorizontalAlignment.Left);
            listView1.Columns.Add(
"创建时间"120, HorizontalAlignment.Left);
            listView1.Columns.Add(
"访问时间"200, HorizontalAlignment.Left);


            
//获得当前目录下的所有文件 
            DirectoryInfo curDir = new DirectoryInfo(strName);//创建目录对象。
            FileInfo[] dirFiles;
            
try
            
{
                dirFiles 
= curDir.GetFiles();
            }

            
catch return; }

            
string[] arrSubItem = new string[4];
            
//文件的创建时间和访问时间。
            int iCount = 0int iconIndex = 1;//用1,而不用0是要让过0号图标。
            foreach (FileInfo fileInfo in dirFiles)
            
{
                
string strFileName = fileInfo.Name;

                
//如果不是文件pagefile.sys
                if (!strFileName.Equals("pagefile.sys"))
                
{
                    arrSubItem[
0= strFileName;
                    arrSubItem[
1= fileInfo.Length + " 字节";
                    arrSubItem[
2= fileInfo.CreationTime.ToString();
                    arrSubItem[
3= fileInfo.LastAccessTime.ToString();
                }

                
else
                
{ arrSubItem[1= "未知大小"; arrSubItem[2= "未知日期"; arrSubItem[3= "未知日期"; }


                
//得到每个文件的图标
                string str = fileInfo.FullName;
                
try
                
{
                    SetIcon(LisrimageList, str, 
false);
                    SetIcon(LisrimageList2, str, 
true);
                }

                
catch (Exception ex)
                
{ MessageBox.Show(ex.Message, "错误提示"0, MessageBoxIcon.Error); }


                
//插入列表项    
                ListViewItem LiItem = new ListViewItem(arrSubItem, iconIndex);
                listView1.Items.Insert(iCount, LiItem);

                iCount
++;
                iconIndex
++;//必须加在listView1.Items.Insert(iCount,LiItem);
            }

            strFilePath 
= strName;//把路径赋值于全局变量strFilePath

            textBox1.Text 
= strName;
            
this.statusBarPanel2.Text = "文件数量: " + iCount.ToString() + "";
            
this.Cursor = Cursors.Arrow;

 

            
//以下是向列表框中插入目录,不是文件。获得当前目录下的各个子目录。
            int iItem = 0;//调用listView1.Items.Insert(iItem,LiItem);时用。不能使用iconIndex。

            DirectoryInfo Dir 
= new DirectoryInfo(strName);//创建目录对象。
            foreach (DirectoryInfo di in Dir.GetDirectories())
            
{
                ListViewItem LiItem 
= new ListViewItem(di.Name, 0);
                listView1.Items.Insert(iItem, LiItem);
                iItem
++;
            }


        }

        
//*************************************************************************************

        
private void treeView1_AfterSelect_1(object sender, System.Windows.Forms.TreeViewEventArgs e)
        
{
            
if (e.Node.Text == "我的电脑")
            
return; }

            InitList(e.Node);
        }

        
//*************************************************************************************

        
private void button1_Click(object sender, System.EventArgs e)
        
{
            
this.panel1.Hide();
        }

        
//*************************************************************************************

        
private void listView1_ItemActivate(object sender, System.EventArgs e)
        
{
            
string str = Path.Combine(strFilePath, listView1.FocusedItem.Text);
            
try
            
{
                
if (listView1.FocusedItem.SubItems.Count > 1)
                
{ System.Diagnostics.Process.Start(str); }
                
else
                
{ InitList2(str); }
            }

            
catch return; }
        }

        
//*************************************************************************************
        private void menuItem3_Click(object sender, System.EventArgs e)
        
{
            
this.panel1.Visible = !panel1.Visible;
        }

        
//*************************************************************************************
        private void menuItem5_Click(object sender, System.EventArgs e)
        
{
            ListViewAB(
1);
        }

        
//*************************************************************************************
        private void menuItem6_Click(object sender, System.EventArgs e)
        
{
            ListViewAB(
2);
        }

        
//*************************************************************************************
        private void menuItem7_Click(object sender, System.EventArgs e)
        
{
            ListViewAB(
3);
        }

        
//*************************************************************************************

    }

}
posted on 2008-07-07 20:06 谭文政 阅读(4984) 评论(0)  编辑 收藏 引用 所属分类: C#

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理