2011-06-04 19 views
24

मैं नोड्स यहाँ के साथ नए .. हूँ :) मैं इस एल्गोरिथ्म के साथ आया था लेकिन यह केवल इस तरह .. माता पिता नोड्स की सूची दिखाता है ..आबाद TreeView

a 
    a.txt 
    b 
    c 
c 
    m 
    n 
b 
    o 
    p 
etc... 

मैं चाहता हूँ अगले नोड पिछले नोड .. अंदर नोड में से एक में डाल दिया जाएगा, ताकि इसे इस तरह ऊपर आ जाएगा ..

a 
    a.txt 
    b 
     o 
     p 
    c 
     m 
     n 
etc... 

मैं मन में कुछ विचार है, लेकिन मैं कोड के लिए इसे लागू कर सकते हैं। :) :) कृपया कोई मदद करें ..

private void ListDirectory(TreeView treeView, String path) 
{    
    Stack<string> stack = new Stack<string>(); 
    TreeNode DirFilesCollection = new TreeNode(); 

    stack.Push(path);    

    while (stack.Count > 0) 
    { 
     string dir = stack.Pop(); 
     try 
     { 
      List<String> parentDir = new List<string>(); 
      parentDir.AddRange(Directory.GetFiles(dir, "*.*")); 
      parentDir.AddRange(Directory.GetDirectories(dir)); 

      DirectoryInfo d = new DirectoryInfo(dir); 
      TreeNode TParent = new TreeNode(d.Name); 

      foreach (String s in parentDir) 
      { 
       FileInfo f = new FileInfo(s); 
       TreeNode subItems = new TreeNode(f.Name); 

       TParent.Nodes.Add(subItems); 
      } 

      DirFilesCollection.Nodes.Add(TParent); 

      foreach (string dn in Directory.GetDirectories(dir)) 
      { 
       stack.Push(dn); 
      } 
     } 
     catch 
     {} 
    } 

    Action clearTreeView =() => treeView.Nodes.Clear(); 
    this.Invoke(clearTreeView); 

    Action showTreeView =() => treeView.Nodes.Add(DirFilesCollection); 
    this.Invoke(showTreeView); 
} 

उत्तर

92

विकल्प # 1: रिकर्सिव दृष्टिकोण:

private void ListDirectory(TreeView treeView, string path) 
{ 
    treeView.Nodes.Clear(); 
    var rootDirectoryInfo = new DirectoryInfo(path); 
    treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo)); 
} 

private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo) 
{ 
    var directoryNode = new TreeNode(directoryInfo.Name); 
    foreach (var directory in directoryInfo.GetDirectories()) 
     directoryNode.Nodes.Add(CreateDirectoryNode(directory)); 
    foreach (var file in directoryInfo.GetFiles()) 
     directoryNode.Nodes.Add(new TreeNode(file.Name)); 
    return directoryNode; 
} 

विकल्प # 2: गैर-पुनरावर्ती दृष्टिकोण:

private static void ListDirectory(TreeView treeView, string path) 
{ 
    treeView.Nodes.Clear(); 

    var stack = new Stack<TreeNode>(); 
    var rootDirectory = new DirectoryInfo(path); 
    var node = new TreeNode(rootDirectory.Name) { Tag = rootDirectory }; 
    stack.Push(node); 

    while (stack.Count > 0) 
    { 
     var currentNode = stack.Pop(); 
     var directoryInfo = (DirectoryInfo)currentNode.Tag; 
     foreach (var directory in directoryInfo.GetDirectories()) 
     { 
      var childDirectoryNode = new TreeNode(directory.Name) { Tag = directory }; 
      currentNode.Nodes.Add(childDirectoryNode); 
      stack.Push(childDirectoryNode); 
     } 
     foreach (var file in directoryInfo.GetFiles()) 
      currentNode.Nodes.Add(new TreeNode(file.Name)); 
    } 

    treeView.Nodes.Add(node); 
} 
+4

@vrynxzent - अगर आप रुचि रखते हैं, इस सवाल का जवाब अद्यतन गैर-पुनरावर्ती दृष्टिकोण के साथ भी। –

+0

आह .. मैं देखता हूं .. मैं थ्रेडिंग के कारण गैर-रिकर्सिव का उपयोग करना पसंद करता हूं और पकड़ने की कोशिश करता हूं .. मैं इसे रिकर्सिव विधि में भी कर सकता हूं लेकिन मुझे फ़ाइल और निर्देशिका लाने के दौरान डेटा अपडेट करने वाले फॉर्म को देखना होगा .. –

+0

मैंने दोनों रिकर्सिव और पुनरावृत्त कार्यों का उपयोग किया और यह मेरा कोड है, लेकिन शिकायतकर्ता एक त्रुटि देता है: ** पथ 'ई: \ सिस्टम वॉल्यूम सूचना \' तक पहुंच अस्वीकार कर दी गई है। **; यह मेरा कोड है: ** ListDirectory (treeView1, @ "E: \"); ** –