建立自己的资源管理器
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)
一大堆代码!难道不能给个效果界图先?