Alle Dateien in einem Verzeichnis durchgehen



  • Hallo erstmal!
    Ich habe in vielen Verzeichnissen jeweils ca. 1800 Logfiles.
    Nun brauche ich ein Programm, das sie alle durchgeht, einige zusammenfasst und Anomalien sucht.
    Die Dateien sind unregelmäßig benannt, aber wen man sie im Explorer nach Namen sortiert, zumindest in der richtigen Reihenfolge.
    Das zusammenfassen und durchsuchen einzelner Dateien funktioniert wunderbar.
    Ich habe es erstmal mit openFileDialog.GetFileNames programmiert, aber mit dieser Methode kann ich nicht alle Dateien auswählen, da dann eine Meldung, dass zu viele Dateien ausgewählt wurden, kommt.
    Also habe ich es mit der Directory Klasse probiert und ein Beispiel vom MSDN zum anzeigen aller Dateien im Verzeichnis umgeschrieben.
    Nun stimmt aber die Reihenfolge nicht mehr.
    Logfile_10 kommt vor Logfile_2, was für die Datenauswertung fatal ist.
    Hat jemand eine Idee, wie eich ein Verzeichnis in der normalen Sortierreihenfolge einlesen kann?
    Oder die Dateien nach Datum sortiert, das würde auch gehen.



  • try
    				{
    					System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo("d:\\");
    					System.IO.FileInfo [] fileInfos = dirInfo.GetFiles();
    					ArrayList arr = new ArrayList();
    
    					for(int idx = 0;idx <fileInfos.Length;idx++)
    					{
    						arr.Add(fileInfos[idx].Name);
    					}
    
    					arr.Sort();
    
    					for(int idx0 = 0; idx0 < arr.Count;idx0++)
    					{
    						listBox1.Items.Add(arr[idx0]);
    					}
    				}
    				catch(System.Exception ex)
    				{
    					MessageBox.Show(ex.Message);
    				}
    


  • Er möcht sie aber nach Datum nicht nach Name sortiert.

    System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo("d:\\");
    List<FileInfo> l_fi = new List<FileInfo>( dirInfo.GetFiles());//FileInfos in Liste übertragen
    l_fi.Sort(new Comparison<FileInfo>(SortByDate));//Die FileInfos in der Liste nach Datum sortieren
    
    int SortByDate(FileInfo x,FileInfo y)
    {
     return x.CreationTime.CompareTo(y.CreationTime);
    }
    


  • 2 Sotierer die nach letzten Zugriff sortieren kann man so bauen wenn man davon ausgeht das man eine ArrayList mit FileInfo-Objekten hat!

    public class ReverseSorterLastAccessTime : IComparer // für letzten Dateizugriff rückwärts sortiert 
    	{
    
    		int IComparer.Compare( Object x, Object y )  
    		{
    			return( (new CaseInsensitiveComparer()).Compare( (y as FileInfo).LastAccessTime, (x as FileInfo).LastAccessTime ) );
    		}
    
    	}
    
    	public class ForwardSorterLastAccessTime : IComparer // für letzten Dateizugriff vorwärts sortiert
    	{
    
    		int IComparer.Compare( Object x, Object y )  
    		{
    			return( (new CaseInsensitiveComparer()).Compare( (y as FileInfo).LastAccessTime, (x as FileInfo).LastAccessTime ) );
    		}
    
    	}
    

    so nutzt man die selbstdefinierten vergleicher dann

    try
    				{
    					System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo("d:\\");
    					System.IO.FileInfo [] fileInfos = dirInfo.GetFiles();
    					ArrayList arr = new ArrayList();
    
    					for(int idx = 0;idx <fileInfos.Length;idx++)
    					{
    						arr.Add(fileInfos[idx]);
    					}
    
    					IComparer forwardComp = new ForwardSorterLastAccessTime();
    					IComparer reverseComp = new ReverseSorterLastAccessTime();
    
    					// jetzt einen Sortierer ausuchen und einfügen
    					arr.Sort(reverseComp);
    
    					for(int idx0 = 0; idx0 < arr.Count;idx0++)
    					{
    						listBox1.Items.Add((arr[idx0] as FileInfo).Name);
    					}
    				}
    				catch(System.Exception ex)
    				{
    					MessageBox.Show(ex.Message);
    				}
    

    P.S.: Kannst Dir jetzt aussuchen was Dir am meisten zusagt



  • Andorxor schrieb:

    Er möcht sie aber nach Datum nicht nach Name sortiert.

    System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo("d:\\");
    List<FileInfo> l_fi = new List<FileInfo>( dirInfo.GetFiles());//FileInfos in Liste übertragen
    l_fi.Sort(new Comparison<FileInfo>(SortByDate));//Die FileInfos in der Liste nach Datum sortieren
    
    int SortByDate(FileInfo x,FileInfo y)
    {
     return x.CreationTime.CompareTo(y.CreationTime);
    }
    

    Du liesst auch nicht genau er sprach von "Oder nach Datum sortiert" Siehe sein letzter Satz.
    Wenn Er auf Basis des .NET 1.1 mit C# arbeitet werden Ihm Templates wohl nichts nutzen.

    Aber er hat ja durch uns beide jetzt genug Stoff um zurande zu kommen.



  • Danke!
    Ich werde es mal morgen ausprobieren.



  • Mit .NET 2.0 (zu Hause) funktioniert das Wunderbar.
    Aber im Labor an der Uni gibts nur .NET 1.1 und dort schaffe ich es leider nicht, eine FileList nach Datum zu sortieren.
    So wie ich es verstanden habe, müsste ich dazu die Klasse FileList um IComparable erweitern.
    Oder geht das anderst?



  • sclearscreen, du solltest einen paypal-button in deine signatur setzen. du gibst dir wirklich viel mühe und schreibst immer ausführliche codebeispiele, um anderen zu helfen.

    sowas sollte belohnt werden! 👍 👍

    der ghetto-coder hat gesprochen.



  • starchild schrieb:

    Mit .NET 2.0 (zu Hause) funktioniert das Wunderbar.
    Aber im Labor an der Uni gibts nur .NET 1.1 und dort schaffe ich es leider nicht, eine FileList nach Datum zu sortieren.
    So wie ich es verstanden habe, müsste ich dazu die Klasse FileList um IComparable erweitern.
    Oder geht das anderst?

    So kannst bei dann bei Deiner UNI wegen .NET 1.1 tun:

    public class ReverseSorterLastAccessTime : IComparer // für letzten Dateizugriff rückwärts sortiert 
        { 
    
            int IComparer.Compare( Object x, Object y )   
            { 
                return( (new CaseInsensitiveComparer()).Compare( (y as FileInfo).LastAccessTime, (x as FileInfo).LastAccessTime ) ); 
            } 
    
        } 
    
        public class ForwardSorterLastAccessTime : IComparer // für letzten Dateizugriff vorwärts sortiert 
        { 
    
            int IComparer.Compare( Object x, Object y )   
            { 
                return( (new CaseInsensitiveComparer()).Compare( (y as FileInfo).LastAccessTime, (x as FileInfo).LastAccessTime ) ); 
            } 
    
        }
    

    ersetze dann bei diesen ins Augen stechenden "type casts"

    (x as FileInfo).LastAccessTime )
    

    gegen die entsprechende FileInfo-Eigenschaft Deiner Wahl (z.B. CreationTime).

    Jetzt hast Du ja zwei Sortierklassen eine um aufsteigen zu sortieren und die andere für andersrum.

    Naja und sortiert wird dann eben mit folgenden Codeschnippel:

    try 
                    { 
                        System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo("d:\\"); 
                        System.IO.FileInfo [] fileInfos = dirInfo.GetFiles(); 
                        ArrayList arr = new ArrayList(); // Arralist kann sortieren
    
                        // damit was zum sortieren vorhanden ist alle FileInfo-Objekte reintun
                        for(int idx = 0;idx <fileInfos.Length;idx++) 
                        { 
                            arr.Add(fileInfos[idx]); 
                        } 
    
                        // Die Sortierer instanzieren
                        IComparer forwardComp = new ForwardSorterLastAccessTime(); 
                        IComparer reverseComp = new ReverseSorterLastAccessTime(); 
    
                        // jetzt einen Sortierer ausuchen und einfügen und sortieren lassen 
                        arr.Sort(reverseComp); 
    
                        // die geordneten Daten (Dateinamen) in einer ListBox bringen
                        for(int idx0 = 0; idx0 < arr.Count;idx0++) 
                        { 
                            listBox1.Items.Add((arr[idx0] as FileInfo).Name); 
                        } 
                    } 
                    catch(System.Exception ex) // falls etwas eine Ausnahme macht so zum B. bei Sortierung
                    { 
                        MessageBox.Show(ex.Message); 
                    }
    

Anmelden zum Antworten