Hur du rekursivt söka kataloger med hjälp av Visual C#

En version av denna artikel för Microsoft Visual C++ .NET för att se .

Ett Microsoft Visual Basic .NET version av denna artikel finns i .


Den här artikeln avser följande Microsoft.NET Framework-klassbiblioteket namnområde:

  • System.IO

Sammanfattning

I den här artikeln visar hur du rekursivt Sök underkataloger för filer i ett Windows Forms C#-program. En söksträng har angetts så att du kan söka efter filer som matchar vissa villkor jokertecken. Varje del av koden förklaras efter behov. En fungerande kodexempel finns även i slutet av artikeln.

Directory rekursion är en vanlig i/o-aktivitet för utvecklare. FileSystemObject är denna uppgift enkelt Component Object Model (COM) program. Den här uppgiften har nu blivit ännu enklare i .NET. Påminner om FileSystemObjectklasser i namnområdet System.IO tillhandahålla ett objektorienterat sätt åtkomst till filer och kataloger.

Krav

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

Directory rekursion

Fil- och katalognamn manipulering klasserna finns i namnområdet System.IO . Innan du börjar arbeta med dessa klasser, bör du importera följande namnområde i projektet:

using System.IO;

Klasserna namnområdet System.IO ger många klasser som gör att du kan arbeta med filer och kataloger. Dessa klasser innehåller filen klasser, directory-klasser och klasser i verktyget. Många av dessa klasser innehåller statiska metoder som du kan anropa utan att deklarera en variabel av typen. Till exempel kan du använda katalogobjektet hämta underkataloger i en viss katalog.

I följande kod används den statiska metoden GetDirectories för objekt för att returnera en strängmatris. Den här matrisen innehåller katalogen sökvägar till underkatalogerna i katalogen C.

string[] directories = Directory.GetDirectories("C:\\");

Katalogobjektet innehåller också en metod som kallas GetFiles som gör att du kan hämta en strängmatris med filer som matchar vissa villkor. Följande kodexempel används filen objektet för att hämta alla filer i katalogen C som slutar med filnamnstillägget .dll:

string[] files = Directory.GetFiles("C:\\", "*.dll");

Metoderna GetDirectories och GetFiles på katalogobjektet finns allt som du behöver rekursivt söka efter filer som matchar söksträngen. Följande metod för att utföra rekursion:

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);
}
}

Föregående kod skickar en sträng som innehåller katalogen som du vill söka i DirSearch. Strängvärdet är den fullständiga sökvägen till katalogen. Du kan använda GetDirectories för att hämta underkataloger för katalogen som skickas till en procedur. Eftersom GetDirectories returnerar en matris, kan du använda en för/varje sats för att iterera igenom varje underkatalog. Använd metoden GetFiles för varje underkatalog för att iterera igenom filerna i den katalogen. Värdet i textrutan i formuläret skickas till GetFiles. Textrutan innehåller strängen som filtrerar resultatet GetFiles returnerar. Om alla filer som matchar sökvillkoren, läggs de till i listrutan. Anropa DirSearch igen och skicka den till en underkatalog för varje underkatalog som finns. Med detta Rekursiva anrop kan söka du alla underkataloger i en given rotkatalog.

Fullständig kodexempel

  1. Starta ett nytt projekt i Visual C# Windows-program. Ett formulär som heter Form1 skapas som standard.

  2. Klicka på om du vill visa lösningsutforskaren i Visa -menyn.

  3. Högerklicka på Form1i Solution Explorer och klicka sedan på Visa kod.

  4. Markera och ta bort den befintliga koden i kod-fönstret i Form1.

  5. Klistra in följande kod i kodfönstret i Form1.

    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);
    }
    }
    }
    }

    Obs! Du måste ändra koden i Visual Studio 2005 och Visual Studio 2008. I versioner av Visual Studio som är tidigare än Visual Studio 2005, Visual C# lägger till ett formulär i projektet när du skapar en Windows Forms-projekt. Formuläret kallas Formulär1. Visual C# 2005 och senare versioner heter två filer som representerar formuläret Form1.cs och Form1.designer.cs. Du kan skriva kod i filen Form1.cs. Windows Forms Designer skriver koden i filen Form1.designer.cs.

    Om du vill konvertera exempelkoden till Visual C# 2005 eller Visual C# 2008, skapar ett nytt Visual C# Windows-program och gör sedan så här:

    1. Kopiera objektet knappen , objektet textruta och andra Windows-objekt till klassen delvis Form1 i filen Form1.Designer.cs.

    2. Lägg till innehållet i avsnittet InitializeComponent metod i koden ovan till metoden InitializeComponent i filen Form1.Designer.cs. Klistra in innehållet efter det aktuella innehållet i metoden InitializeComponent .

    3. Kopiera följande metoder från koden ovan till Formulär1 klass i filen Form1.cs:

      • btnSearch_Click

      • Form1_Load

      • DirSearch

    4. Lägga till en använder System.IO; med uttryck i filen Form1.cs.

    Mer information om Windows Forms Designer finns på följande Microsoft Developer Network (MSDN)-webbplats:

  6. Tryck på F5 för att bygga och köra det här exempelprogrammet.

Referenser

För mer information klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:

så läser du en textfil med System.IO och Visual C#

Behöver du mer hjälp?

Utöka dina kunskaper
Utforska utbildning
Få nya funktioner först
Anslut till Microsoft Insiders

Hade du nytta av den här informationen?

Tack för din feedback!

Tack för din feedback! Det låter som att det kan vara bra att koppla dig till en av våra Office-supportrepresentanter.

×