Jak rekurzivně složky výsledků hledání pomocí aplikace Visual C++

Microsoft Visual Basic .NET verzi tohoto článku naleznete v tématu
306666 .
Microsoft C# .NET verzi tohoto článku naleznete v tématu
303974 .

Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.IO
  • System.ComponentModel
  • System.Windows.Forms
  • System.Drawing

V TOMTO ÚKOLU

Souhrn

Tento podrobný článek popisuje, jak rekurzivně vyhledávání podsložky pro soubory, počínaje kořenovou složku pomocí kódu. Tento úkol se nazývá adresář rekurze. Takže můžete vyhledat soubory, které odpovídají určitým kritériím, můžete zadat vyhledávací řetězec. Každá část kódu v tomto článku je vysvětleno a pracovní kód vzorek je také k dispozici.

Adresář rekurze je běžný úkol I/O pro vývojáře. Objekt FileSystemObject usnadňuje tento úkol aplikace modelu COM (Component Object), ale tento úkol je v aplikaci Visual C++ .NET 2002 jednodušší. Podobně jako objekt FileSystemObject třídy v oboru názvů System.IO poskytují o objektově orientovaný způsob přístupu k souborům a složkám.

Zpět na horní

Požadavky

Následující seznam obsahuje doporučený hardware, software, síťovou infrastrukturu a aktualizace service Pack, které potřebujete:
  • Microsoft Visual C++ .NET nebo Microsoft Visual C++ 2005
Zpět na horní

Povolení rekurze Directory

Manipulace s třídy souborů a adresářů jsou umístěny v oboru názvů System::IO . Než začnete pracovat s tyto třídy, přidejte následující kód:
using <mscorlib.dll>using namespace System;
using namespace System::IO;
Obor názvů System::IO poskytuje mnoho možností pro práci se soubory a složky. Oboru názvů System::IO poskytuje nejen třídy, že můžete vytvořit instanci, ale nabízí také nástroj třídy souborů a adresářů. Tyto třídy obsahují statické metody, které lze volat bez nutnosti deklarovat proměnné tohoto typu. Například můžete použít třídu adresáře získání podsložky dané složky.

Následující kód používá statickou metodu GetDirectories třídy Directory vrátit pole řetězců. Toto pole obsahuje složku cesty do podsložek složky C:\, pokud existuje:
String* directories[] = Directory::GetDirectories("C:\\");
Třída Directory také obsahuje metodu GetFiles . GetFiles můžete použít k načtení řetězců souborů, které vyhovují určitým kritériím. Následující ukázkový kód používá metodu GetFiles načíst všechny soubory ve složce C:\ s příponou DLL:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
Můžete použít metodu GetDirectories a metodu GetFiles třídy Directory rekurzivně hledat soubory, které odpovídají hledanému řetězci. Rekurzi pomocí následující metody:
 void DirSearch(String* sDir) {
try
{
// Find the subfolders in the folder that is passed in.
String* d[] = Directory::GetDirectories(sDir);
int numDirs = d->get_Length();

for (int i=0; i < numDirs; i++)
{
// Find all the files in the subfolder.
String* f[] = Directory::GetFiles(d[i],textBox1->Text);
int numFiles = f->get_Length();

for (int j=0; j < numFiles; j++)
{
listBox1->Items->Add(f[j]);
}
DirSearch(d[i]);
}
}
catch (System::Exception* e)
{
MessageBox::Show(e->Message);
}
}
Předchozí kód předává řetězec funkce DirSearch . Tato řetězcová hodnota je úplná cesta ke složce, kterou chcete prohledat. GetDirectories metoda slouží k načtení podsložky složky, který je předán do procedury. Protože GetDirectories metoda vrátí matici, můžete iterovat přes všechny podsložky pro výkaz. Pro každou podsložku použijte metodu GetFiles k iterování soubory v této složce. Hodnota textové pole na formuláři předána GetFiles metoda. Textové pole obsahuje vyhledávací řetězec, který filtruje výsledky, které GetFiles metoda vrátí. Jestliže soubor odpovídá kritériím hledání, je přidán do vašeho seznamu. Pro každou podsložku, která je umístěna volání funkce DirSearch znovu a poté předat do podsložky. Pomocí tohoto rekurzivní volání může prohledat všechny podsložky kořenové složky, které zadáte.

Zpět na horní

Vytvořit vzorek

  1. Spusťte Microsoft Visual Studio .NET 2003 nebo Microsoft Visual Studio 2005.
  2. V nabídce soubor přejděte na příkaz
    Novýa potom klikněte na projekt.
  3. Ve skupinovém rámečku Typy projektůklepněte na tlačítko
    Visual C++ .NET.

    Poznámka: V aplikaci Microsoft Visual C++ 2005 Visual C++.NET je změněn na Visual C++.
  4. Ve skupinovém rámečku šablonyklepněte na tlačítko
    Model Windows Forms aplikace (.NET).
  5. Do pole název zadejte
    RecursiveSearchCPP. Do pole Vyhledatzadejte C:\a potom klepněte na tlačítko
    OK.
  6. Otevřete v návrhovém zobrazení formuláře Form1 a potom stisknutím klávesy F4 otevřte vlastnosti okna.
  7. V okně Vlastnosti rozbalte složku velikost . Do pole Šířka zadejte
    700. do pole Výška zadejte
    320.
  8. Přidat dva ovládací prvky Label , jeden ovládací prvek TextBox , jeden
    Ovládací prvek ComboBox , jeden ovládací prvek ListBox a jednoho ovládacího prvku tlačítko do formuláře Form1.
  9. V okně Vlastnosti změnit
    Umístění, velikost, pořadové číslo prvkua vlastnosti Text následujícím způsobem:
    ID ovládacího prvkuUmístěníVelikostPořadové číslo prvkuText
    label18, 16144, 165Hledat soubory, které obsahují:
    textBox18, 40120, 204*.dll
    label28, 96120, 253Oblast hledání:
    button1608, 24875, 250& Hledat
    listBox1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. V metodě InitializeComponent pro pole se seznamem přidejte následující kód k zařazení všechny síťové jednotky, které jsou k dispozici v počítači:
    // Enlist all the network drives that are available on the computer.String* p_logicalDrives[] = __gc new String*[];
    comboBox1->Items->Clear();
    p_logicalDrives = Directory::GetLogicalDrives();
    int numDrives = p_logicalDrives->get_Length();

    for (int i=0; i< numDrives; i++)
    {
    comboBox1->Items->Add(p_logicalDrives[i]);
    }
  11. Dvakrát klikněte na tlačítko Hledat a potom vložte následující kód v metodě:
    // Clear the list box.listBox1->Items->Clear();
    // You do not have the option to change the values of the files to be searched
    // until the search is completed. Therefore, the following value is false.
    textBox1->Enabled = false;
    comboBox1->Enabled = false;

    button1->Text = S"Searching...";
    this->Cursor = Cursors::WaitCursor;
    Application::DoEvents();

    // Callthe recursive search method.
    DirSearch(comboBox1->Text);
    button1->Text = S"Search";
    this->Cursor = Cursors::Default;

    // After the search is completed, the search criteria is enabled
    //and you can add other search criteria to search the files recursively.
    textBox1->Enabled = true;
    comboBox1->Enabled = true;

  12. Chcete-li vytvořit aplikaci, stiskněte CTRL + F5 k sestavení.
  13. Spusťte aplikaci.
Zpět na horní

Ukázkový kód dokončení

// Form1.h#pragma once

namespace RecursiveSearchCPP
{
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;

/// <summary>
/// Summary for Form1
///
/// WARNING: If you change the name of this class, you must change the
/// Resource File Name property for the managed resource compiler tool
/// that is associated with all .resx files that this class depends on. Otherwise,
/// the designers will not be able to interact correctly with localized
/// resources that are associated with this form.
/// </summary>
public __gc class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
}

protected:
void Dispose(Boolean disposing)
{
// Form::Dispose(Disposing);
if (disposing && components)
{
components->Dispose();
}
__super::Dispose(disposing);
}
private: System::Windows::Forms::Label * label1;
private: System::Windows::Forms::TextBox * textBox1;
private: System::Windows::Forms::Label * label2;
private: System::Windows::Forms::Button * button1;
private: System::Windows::Forms::ListBox * listBox1;
private: System::Windows::Forms::ComboBox * comboBox1;

private:
/// <summary>
/// This is the required designer variable.
/// </summary>
System::ComponentModel::Container * components;

/// <summary>
/// This is the required method for Designer support. Do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->label1 = new System::Windows::Forms::Label();
this->textBox1 = new System::Windows::Forms::TextBox();
this->label2 = new System::Windows::Forms::Label();
this->button1 = new System::Windows::Forms::Button();
this->listBox1 = new System::Windows::Forms::ListBox();
this->comboBox1 = new System::Windows::Forms::ComboBox();
this->SuspendLayout();
//
// label1
//
this->label1->Location = System::Drawing::Point(8, 16);
this->label1->Name = S"label1";
this->label1->Size = System::Drawing::Size(144, 16);
this->label1->TabIndex = 5;
this->label1->Text = S"Search for files containing:";
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(8, 40);
this->textBox1->Name = S"textBox1";
this->textBox1->Size = System::Drawing::Size(120, 20);
this->textBox1->TabIndex = 4;
this->textBox1->Text = S"*.dll";
//
// label2
//
this->label2->Location = System::Drawing::Point(8, 96);
this->label2->Name = S"label2";
this->label2->Size = System::Drawing::Size(120, 23);
this->label2->TabIndex = 3;
this->label2->Text = S"Look in:";
//
// button1
//
this->button1->Location = System::Drawing::Point(608, 248);
this->button1->Name = S"button1";
this->button1->TabIndex = 0;
this->button1->Text = S"&Search";
this->button1->Click += new System::EventHandler(this, button1_Click);
//
// listBox1
//
this->listBox1->Location = System::Drawing::Point(152, 8);
this->listBox1->Name = S"listBox1";
this->listBox1->Size = System::Drawing::Size(530, 225);
this->listBox1->TabIndex = 1;
//
// comboBox1
//
// Enlist all the network drives that are available on the computer.
//
String* p_logicalDrives[] = __gc new String*[];
comboBox1->Items->Clear();
p_logicalDrives = Directory::GetLogicalDrives();
int numDrives = p_logicalDrives->get_Length();
for (int i=0; i< numDrives; i++)
{
comboBox1->Items->Add(p_logicalDrives[i]);
}
this->comboBox1->Location = System::Drawing::Point(8, 128);
this->comboBox1->Name = S"comboBox1";
this->comboBox1->Size = System::Drawing::Size(120, 25);
this->comboBox1->TabIndex = 2;
this->comboBox1->Text = S"C:\\";

//
// Form1
//
this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
this->ClientSize = System::Drawing::Size(688, 286);
this->Controls->Add(this->comboBox1);
this->Controls->Add(this->listBox1);
this->Controls->Add(this->button1);
this->Controls->Add(this->label2);
this->Controls->Add(this->textBox1);
this->Controls->Add(this->label1);
this->Name = S"Form1";
this->Text = S"Form1";
this->ResumeLayout(false);

}

private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{
//Clears the list box
listBox1->Items->Clear();
// You do not have option to change the values of the files to be searched
// until the search is completed. Therefore, the value of the following is false.
textBox1->Enabled = false;
comboBox1->Enabled = false;

button1->Text = S"Searching...";
this->Cursor = Cursors::WaitCursor;
Application::DoEvents();

// Call the recursive search method.
DirSearch(comboBox1->Text);
button1->Text = S"Search";
this->Cursor = Cursors::Default;

// After the search is completed, the search criteria is enabled
// and you can add other search criteria to search the files recursively.
textBox1->Enabled = true;
comboBox1->Enabled = true;
}

void DirSearch(String* sDir)
{
try
{
// Find the subfolders in the folder that is passed in.
String* d[] = Directory::GetDirectories(sDir);
int numDirs = d->get_Length();

for (int i=0; i < numDirs; i++)
{
// Find all the files in the subfolder.
String* f[] = Directory::GetFiles(d[i],textBox1->Text);
int numFiles = f->get_Length();

for (int j=0; j < numFiles; j++)
{
listBox1->Items->Add(f[j]);
}
DirSearch(d[i]);
}
}
catch (System::Exception* e)
{
System::Console::WriteLine(e->Message);
}
}
};
}

//Form1.cpp
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>

using namespace RecursiveSearchCPP;

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
Application::Run(new Form1());
return 0;
}
Zpět na horní

Odkazy

Další informace o tom, jak vytvořit model Windows Forms Visual C++ .NET 2002 ve spravovaných rozšířeních naleznete v tématu ukázkové "ManagedCWinFormWiz" v nápovědě k sadě Visual Studio .NET.

Zpět na horní
Vlastnosti

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

Váš názor