2009-03-23 20 views
8

मैं फ़ाइल सिस्टम के साथ काम कर रहा हूं और मेरे पास फ़ाइल ऑब्जेक्ट्स की एक सूची < है जिसमें संपत्ति के रूप में फ़ाइल पथ है। मूल रूप से मैं नेट में एक treeview बनाने की जरूरत है, लेकिन im ऐसा करने के बारे में जाने के लिए के रूप में मैं की तरह एक सूची में से एक वृक्ष संरचना बनाने की जरूरत सबसे अच्छा तरीका है के बारे में सोच के लिए संघर्ष कर:फ़ाइल सिस्टम TreeView

C:/WINDOWS/Temp/ErrorLog.txt 
C:/Program Files/FileZilla/GPL.html 
C:/Documents and Settings/Administrator/ntuser.dat.LOG 

आदि ....

सूची बिल्कुल संरचित नहीं है और मैं वर्तमान ऑब्जेक्ट संरचना में कोई भी परिवर्तन नहीं कर सकता।

मैं सी # में काम कर रहा हूं।

सब जो योगदान

+0

की [पथ की सूची में से treeview पॉप्युलेट] संभावित डुप्लिकेट (http://stackoverflow.com/questions/1155977/populate-treeview-from-a-list-of-path) –

उत्तर

16

अगर आप इस तरह तार कुछ काम करेगा साथ रहना चाहता था ...

TreeNode root = new TreeNode(); 
TreeNode node = root; 
treeView1.Nodes.Add(root); 

foreach (string filePath in myList) // myList is your list of paths 
{ 
    node = root; 
    foreach (string pathBits in filePath.Split('/')) 
    { 
     node = AddNode(node, pathBits); 
    } 
} 


private TreeNode AddNode(TreeNode node, string key) 
{ 
    if (node.Nodes.ContainsKey(key)) 
    { 
     return node.Nodes[key]; 
    } 
    else 
    { 
     return node.Nodes.Add(key, key); 
    } 
} 
+0

यह बी-ई-ए-यूटफुल है! धन्यवाद बहुत बहुत दयालु महोदय! – user31849

+0

यह वेब के लिए काम नहीं कर रहा है? क्या कोई इस पर मेरी सहायता कर सकता है? –

+0

बहुत बढ़िया; बिल्कुल मुझे क्या चाहिए। मेरे उद्देश्यों के लिए 'फ़ाइलपाथ। स्प्लिट ('/')' to 'filePath.Split ('/', StringSplitOptions.RemoveEmptyEntries)' को बदलने के लिए मुझे केवल एक ही बदलाव था। धन्यवाद! –

4

मैं एक FileInfo में स्ट्रिंग चालू करेंगे के लिए बहुत धन्यवाद।

एक बार आपके पास FileInfo ऑब्जेक्ट हो जाने के बाद, आप प्रत्येक पथ के लिए DirectoryInfo पुनर्प्राप्त करने के लिए निर्देशिका प्रॉपर्टी का उपयोग कर सकते हैं।

एक बार जब आप पथ के लिए DirectoryInfo है, यह + फ़ाइल नाम निर्देशिका की एक सूची में प्रत्येक पथ चालू करने के लिए DirectoryInfo में जनक संदर्भ "ऊपर चलना" आसान है - अर्थात्:

{"C:","Windows","Temp","ErrorLog.txt"} 

यह काफी होना चाहिए अपने वृक्षदृश्य में डालने के लिए सीधा। बस पथ के प्रत्येक खंड को बदले में देखें, और यदि यह अस्तित्व में नहीं है, तो इसे जोड़ें ....

2

पुनरावृत्ति को आज़माएं।

private void AddFiles() 
{ 
    // Iterate your list with FileInfos here 
    foreach(var fileInfo in new Collection<FileInfo>()) 
    { 
    GetOrCreateTreeNode(fileInfo.Directory).Nodes.Add(new TreeNode(fileInfo.Name)); 
    } 
} 

private TreeNode GetOrCreateTreeNode(DirectoryInfo directory) 
{ 
    if(directory.Parent == null) 
    { 
    // Access your TreeView control here: 
    var rootNode = <TreeView>.Nodes[directory.Name]; 
    if(rootNode == null) 
    { 
     rootNode = new TreeNode(directory.Name); 
     // Access your TreeView control here: 
     <TreeView>.Nodes.Add(rootNode); 
    } 
    return rootNode; 
    } 

    var parent = GetOrCreateTreeNode(directory.Parent); 
    var node = parent.Nodes[directory.Name]; 
    if(node == null) 
    { 
    node = new DirectoryNode(directory); 
    parent.Nodes.Add(node); 
    } 
    return node; 
} 

यह कोड आपको केवल एक विचार देना चाहिए - मुझे यह मानना ​​है कि मैंने यहां पोस्ट करने से पहले इसका परीक्षण नहीं किया है।

+0

GetOrCreateTreeNode विधि में , निर्देशिकाएं क्या हैं। निर्देशिका [directory.Name] लाइन होने का मतलब था? क्योंकि निर्देशिकाओं जैसी कोई चीज नहीं है .... आपकी सहायता अब तक बहुत सराहना की है! – user31849

+0

सुधार देखें - यह तत्व है, – tanascius

+0

धन्यवाद, मैंने सोचा कि यह ऐसा होगा लेकिन मैं यह सुनिश्चित करना चाहता था कि – user31849

2
private void Form1_Load(object sender, EventArgs e) 
    { 
     var paths = new List<string> 
         { 
          @"C:\WINDOWS\AppPatch\MUI\040C", 
          @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727", 
          @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI", 
          @"C:\WINDOWS\addins", 
          @"C:\WINDOWS\AppPatch", 
          @"C:\WINDOWS\AppPatch\MUI", 
          @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI\0409" 
         }; 
     treeView1.PathSeparator = @"\"; 
     PopulateTreeView(treeView1, paths, '\\'); 
    } 

    private static void PopulateTreeView(TreeView treeView, IEnumerable<string> paths, char pathSeparator) 
    { 
     TreeNode lastNode = null; 
     string subPathAgg; 
     foreach (string path in paths) 
     { 
      subPathAgg = string.Empty; 
      foreach (string subPath in path.Split(pathSeparator)) 
      { 
       subPathAgg += subPath + pathSeparator; 
       TreeNode[] nodes = treeView.Nodes.Find(subPathAgg, true); 
       if (nodes.Length == 0) 
        if (lastNode == null) 
         lastNode = treeView.Nodes.Add(subPathAgg, subPath); 
        else 
         lastNode = lastNode.Nodes.Add(subPathAgg, subPath); 
       else 
        lastNode = nodes[0]; 
      } 
     } 
    } 

alt text

+0

-1 कई स्थितियों में गलत माता-पिता को मिला जहां पॉल का समाधान काम करता था। –

0

EHosca के टुकड़े पूरी तरह से मेरे लिए काम किया, एक परिवर्तन के साथ - स्थापित करने के लिए मैं था पथ क्षेत्र में foreach पथ के बाद कुछ भी करने के लिए lastnode।

यह ऊपर ईहोस्का का कोड है, जो वीबी को पोर्ट किया गया है।

Private Sub PopulateTreeView(tv As TreeView, paths As List(Of String), pathSeparator As Char) 
    Dim lastnode As TreeNode = Nothing 
    Dim subPathAgg As String 
    For Each path In paths 
     subPathAgg = String.Empty 
     lastnode = Nothing 
     For Each subPath In path.Split(pathSeparator) 
      subPathAgg += subPath + pathSeparator 
      Dim nodes() As TreeNode = tv.Nodes.Find(subPathAgg, True) 
      If nodes.Length = 0 Then 
       If IsNothing(lastnode) Then 
        lastnode = tv.Nodes.Add(subPathAgg, subPath) 
       Else 
        lastnode = lastnode.Nodes.Add(subPathAgg, subPath) 
       End If 
      Else 
       lastnode = nodes(0) 
      End If 
     Next 
    Next 
End Sub