C# Directory.GetFiles Problem

Ordos

Grünschnabel
Hallo zusammen,

ich versuche gerade ein Tool zu Schreiben, welches mir eine Auflistung von allen Dateien mit einer bestimmten Endung erstellt. Das Auflisten von Dateien habe ich soweit hinbekommen,
dass jetzt die erste Ordnerebene von jedem Laufwerk durchsucht wird.

Ich bekomme es aber nicht in, das die Unterordner dieser Ebene auch noch durchsucht wird.

Hier ein Beispiel:

C:\Test\test.txt -> wird gefunden.
C:\Test\Test\test.txt -> wird nicht gefunden.

Die Ordnerstruktur soll ganz durchgegangen werden. Also auch z.B C:\Test\Test\\Test\Test\Test\Test\Testtest.txt

Kann sich das mal jemand anschauen?

Danke

Code:
using System;
using System.IO;
using System.Data;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            int count = 0;
            string[] drives = new string[10];

            foreach (string s in Directory.GetLogicalDrives())
            {
                count++;
                drives[count] = s;
            }

            for (int counttemp = 1; counttemp <= count; counttemp++)
            {
                try
                {
                    MessageBox.Show(drives[counttemp]);

                    foreach (string d in Directory.GetDirectories(drives[counttemp]))
                    {
                        MessageBox.Show(d);
                        try
                        {
                            foreach (string f in Directory.GetFiles(d, "*.txt"))
                            {
                                MessageBox.Show(f);
                            }

                        }
                        catch (UnauthorizedAccessException)
                        { }
                        finally { }

                    }


                }
                finally { }

            }

        }       

    }
}
 
Hi und Willkommen bei tutorials.de :)

Du musst jeden gefundenen Ordner extra nocheinmal durchgehen; darin gefundene Ordner wieder...eine rekursive Methode sollte da hilfreich sein.
Also eine, der du einen Ordner (Pfad) geben kannst und dieser durchsucht wird.
Die gefundenen Dateien (mit passender Endung) dabei ausgeben (oder sonst was damit anstellen) und mit jedem gefundenen Ordner die Funktion selbst in sich wieder aufrufen.

Gruß
 
Huhu Ordos,

Das .NET-Framework bietet bereits eine Methode für das, was du tun möchtest:
C#:
System.IO.Directory.GetFiles(@"C:\Test", "*.txt", System.IO.SearchOption.AllDirectories);
 
Hi ihr beiden,

danke euch erstmal für die schnellen Antworten.
Ich habe das ganze jetzt mal folgendermaßen angepasst:

Code:
using System;
using System.IO;
using System.Data;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            int count = 0;
            string[] drives = new string[10];

            foreach (string s in Directory.GetLogicalDrives())
            {
                count++;
                drives[count] = s;
            }

            for (int counttemp = 1; counttemp <= count; counttemp++)
            {
            Search(drives[counttemp]);   
            }

        }    
   
        public void Search(string drive)
        {
        try
                {
                    MessageBox.Show(drive);

                    foreach (string d in Directory.GetDirectories(drive))
                    {
                        MessageBox.Show(d);
                        try
                        {
                            foreach (string f in Directory.GetFiles(d, "*.txt"))
                            {
                                MessageBox.Show(f);
                            }
                            Search(d);
                        }
                        catch (UnauthorizedAccessException)
                        { }
                        finally { }

                    }


                }
                finally { }
        
        }

    }
}

Bekomme jetzt aber die Meldung:

Fehler 1 Für das nicht statische Feld, die Methode oder die Eigenschaft "WindowsFormsApplication1.Program.Search(string)" ist ein Objektverweis erforderlich. C:\Users\Kevin\Documents\Visual Studio 2010\Projects\winws\winws\Program.cs 27 13 winws

Was soll mir diese Meldung sagen? Was habe ich falsch gemacht?
Kann mir das vielleicht noch jemnd von euch so anpasse, dass die Meldung nicht mehr kommt?

@Muepe32 Danke, das werde ich mir Morgen mal anschauen.
 
Das innere foreach mit dem GetFiles würde ich noch außerhalb (davor/danach, egal) des anderen foreach machen, sonst bindest du das Startverzeichnis nicht in die Suche mit ein.

Und der Fehler mit dem static:
Main ist static, Search nicht.
Entweder schreibst du vor Search auf ein static, oder du legst in Main ein Objekt von Program an und rufst von diesem Search auf.

@Muepe: Ich wusste, das es sowas gibt...aber zu faul zum Suchen :D

Gruß
 
Super, es funktioniert. Danke.

Das einzige was jetzt komisch ist, ist das

Code:
foreach (string f in Directory.GetFiles(d, "*.txt"))
                            {
                                MessageBox.Show(f);
                            }
                            Search(d);

Mir nicht nur *.txt files sondern auch Verzeichnisnamen ohne *.txt file am ende ausgibt.
 
Ich habe den Fehler gefunden :/

Das liegt wohl an der Uhrzeit.

Code:
MessageBox.Show(drive);

Danke Euch beiden für Eure schnelle Hilfe.
 

Neue Beiträge

Zurück