Jak rekurzivně vyhledávání adresářů pomocí jazyka Visual C#

Microsoft Visual C++ .NET verzi tohoto článku naleznete v 307009 .

Microsoft Visual Basic .NET verzi tohoto článku naleznete v 306666 .


Tento článek odkazuje na následující obor názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.IO

Souhrn

Tento článek ukazuje, jak rekurzivně vyhledávání podadresáře pro soubory v aplikaci model Windows Forms v jazyce C#. Vyhledávací řetězec zadán tak, aby můžete hledat soubory, které splňují určitá kritéria zástupné. Každá část kódu je vysvětlena podle potřeby. Pracovní kód vzorek je k dispozici také na konci článku.

Adresář rekurze je běžný úkol IO pro vývojáře. FileSystemObject usnadňuje tento úkol aplikace modelu COM (Component Object). Tento úkol se stal nyní ještě snazší v .NET. Podobný FileSystemObjecttřídy v oboru názvů System.IO poskytují způsob objektově orientovaný přístup k souborům a adresářům.

Požadavky

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

Adresář rekurze

Manipulace s třídy souborů a adresářů jsou umístěny v oboru názvů System.IO . Než začnete pracovat s těchto tříd, importujte do projektu obor názvů následující:
using System.IO;
Tříd v oboru názvů System.IO poskytuje mnoho tříd, které umožňují pracovat se soubory a adresáře. Tyto třídy zahrnují soubor třídy, třídy directory a nástroj třídy. Mnohé z těchto tříd obsahovat statické metody, které lze volat bez nutnosti deklarovat proměnné tohoto typu. Například můžete použít objekt adresáře získat podadresářů daném adresář.

Následující kód používá statickou metodu GetDirectories objektu adresáře vrátit pole řetězců. Toto pole obsahuje názvy adresářů cesty do podadresářů adresáře C, pokud takový existuje.
string[] directories = Directory.GetDirectories("C:\\");
Objekt adresáře také obsahuje metodu nazvanou GetFiles , která umožňuje načíst pole řetězců souborů, které vyhovují určitým kritériím. Následující příklad kódu používá objekt soubor načíst všechny soubory v adresáři C, které končí příponou DLL:
string[] files = Directory.GetFiles("C:\\", "*.dll");
GetDirectories a GetFiles metody objektu adresáře se že všeho, co je třeba hledat rekurzivně soubory, které odpovídají hledanému řetězci. Tato metoda se používá k provedení rekurze:
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);
}
}
Předcházející kód předává řetězec, který obsahuje adresář, který chcete hledat, DirSearch. Tato řetězcová hodnota je úplná cesta k adresáři. GetDirectories lze použít k načtení podadresářů adresáře, který je předán do procedury. Protože GetDirectories vrátí matici, můžete použít pro/každý příkaz k iterování každého podadresáře. Pro každý podadresář použijte metodu GetFiles k iterování soubory v tomto adresáři. Hodnota textové pole na formuláři předána GetFiles. Textové pole obsahuje vyhledávací řetězec, který filtruje výsledky, které GetFiles vrátí. Pokud všechny soubory odpovídají kritériím vyhledávání, jsou přidány do vašeho seznamu. Pro každý podadresář, který je umístěn volání DirSearch znovu a předejte ji do podadresáře. Pomocí tohoto rekurzivní volání můžete vyhledat všechny podadresáře daného kořenového adresáře.

Ukázkový kód dokončení

  1. Spuštění nového projektu aplikace Visual C# Windows. Ve výchozím nastavení je vytvořen formulář s názvem Form1.
  2. V nabídce Zobrazit klepněte na zobrazení v okně Průzkumník řešení.
  3. V Průzkumníku řešení klikněte pravým tlačítkem myši Form1a potom klepněte na tlačítko Zobrazit kód.
  4. V okně Kód Form1 vyberte a odstraňte všechny existující kód.
  5. Vložte následující kód v okně Kód 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);
    }
    }
    }
    }
    Poznámka: Je nutné změnit kód v aplikaci Visual Studio 2005 a Visual Studio 2008. Ve verzích sady Visual Studio, které jsou starší než Visual Studio 2005 Visual C# přidá jeden formulář projektu při vytvoření projektu model Windows Forms. Formulář je pojmenován Form1. V aplikaci Visual C# 2005 a novější verze dva soubory, které představují formuláře jsou pojmenovány Form1.cs a Form1.designer.cs. Píšete kód v Form1.cs souboru. Návrhář model Windows Forms zapíše kód v souboru Form1.designer.cs.

    Chcete-li převést ukázkový kód Visual C# 2005 nebo Visual C# 2008, vytvořit novou aplikaci Visual C# Windows a proveďte následující kroky:
    1. Zkopírujte objekt tlačítka , objekt textové pole a jiné objekty Windows částečné třídy Form1 v souboru Form1.Designer.cs.
    2. Přidejte obsah části InitializeComponent metoda v kódu výše do InitializeComponent metoda v souboru Form1.Designer.cs. Vložte obsah po aktuální obsah metodu InitializeComponent .
    3. Zkopírujte následující metody z kódu výše do třídy Form1 v souboru Form1.cs:
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. Přidáte pomocí System.IO; pomocí příkazu do souboru Form1.cs.
    Další informace o nástroji Designer model Windows Forms naleznete následujícím webu Microsoft Developer Network (MSDN):
  6. Stisknutím klávesy F5 sestavit a spustit ukázkový program.

Odkazy

Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

306777 jak číst textového souboru pomocí System.IO a Visual C#

Vlastnosti

ID článku: 303974 - Poslední kontrola: 20. 1. 2017 - Revize: 1

Váš názor