Rekursives Durchsuchen von Verzeichnissen mit Visual C#

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 303974 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D303974
Eine Version dieses Artikels für Microsoft Visual C++ .NET finden Sie unter 307009.
Im folgenden Artikel wird dieses Thema für Microsoft Visual Basic .NET behandelt: 306666.

Dieser Artikel bezieht sich auf den folgenden Namespace für Microsoft .NET Framework-Klassenbibliotheken:
  • System.IO
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel erläutert schrittweise, auf welche in einer Windows Forms-Anwendung in C# Unterverzeichnisse nach Dateien durchsucht werden können. Es wird eine Suchzeichenfolge festgelegt, sodass Sie nach Dateien suchen können, die einem bestimmten Platzhalterkriterium entsprechen. Die Anweisungen des Programmquelltextes werden ggf. erläutert. Am Ende des Artikels wird darüber hinaus ein ausführbares Codebeispiel bereitgestellt.

Das rekursive Durchsuchen von Verzeichnissen ist eine gängige E/A-Aufgabe für Entwickler. Über das Objekt FileSystemObject kann diese Aufgabe bei COM-Anwendungen (COM = Component Object Model) problemlos durchgeführt werden. Mit der Einführung von .NET ist diese Aufgabe sogar noch einfacher geworden. Analog zu FileSystemObject,stellen die Klassen im System.IO-Namespace in objektorientiertes Verfahren für den Zugriff auf Dateien und Verzeichnisse zur Verfügung.

Voraussetzungen

  • Microsoft Visual C# 2005 oder Microsoft Visual C# .NET

Verzeichnisrekursion

Die Klassen zur Manipulation von Dateien und Verzeichnissen befinden sich im System.IO-Namespace. Bevor Sie diese Klassen verwenden, sollten Sie den folgenden Namespace in Ihr Projekt importieren:
using System.IO;
Der System.IO-Namespace stellt viele Klassen bereit, die es Ihnen ermöglichen, mit Dateien und Verzeichnissen zu arbeiten. Hierzu gehören Dateiklassen Verzeichnisklassen und Hilfsklassen. Viele dieser Klassen enthalten statische Methoden, die Sie aufrufen können, ohne eine Variable dieses Typs deklarieren zu müssen. So können Sie beispielsweise das Directory-Objekt verwenden, um die Unterverzeichnisse für ein gegebenes Verzeichnis zurückzugeben.

Der folgende Code verwendet die statische Methode GetDirectories des Objekts Directory, um ein Array von Zeichenfolgen zurückzugeben. Dieses Array enthält die Pfadnamen der Unterverzeichnisse des Verzeichnisses C, sofern dieses Unterverzeichnisse enthält.
string[] directories = Directory.GetDirectories("C:\\");
Das Directory-Objekt enthält eine Methode namens GetFiles, mit der Sie ein Zeichenfolgen-Array mit den Dateien abrufen können, die bestimmten Kriterien entsprechen. Im folgenden Codebeispiel werden mit dem File-Objekt alle Dateien aus dem Verzeichnis "C" abgerufen, die über die Dateinamenerweiterung DLL verfügen:
string[] files = Directory.GetFiles("C:\\", "*.dll");
Die Methoden GetDirectories und GetFiles des Directory-Objekts sind vollkommen ausreichend, um rekursiv nach Dateien zu suchen, die bestimmten Kriterien entsprechen. Die folgende Methode kann dazu verwendet werden, die Verzeichnisse rekursiv zu durchsuchen:
void DirSearch(string sDir) 
{
	try	
	{
	   foreach (string d in Directory.GetDirectories(sDir)) 
	   {
		foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
		{
		   lstFilesFound.Items.Add(f);
		}
		DirSearch(d);
	   }
	}
	catch (System.Exception excpt) 
	{
		Console.WriteLine(excpt.Message);
	}
}
Der oben angegebene Programmquelltext übergibt eine Zeichenfolge, die das zu durchsuchende Verzeichnis enthält, an DirSearch. Bei diesem Zeichenfolgenwert handelt es sich um den vollständigen Pfad des Verzeichnisses. Sie können die Methode GetDirectories verwenden, um die Unterverzeichnisse für das an die Prozedur übergebene Verzeichnis abzurufen. Da die Methode GetDirectories ein Array zurückgibt, können Sie eine For Each-Anweisung verwenden, um über die Unterverzeichnisse zu iterieren. Rufen Sie für die einzelnen Verzeichnisse die Methode GetFiles auf, um über die Dateien in den jeweiligen Verzeichnissen zu iterieren. Der Wert des Textfelds in Ihrem Formular wird an die Methode GetFiles übergeben. Das Textfeld enthält die Suchzeichenfolge, nach der die Ergebnisse, die die Methode GetFiles zurückgibt, gefiltert werden sollen. Wenn Dateien dem Suchkriterium entsprechen, werden sie dem Listenfeld hinzugefügt. Für alle gefundenen Unterverzeichnisse wird erneut die Methode DirSearch aufgerufen, wobei das Unterverzeichnis als Parameter übergeben wird. Mit diesem rekursiven Aufruf können alle Unterverzeichnisse eines gegebenen Stammverzeichnisses durchsucht werden.

Vollständiges Codebeispiel

  1. Erstellen Sie ein neues Windows-Anwendungsprojekt in Visual C#. Ein Formular mit dem Namen "Form1" wird standardmäßig erstellt.
  2. Klicken Sie im Menü Ansicht auf Projektmappen-Explorer, um diesen anzuzeigen.
  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Form1, und klicken Sie dann auf Code anzeigen.
  4. Markieren Sie im Codefenster "Form1" den gesamten vorhandenen Code, und löschen Sie ihn.
  5. Fügen Sie den folgenden Code in das Codefenster von Form1 ein.
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.IO;
    
    namespace RecursiveSearchCS
    {
        /// <summary>
        /// Summary description for Form1
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
            internal System.Windows.Forms.Button btnSearch;
            internal System.Windows.Forms.TextBox txtFile;
            internal System.Windows.Forms.Label lblFile;
            internal System.Windows.Forms.Label lblDirectory;
            internal System.Windows.Forms.ListBox lstFilesFound;
            internal System.Windows.Forms.ComboBox cboDirectory;
            /// <summary>
            /// Required designer variable
            /// </summary>
            private System.ComponentModel.Container components = null;
    
            public Form1()
            {
                // 
                // Required for Windows Form Designer support
                // 
                InitializeComponent();
    
                // 
                // TODO: Add any constructor code after InitializeComponent call.
                // 
            }
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose( bool disposing )
            {
                if( disposing )
                {
                    if (components != null) 
                    {
                        components.Dispose();
                    }
                }
                base.Dispose( disposing );
            }
    
            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support: do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.btnSearch = new System.Windows.Forms.Button();
                this.txtFile = new System.Windows.Forms.TextBox();
                this.lblFile = new System.Windows.Forms.Label();
                this.lblDirectory = new System.Windows.Forms.Label();
                this.lstFilesFound = new System.Windows.Forms.ListBox();
                this.cboDirectory = new System.Windows.Forms.ComboBox();
                this.SuspendLayout();
                // 
                // btnSearch
                // 
                this.btnSearch.Location = new System.Drawing.Point(608, 248);
                this.btnSearch.Name = "btnSearch";
                this.btnSearch.TabIndex = 0;
                this.btnSearch.Text = "Search";
                this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
                // 
                // txtFile
                // 
                this.txtFile.Location = new System.Drawing.Point(8, 40);
                this.txtFile.Name = "txtFile";
                this.txtFile.Size = new System.Drawing.Size(120, 20);
                this.txtFile.TabIndex = 4;
                this.txtFile.Text = "*.dll";
                // 
                // lblFile
                // 
                this.lblFile.Location = new System.Drawing.Point(8, 16);
                this.lblFile.Name = "lblFile";
                this.lblFile.Size = new System.Drawing.Size(144, 16);
                this.lblFile.TabIndex = 5;
                this.lblFile.Text = "Search for files containing:";
                // 
                // lblDirectory
                // 
                this.lblDirectory.Location = new System.Drawing.Point(8, 96);
                this.lblDirectory.Name = "lblDirectory";
                this.lblDirectory.Size = new System.Drawing.Size(120, 23);
                this.lblDirectory.TabIndex = 3;
                this.lblDirectory.Text = "Look In:";
                // 
                // lstFilesFound
                // 
                this.lstFilesFound.Location = new System.Drawing.Point(152, 8);
                this.lstFilesFound.Name = "lstFilesFound";
                this.lstFilesFound.Size = new System.Drawing.Size(528, 225);
                this.lstFilesFound.TabIndex = 1;
                // 
                // cboDirectory
                // 
                this.cboDirectory.DropDownWidth = 112;
                this.cboDirectory.Location = new System.Drawing.Point(8, 128);
                this.cboDirectory.Name = "cboDirectory";
                this.cboDirectory.Size = new System.Drawing.Size(120, 21);
                this.cboDirectory.TabIndex = 2;
                this.cboDirectory.Text = "ComboBox1";
                // 
                // Form1
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
                this.ClientSize = new System.Drawing.Size(688, 277);
                this.Controls.AddRange(new System.Windows.Forms.Control[] {
    
                this.btnSearch,
                this.txtFile,
                this.lblFile,
                this.lblDirectory,
                this.lstFilesFound,
                this.cboDirectory});
    
                this.Name = "Form1";
                this.Text = "Form1";
                this.Load += new System.EventHandler(this.Form1_Load);
                this.ResumeLayout(false);
    
            }
            #endregion
    
            /// <summary>
            /// The main entry point for the application
            /// </summary>
            [STAThread]
            static void Main() 
            {
                Application.Run(new Form1());
            }
    
            private void btnSearch_Click(object sender, System.EventArgs e)
            {
                lstFilesFound.Items.Clear();
                txtFile.Enabled = false;
                cboDirectory.Enabled = false;
                btnSearch.Text = "Searching...";
                this.Cursor = Cursors.WaitCursor;
                Application.DoEvents();
                DirSearch(cboDirectory.Text);
                btnSearch.Text = "Search";
                this.Cursor = Cursors.Default;
                txtFile.Enabled = true;
                cboDirectory.Enabled = true;
            }
    
            private void Form1_Load(object sender, System.EventArgs e)
            {
                cboDirectory.Items.Clear();
                foreach (string s in Directory.GetLogicalDrives())
                {
                    cboDirectory.Items.Add(s);
                }
                cboDirectory.Text = "C:\\";
            }
    
            void DirSearch(string sDir) 
            {
                try	
                {
                    foreach (string d in Directory.GetDirectories(sDir)) 
                    {
                        foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
                        {
                            lstFilesFound.Items.Add(f);
                        }
                        DirSearch(d);
                    }
                }
                catch (System.Exception excpt) 
                {
                    Console.WriteLine(excpt.Message);
                }
            }
        }
    }
    Hinweis Sie müssen den Code in Visual Studio 2005 und Visual Studio 2008 ändern. In älteren Versionen von Visual Studio als Visual Studio 2005 fügt Visual C# standardmäßig ein Formular zu einem neu erstellten Windows Forms-Projekt hinzu. Der Name des Formulars ist "Formular1" (Form1). In Visual C# 2005 und höheren Versionen heißen die beiden Dateien, die dieses Formular umfassen, "Form1.cs" und "Form1.designer.cs". Sie geben den Code in die Datei "Form1.cs" ein. Der Windows Forms Designer fügt Code in die Datei "Form1.designer.cs" ein.

    Um den Beispielcode für Visual C# 2005 oder Visual C# 2008 zu konvertieren, erstellen Sie eine neue Windows-Anwendung in Visual C#, und gehen Sie dann wie folgt vor:
    1. Kopieren Sie das Button-Objekt, das Text box-Objekt und die anderen Windows-Objekte in die Klasse Form1 in der Datei "Form1.Designer.cs".
    2. Fügen Sie den Inhalt des Abschnitts mit der InitializeComponent-Methode im Code oben in die InitializeComponent-Methode in die Datei "Form1.Designer.cs" ein. Fügen Sie diesen Code nach dem aktuellen Inhalt der InitializeComponent-Methode ein.
    3. Kopieren Sie die folgenden Methoden aus dem Code oben in die Form1-Klasse in der Datei "Form1.cs":
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. Fügen Sie die using-Anweisung using System.IO; der Datei "Form1.cs" hinzu.
    Weitere Informationen zum Windows Forms Designer finden Sie auf folgender MSDN-Website (Microsoft Developer Network):
    http://msdn2.microsoft.com/de-de/library/ms173077(VS.80).aspx
  6. Drücken Sie F5, um das Beispielprogramm zu erstellen und auszuführen.

Informationsquellen

Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
306777 Einlesen einer Textdatei unter Verwendung von System.IO und Visual C#
Hinweis Dies ist ein Artikel, der im Schnellverfahren direkt von der Microsoft-Supportorganisation erstellt wurde. Die hierin enthaltenen Informationen werden als Reaktion auf neue Probleme wie besehen bereitgestellt. Da dieser Artikel im Schnellverfahren erstellt wurde, kann er Tippfehler enthalten und zu einem späteren Zeitpunkt ohne vorherige Ankündigung überarbeitet werden. Weitere zu berücksichtigende Informationen finden Sie in den Nutzungsbedingungen.

Eigenschaften

Artikel-ID: 303974 - Geändert am: Freitag, 23. August 2013 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2008 Express Edition
Keywords: 
kbhowtomaster kbio KB303974
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com