建立自己的资源管理器

原创 2004年02月27日 10:20:00

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

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

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();
  }

 }
}

用java实现的资源管理器

功能分析 资源管理器树形结构的显示。 菜单的显示和操作。 文件夹的操作,新建、删除、拷贝、移动等。 文件的操作,新建、删除、拷贝、移动等。 参考Linux和windows下的资源管理器。 实现思路 用...
  • jiaxingzheng
  • jiaxingzheng
  • 2015年03月14日 22:32
  • 2677

用Visual C++打造自己的资源管理器

Windows的资源管理器想必大家都用过,该程序的窗口一分为二,左边的窗口显示本机当前所有驱动器以及驱动器中的所有文件夹,当用户单击文件夹后,如果该文件夹下面还有子文件夹,则上层文件夹展开显示下级的文...
  • hczhiyue
  • hczhiyue
  • 2014年01月16日 22:18
  • 1735

Visual Studio 2012之“解决方案资源管理器”靠左靠右

一.本人一直使用Visual Studio2012作为开环境进行项目开发,每次打开vs2012,创建一个新的项目时,“解决方案资源管理器”都是靠左边的,如: 可是晚上打开VS2012时,突然变成了这...
  • lixiaogang_theanswer
  • lixiaogang_theanswer
  • 2016年11月27日 20:21
  • 2753

BHO--嵌入资源管理器窗口

参考了别人提供的方法,自己补充完整了一些,就算作翻译吧。 资源管理器嵌入插件实现说明 一.           核心思想 添加子窗口,使插件窗口与资源管理器的文件列表窗口共同拆分右侧窗口。 二...
  • ryanbanks
  • ryanbanks
  • 2015年05月20日 11:25
  • 1102

C#实现Windows资源管理器文件预览

上一篇文章大致介绍了一下C++实现Windows文件预览的方法,这里介绍一下通过.NET方式实现文件预览。其实原理还是一样,需要通过实现系统定义的COM接口,包括 IInitializeWithF...
  • hey_zng
  • hey_zng
  • 2016年03月18日 17:54
  • 4858

win7右击应用程序资源管理器停止工作问题

win7右击应用程序资源管理器停止工作问题   方法1: 打开资源管理器——组织——文件夹和搜索选项——查看—— 在缩略图上显示文字图标(取消勾) 方法2: 开始——计算机——右键属性...
  • Crazy_For_Net
  • Crazy_For_Net
  • 2016年05月07日 00:13
  • 4055

Unity3d简单的资源管理器

下面共享一个我自己的资源管理器,很简单的,看起来也明白,主要是我是新手,不想写的太复杂,自己项目使用的好用,便是最好的。using UnityEngine; using System.Collecti...
  • u014678046
  • u014678046
  • 2016年06月27日 10:46
  • 1026

win10资源管理器打开缓慢,自动搜索

win10系统点我的电脑不出现盘符,搜索框还老是自动搜索,图片缩略图,’文件夹也不显示,防火墙不启用。系统网络诊断找不到网络硬件(网络驱动没问题)的解决办法。 Wen10系统点我的电脑搜索框自动搜索,...
  • findstart
  • findstart
  • 2017年05月24日 09:27
  • 873

使用解决方案资源管理器

解决方案资源管理器使您可以在解决方案或项目中查看项并执行项管理任务。它还允许您使用 Visual Studio 编辑器在解决方案或项目上下文的外部处理文件。 “解决方案资源管理器”是集成开发环境 (I...
  • lumennaturale
  • lumennaturale
  • 2017年03月05日 15:10
  • 253

修改win7资源管理器默认启动位置

打开资源管理器属性,在目标(T)后边加上: /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D} 俺滴笨笨原本目标(T)是: %windir%\expl...
  • xin_yu_xin
  • xin_yu_xin
  • 2013年04月16日 09:52
  • 6666
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建立自己的资源管理器
举报原因:
原因补充:

(最多只允许输入30个字)