2017-06-06 3 views
-1

Ich habe mehrere Dateien, die von Ordnerpfad erstellen bestehen, die Importverzeichnis Text Baumstruktur

//Fs1/userA/ 
//Fs1/userA/documents/ 
//Fs1/userB/ 
//Fs2/userC/documents 

ich Analyse machen will wie

sieht aus, welche Ordner x Anzahl direkte Unter Ordner haben. Z.B. userD hat 120 Unterordner direkt darunter, ohne tiefere Ordner.

Und ich habe riesige Sammlung solcher Dateien, von denen einige wenige hundert k Zeilen enthalten.

Ich habe über Radix-Baum gedacht, aber es funktioniert nicht, wenn ich alle seine Kinder durchlaufen muss, um die Anzahl der direkten Unterordner zu finden.

Es wurde auch in Betracht gezogen, es in einen Datenbankserver zur Abfrage zu stellen, was möglicherweise einfacher zu implementieren ist, aber ich wollte versuchen, .Net für die Analyse ohne SQL Server zu verwenden. Irgendeine Hilfe?

+0

Sie können eine XML-Datei für eine Database verwenden. Hat letzte Woche ein Projekt geholfen? Die Anwendung liest einen Ordner (und Unterordner), erstellt ein XML und fügt dann xml zur Anzeige in eine Baumansicht ein. Siehe: https://stackoverflow.com/questions/44133736/how-to-create-and-save-an-xml-file-containing-complete-hierarchy-of-files-and-fo/44136611#44136611 – jdweng

+0

Das wird funktioniert in meinem Fall nicht, da ich Dateiserver, die von SAN unterstützt werden, mit 50 + TB Inhalt –

+0

exportiere. Zum Lesen Ihres Beitrags klang es so, als wollte ich keine Datenbank und suchte nach einer Alternative. Aber jetzt, wo Sie sagen, Sie haben 50 + TB Daten gibt es keine echte Alternative.Wenn Sie in der Datenbank speichern, sollten Sie gespeicherte Prozedur für die Abfragen verwenden und einfach Net verwenden und Net für die endgültige Analyse verwenden. – jdweng

Antwort

0

Ich nahm mein XML-Projekt und entfernte XML. Jetzt bekomme ich nur die Summe. Vielleicht wird das für dich funktionieren. Der Code überprüft Ordner und Unterordner für alle Dateien. Wenn die Größe oder Anzahl der Dateien einen Grenzwert überschreitet, werden die Ergebnisse in die Baumansicht übertragen.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace CheckFileSizes 
{ 
    public partial class Form1 : Form 
    { 
     const int FILE_SIZE_CHECK = 10000000; 
     const int FILE_COUNT_CHECK = 1000; 
     public Form1() 
     { 
      InitializeComponent(); 

      folderBrowserDialog1.SelectedPath = @"c:\temp"; 
      textBoxTotalFolderSizeMin.Text = FILE_SIZE_CHECK.ToString(); 
      textBoxNumberOfFilesMin.Text = FILE_COUNT_CHECK.ToString(); 

     } 
     private void buttonBrowseForFolder_Click(object sender, EventArgs e) 
     { 
      folderBrowserDialog1.ShowDialog(); 
      textBoxFolderName.Text = folderBrowserDialog1.SelectedPath; 
     } 

     private void buttonMakeTree_Click(object sender, EventArgs e) 
     { 
      if (Directory.Exists(textBoxFolderName.Text)) 
      { 
       MyDirectory root = MyDirectory.root; 

       TreeNode rootNode = MakeTreeRecursive(textBoxFolderName.Text, root); 
       textBoxTotalNumberOfFiles.Text = root.totalNumberOfFiles.ToString(); 
       textBoxTotalSize.Text = ((long)root.totalSize).ToString(); 

       if (rootNode == null) 
       { 
        string rootNodeText = string.Format("Folder: '{0}', Number of Files: '{1}', File Size: '{2}'", 
         textBoxFolderName.Text, 
         textBoxTotalNumberOfFiles.Text, 
         textBoxTotalSize.Text 
        ); 
        rootNode = new TreeNode(rootNodeText); 
       } 
       treeView1.Nodes.Add(rootNode); 
       treeView1.ExpandAll(); 


      } 
     } 
     private TreeNode MakeTreeRecursive(string folder, MyDirectory myDirectory) 
     { 
      TreeNode node = null; 

      myDirectory.name = folder.Substring(folder.LastIndexOf("\\") + 1); 

      DirectoryInfo dInfo = new DirectoryInfo(folder); 

      myDirectory.numberOfFiles = 0; 
      myDirectory.size = 0.0f; 

      foreach (FileInfo fInfo in dInfo.GetFiles()) 
      { 
       try 
       { 
        float fSize = fInfo.Length; 
        myDirectory.size += fSize; 
        myDirectory.numberOfFiles += 1; 
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("Error : CAnnot Access File '{0}'", fInfo.Name); 
       } 
      } 
      myDirectory.totalSize = myDirectory.size; 
      myDirectory.totalNumberOfFiles = myDirectory.numberOfFiles; 
      foreach (string subFolder in Directory.GetDirectories(folder)) 
      { 
       if (myDirectory.children == null) myDirectory.children = new List<MyDirectory>(); 
       MyDirectory childDirectory = new MyDirectory(); 
       myDirectory.children.Add(childDirectory); 

       TreeNode childNode = MakeTreeRecursive(subFolder, childDirectory); 
       if (childNode != null) 
       { 
        if (node == null) 
        { 
         node = new TreeNode(); 
        } 
        node.Nodes.Add(childNode); 
       } 

       myDirectory.totalSize += childDirectory.totalSize; 
       myDirectory.totalNumberOfFiles += childDirectory.totalNumberOfFiles; 
      } 

      if ((myDirectory.totalNumberOfFiles >= long.Parse(textBoxNumberOfFilesMin.Text)) || myDirectory.totalSize >= float.Parse(textBoxTotalFolderSizeMin.Text)) 
      { 
       if (node == null) 
       { 
        node = new TreeNode(); 
       } 
       string childNodeText = string.Format("Folder: '{0}', Number of Files: '{1}', File Size: '{2}'", 
        folder, 
        myDirectory.totalNumberOfFiles, 
        myDirectory.totalSize 
       ); 
       node.Text = childNodeText; 
      } 
      return node; 
     } 

    } 
    public class MyDirectory 
    { 
     public static MyDirectory root = new MyDirectory(); 
     public List<MyDirectory> children { get; set; } 

     public string name { get; set; } 
     public long totalNumberOfFiles = 0; 
     public int numberOfFiles = 0; 
     public float size = 0.0f; 
     public float totalSize = 0.0f; 
    } 
}