建立自己的资源管理器

renyx(原作) 关键字:csharp,c#,explorer

这篇文章介绍了如何得到本地系统信息,通过使用System.Management和Sysetm.IO 来得到文件夹和文件信息,并且把它们显示到TreeView、ListView控件z之中。

首先可以使用ManagementObjectSearcher类来查询system.management域,来获取返回ManagementOjbectCollection,在这个对象中,包含了我们所需要的信息,包括盘,文件夹,文件,现在让我们来看一下整个源码:

private System.Windows.Forms.Splitter splitter1;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
private System.Windows.Forms.MenuItem menuItem3;
private System.Windows.Forms.MenuItem menuItem4;
private System.Windows.Forms.TreeView tvFolders;
private System.Windows.Forms.ListView lvFiles;
private System.Windows.Forms.ImageList m_imageListTreeView;
private System.ComponentModel.IContainer components;

///
/// 这里是ide自动产生的
///
private void PopulateDriveList()
{
    TreeNode nodeTreeNode;
    int imageIndex = 0;
    int selectIndex = 0;

    const int Removable = 2;
    const int LocalDisk = 3;
    const int Network = 4;
    const int CD = 5;

    this.Cursor = Cursors.WaitCursor;

    tvFolders.Nodes.Clear();//清空树
    nodeTreeNode = new TreeNode("My Computer", 0, 0);//
    tvFolders.Nodes.Add(nodeTreeNode);

    TreeNodeCollection nodeCollection = nodeTreeNode.Nodes;

    ManagementObjectCollection queryCollection = getDrives();
    foreach (ManagementObject mo in queryCollection)
    {
        switch (int.Parse(mo["DriveType"].ToString()))
        {
            case Removable:     //可移动盘
                imageIndex = 5;
                selectIndex = 5;
                break;
            case LocalDisk:     //本地磁盘
                imageIndex = 6;
                selectIndex = 6;
                break;
            case CD:            //光盘
                imageIndex = 7;
                selectIndex = 7;
                break;
            case Network:       //网络驱动盘
                imageIndex = 8;
                selectIndex = 8;
                break;
            default:            //默认
                imageIndex = 2;
                selectIndex = 3;
                break;
        }
        //建立驱动盘的节点
        nodeTreeNode = new TreeNode(mo["Name"].ToString() + "\\", imageIndex, selectIndex);

        nodeCollection.Add(nodeTreeNode);
    }

    //Init files ListView
    InitListView();

    this.Cursor = Cursors.Default;
}

private void tvFolders_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
    this.Cursor = Cursors.WaitCursor;

    //获取当前选择的节点或则文件夹
    TreeNode nodeCurrent = e.Node;

    //清除掉所有的节点
    nodeCurrent.Nodes.Clear();

    if (nodeCurrent.SelectedImageIndex == 0)
    {
        PopulateDriveList();
    }
    else
    {
        PopulateDirectory(nodeCurrent, nodeCurrent.Nodes);
    }
    this.Cursor = Cursors.Default;
}

protected void InitListView()
{
    //开始初始化 ListView 控件
    lvFiles.Clear();
    //为察看列表框建立头信息栏
    lvFiles.Columns.Add("Name", 150, System.Windows.Forms.HorizontalAlignment.Left);
    lvFiles.Columns.Add("Size", 75, System.Windows.Forms.HorizontalAlignment.Right);
    lvFiles.Columns.Add("Created", 140, System.Windows.Forms.HorizontalAlignment.Left);
    lvFiles.Columns.Add("Modified", 140, System.Windows.Forms.HorizontalAlignment.Left);
}

protected void PopulateDirectory(TreeNode nodeCurrent, TreeNodeCollection nodeCurrentCollection)
{
    TreeNode nodeDir;
    int imageIndex = 2;
    int selectIndex = 3;

    if (nodeCurrent.SelectedImageIndex != 0)
    {
        try
        {
            if (Directory.Exists(getFullPath(nodeCurrent.FullPath)) == false)
            {
                MessageBox.Show("Directory or path " + nodeCurrent.ToString() + " does not exist.");
            }
            else
            {
                PopulateFiles(nodeCurrent);

                string[] stringDirectories = Directory.GetDirectories(getFullPath(nodeCurrent.FullPath));
                string stringFullPath = "";
                string stringPathName = "";

                //循环搜索整个目录
                foreach (string stringDir in stringDirectories)
                {
                    stringFullPath = stringDir;
                    stringPathName = GetPathName(stringFullPath);

                    //创建目录节点
                    nodeDir = new TreeNode(stringPathName.ToString(), imageIndex, selectIndex);
                    nodeCurrentCollection.Add(nodeDir);
                }
            }
        }
        catch (IOException e)
        {
            MessageBox.Show("Error: Drive not ready or directory does not exist.");
        }
        catch (UnauthorizedAccessException e)
        {
            MessageBox.Show("Error: Drive or directory access denided.");
        }
        catch (Exception e)
        {
            MessageBox.Show("Error: " + e);
        }
    }
}

protected string GetPathName(string stringPath)
{
    //得到文件的数目
    string[] stringSplit = stringPath.Split('\\');
    int _maxIndex = stringSplit.Length;
    return stringSplit[_maxIndex - 1];
}

protected void PopulateFiles(TreeNode nodeCurrent)
{
    string[] lvData = new string[4];
    InitListView();

    if (nodeCurrent.SelectedImageIndex != 0)
    {
        //检查路径
        if (Directory.Exists((string)getFullPath(nodeCurrent.FullPath)) == false)
        {
            MessageBox.Show("Directory or path " + nodeCurrent.ToString() + " does not exist.");
        }
        else
        {
            try
            {
                string[] stringFiles = Directory.GetFiles(getFullPath(nodeCurrent.FullPath));
                string stringFileName = "";
                DateTime dtCreateDate, dtModifyDate;
                Int64 lFileSize = 0;

                foreach (string stringFile in stringFiles)
                {
                    stringFileName = stringFile;
                    FileInfo objFileSize = new FileInfo(stringFileName);
                    lFileSize = objFileSize.Length;
                    dtCreateDate = objFileSize.CreationTime; //得到建立文件时候的时间;
                    dtModifyDate = objFileSize.LastWriteTime; //得到最后修改文件时候的时间;

                    lvData[0] = GetPathName(stringFileName);
                    lvData[1] = formatSize(lFileSize);

                    if (TimeZone.CurrentTimeZone.IsDaylightSavingTime(dtCreateDate) == false)
                    {
                        lvData[2] = formatDate(dtCreateDate.AddHours(1));
                    }
                    else
                    {
                        lvData[2] = formatDate(dtCreateDate);
                    }

                    if (TimeZone.CurrentTimeZone.IsDaylightSavingTime(dtModifyDate) == false)
                    {
                        lvData[3] = formatDate(dtModifyDate.AddHours(1));
                    }
                    else
                    {
                        lvData[3] = formatDate(dtModifyDate);
                    }

                    ListViewItem lvItem = new ListViewItem(lvData, 0);
                    lvFiles.Items.Add(lvItem);
                }
            }
            catch (IOException e)
            {
                MessageBox.Show("Error: Drive not ready or directory does not exist.");
            }
            catch (UnauthorizedAccessException e)
            {
                MessageBox.Show("Error: Drive or directory access denided.");
            }
            catch (Exception e)
            {
                MessageBox.Show("Error: " + e);
            }
        }
    }
}

protected string getFullPath(string stringPath)
{
    //得到完整的路径
    string stringParse = "";
    //移除掉“My Computer"名称
    stringParse = stringPath.Replace("My Computer\\", "");

    return stringParse;
}

protected ManagementObjectCollection getDrives()
{
    //收集驱动
    ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * From Win32_LogicalDisk ");
    ManagementObjectCollection queryCollection = query.Get();

    return queryCollection;
}

protected string formatDate(DateTime dtDate)
{
    //以短格式得到日期和时间
    string stringDate = "";
    stringDate = dtDate.ToShortDateString().ToString() + " " + dtDate.ToShortTimeString().ToString();

    return stringDate;
}

protected string formatSize(Int64 lSize)
{
    string stringSize = "";
    NumberFormatInfo myNfi = new NumberFormatInfo();//根据区域定义如何设置数字格式和如何显示数字格式

    Int64 lKBSize = 0;

    if (lSize < 1024)
    {
        if (lSize == 0)
        {
            stringSize = "0";
        }
        else
        {
            stringSize = "1";
        }
    }
    else
    {
        lKBSize = lSize / 1024;
        stringSize = lKBSize.ToString("n", myNfi);
        //移除掉浮点数
        stringSize = stringSize.Replace(".00", "");
    }

    return stringSize + " KB";
}

private void menuItem2_Click(object sender, System.EventArgs e)
{
    //退出应用程序
    this.Close();
}

}
}


对该文的评论 人气:346

bineon (2004-2-29 18:30:43)

一大堆代码!难道不能给个效果界图先?

Contributors: FHL