2011-03-16 42 views
1

我需要关于如何将我的驱动器映射到树形视图的帮助。我可以让我的驱动器显示,但我无法获得所有的子目录。我想让我的整个驱动器映射到树形视图中。任何帮助,将不胜感激。这是我到目前为止。将整个驱动器映射到树形视图

 string[] drives = Environment.GetLogicalDrives(); 
     foreach (string dr in drives) 
     { 
      TreeNode node = new TreeNode(dr); 
      node.Tag = dr; 
      treeView1.Nodes.Add(node); 
     } 
     treeView1.CollapseAll(); 
+0

你在找这样的吗? http://www.dreamincode.net/code/snippet2591.htm您将不得不修改您现有的代码以递归访问每个驱动器 – WorldIsRound 2011-03-16 22:19:43

+0

您的代码甚至不尝试挖掘子目录。路易斯告诉你如何,但要小心,这可能需要很长的时间。 – 2011-03-16 22:58:25

回答

0

这里有一个延迟加载版本:

private void fillTree() { 
    string[] drives = Environment.GetLogicalDrives(); 
    foreach(string dr in drives) { 
    TreeNode node = new TreeNode(dr); 
    node.Tag = dr; 
    node.ImageIndex = 0; // drive icon 
    node.Tag = dr; 
    treeView1.Nodes.Add(node); 
    node.Nodes.Add(new TreeNode("?")); 
    } 
    treeView1.BeforeExpand += new TreeViewCancelEventHandler(treeView1_BeforeExpand); 
} 

void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) { 
    if((e.Node.Nodes.Count == 1) && (e.Node.Nodes[0].Text=="?")) { 
    RecursiveDirWalk(e.Node); 
    } 
} 

private TreeNode RecursiveDirWalk(TreeNode node) { 
    string path = (string)node.Tag; 
    node.Nodes.Clear(); 
    string[] dirs = System.IO.Directory.GetDirectories(path); 
    for(int t = 0; t < dirs.Length; t++) { 
    TreeNode n = new TreeNode(dirs[t].Substring(dirs[t].LastIndexOf('\\')+1)); 
    n.ImageIndex = 1; // dir icon 
    n.Tag = dirs[t]; 
    node.Nodes.Add(n); 
    n.Nodes.Add(new TreeNode("?")); 
    } 

    // Optional if you want files as well: 
    string[] files = System.IO.Directory.GetFiles(path); 
    for(int t = 0; t < files.Length; t++) { 
    TreeNode tn = new TreeNode(System.IO.Path.GetFileName(files[t])); 
    tn.Tag = files[t]; 
    tn.ImageIndex = 2; // file icon 
    node.Nodes.Add(tn); 
    } // end of optional file part 

    return node; 
} 
2

要递归地做到这一点:

private void fillTree() { // you allready had most of this 
    string[] drives = Environment.GetLogicalDrives(); 
    foreach(string dr in drives) { 
    TreeNode node = RecursiveDirWalk(dr); 
    node.ImageIndex = 0; // drive icon 
    node.Tag = dr; 
    treeView1.Nodes.Add(node); 
    } 
} 

// now add this 
private TreeNode RecursiveDirWalk(string path) { 
    TreeNode node = new TreeNode(path.Substring(path.LastIndexOf('\\'))); 
    node.ImageIndex = 1; // dir icon 
    node.Tag = path; 
    string[] dirs = System.IO.Directory.GetDirectories(path); 
    for(int t = 0; t < dirs.Length; t++) { 
    node.Nodes.Add(RecursiveDirWalk(dirs[t])); 
    } 

    // Optional if you want files as well: 
    string[] files = System.IO.Directory.GetFiles(path); 
    for(int t = 0; t < files.Length; t++) { 
    TreeNode tn = new TreeNode(System.IO.Path.GetFileName(files[t])); 
    tn.Tag = files[t]; 
    tn.ImageIndex = 2; // file icon 
    node.Nodes.Add(tn); 
    } // end of optional file part 

    return node; 
} 
+0

添加@Louis Somers代码递归执行后,我的树视图中不再显示任何内容。也许我做错了什么。我不知道 – SRH 2011-03-16 22:49:38

+1

我认为你可以更好地在人们钻取时简单加载它。这样你一次只能建立一层树;如果您想在父级别显示摘要详细信息,请选择两项。 – 2011-03-16 23:05:46

0

下面是用于显示,仅在第一次显示驱动器树的代码,添加到树作为用户点击节点。此代码不会显示空的驱动器。添加图标到每个节点留给学生练习:

private static string PLACEHOLDER = "..."; 

    private void ListDrives() 
    { 
     string[] drives = Environment.GetLogicalDrives(); 
     foreach (string drive in drives) 
     { 
      if (Directory.Exists(drive)) 
      { 
       TreeNode node = new TreeNode(drive); 
       node.Tag = drive; 
       this.treeViewFolders.Nodes.Add(node); 
       node.Nodes.Add(new TreeNode(PLACEHOLDER)); 
      } 
     } 
     this.treeViewFolders.BeforeExpand += new TreeViewCancelEventHandler(treeView_BeforeExpand); 
    } 

    void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
    { 
     if (e.Node.Nodes.Count > 0) 
     { 
      if (e.Node.Nodes[0].Text == PLACEHOLDER) 
      { 
       e.Node.Nodes.Clear(); 
       string[] dirs = Directory.GetDirectories(e.Node.Tag.ToString()); 
       foreach (string dir in dirs) 
       { 
        DirectoryInfo di = new DirectoryInfo(dir); 
        TreeNode node = new TreeNode(di.Name); 
        node.Tag = dir; 
        try 
        { 
         if (di.GetDirectories().GetLength(0) > 0) 
          node.Nodes.Add(null, PLACEHOLDER); 
        } 
        catch (UnauthorizedAccessException) 
        { 
         // TODO: update node images 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show(ex.Message, "ExplorerForm", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        } 
        finally 
        { 
         e.Node.Nodes.Add(node); 
        } 
       } 
      } 
     } 
    }