private void fillTree()
{
DirectoryInfo directory;
string sCurPath = ""; // 重新清空
treeView1.Nodes.Clear();
// 将硬盘上的所有的驱动器都列举出来
foreach( char c in driveLetters )
{
sCurPath = c + ":\\";
try
{
// 获得该路径的目录信息
directory = new DirectoryInfo(sCurPath);
// 如果获得的目录信息正确,则将它添加到目录树视中
if ( directory.Exists == true )
{
TreeNode newNode = new TreeNode(directory.FullName);
treeView1.Nodes.Add(newNode); // 添加新的节点到根节点
getSubDirs(newNode);
// 调用getSubDirs()函数,检查该驱动器上的任何存在子目录
}
}
catch( Exception doh)
{
Console.WriteLine(doh.Message);
}
}
}
private void getSubDirs( TreeNode parent )
{
DirectoryInfo directory;
try
{
// 如果还没有检查过这个文件夹,则检查之
if ( parent.Nodes.Count == 0 )
{
directory = new DirectoryInfo(parent.FullPath);
foreach( DirectoryInfo dir in directory.GetDirectories())
{
// 新建一个数节点,并添加到目录树视
TreeNode newNode = new TreeNode(dir.Name);
parent.Nodes.Add(newNode);
}
}
foreach(TreeNode node in parent.Nodes)
{
// 如果还没有检查过这个文件夹,则检查
if (node.Nodes.Count == 0)
{
directory = new DirectoryInfo(node.FullPath);
// 检查该目录上的任何子目录
foreach( DirectoryInfo dir in directory.GetDirectories())
{
// 新建一个数节点,并添加到目录树视
TreeNode newNode = new TreeNode(dir.Name);
node.Nodes.Add(newNode);
}
}
}
}
catch( Exception doh )
{
Console.WriteLine(doh.Message);
}
}
private string fixPath( TreeNode node )
{
string sRet = "";
try
{
sRet = node.FullPath;
int index = sRet.IndexOf("\\\\");
if (index > 1 )
{
sRet = node.FullPath.Remove(index, 1);
}
}
catch( Exception doh )
{
Console.WriteLine(doh.Message);
}
return sRet;
}
接着,给该类添加以下几个属性,这几个属性都是反映所选择的目录的相关信息的,它们将被主窗体的类调用:
public string name// 返回所选择的目录的名称
{
get { return ((folder != null && folder.Exists))? folder.Name : null; }
} public string fullPath// 返回所选择的目录的完整路径
{
get { return ((folder != null && folder.Exists && treeView1.SelectedNode != null))? fixPath(treeView1.SelectedNode) : null; }
}
public DirectoryInfo info// 返回所选择的目录的信息
{
get { return ((folder != null && folder.Exists))? folder : null; }
}
最后,还要添加目录树控件的BeforeSelect()和BeforeExpand()事件函数以及两个按钮的OnClick事件函数。BeforeSelect()事件函数是用户选定目录前的一个事件函数,它完成了子目录取得、设置文本框内容、获取该目录信息等功能。同样,BeforeExpand()事件函数完成相似的功能,只不过它是在目录节点被展开前发生的。具体的函数实现如下:
private void treeView1_BeforeSelect(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
{
getSubDirs(e.Node); // 取得选择节点的子文件夹
textBox1.Text = fixPath(e.Node); // 更新文本框内容
folder = new DirectoryInfo(e.Node.FullPath); // 获得它的目录信息