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

Překlady článku Překlady článku
ID článku: 307009 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento podrobný článek popisuje, jak do podsložek hledání rekurzivně pro soubory, kód začínající kořenové složky pomocí. Tento úkol je označován jako adresář rekurze. Vyhledávací řetězec můžete určit, že můžete hledat soubory, které splňují určitá kritéria. Každá část kód v tomto článku je vysvětlen a je také poskytován ukázkový kód pracovní.

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

Požadavky

Následující seznam obsahuje doporučený hardware, software, síťovou infrastrukturu a požadované aktualizace Service Pack:
  • Microsoft Visual C++ .NET nebo Microsoft Visual C++ 2005

Povolit Directory rekurze

V oboru názvů System::IO jsou umístěny třídy manipulace souborů a adresářů. 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. Obor názvů System::IO poskytuje pouze třídy vytvořit instanci, ale také poskytuje nástroj tříd souborů a adresářů. Tyto třídy obsahují statické metody, které lze volat bez nutnosti deklarovat proměnnou typu. Můžete například použít třídy Directory získat podsložky složky.

Následující kód používá statickou metodu GetDirectories třídy Directory vrátíte pole řetězců. Toto pole obsahuje složky cesty do podsložek složky C:\, pokud existuje:
String* directories[] = Directory::GetDirectories("C:\\");
				
třída Directory obsahuje také metody GetFiles. GetFiles můžete použít k načtení pole řetězců souborů, které odpovídají 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 metoda GetFiles třídy Directory hledání rekurzivně soubory vyhovující vyhledávací řetězec. Provést rekurze použijte následující metodu:
	 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á řetězec funkce DirSearch. Tato hodnota řetězec je úplná cesta složky, které chcete hledat. Pomocí metody GetDirectories lze načíst podsložky složky je předán do do procedury. Protože metoda GetDirectories vrací matici, můžete použít příkaz pro iterovat přes každé podsložky. Pro každou podsložku pomocí metody GetFiles iterovat přes soubory v této složce. Metoda GetFiles předána hodnota textového pole na formuláři. Textové pole obsahuje vyhledávací řetězec, který filtruje výsledky vrátí metoda GetFiles. Odpovídá souboru kritérií hledání, je přidán do seznamu pole. Pro každou podsložku, která je umístěna volání funkce DirSearch znovu a předat podsložku. Pomocí tohoto rekurzivní volání může prohledat všechny podsložky kořenové složky, které určíte.

Vytvoření ukázky

  1. Spustit Microsoft Visual Studio .NET 2003 nebo Microsoft Visual Studio 2005.
  2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
  3. V části Typy projektu klepněte na položku Visual C++.NET.

    Poznámka: V aplikaci Microsoft Visual C++ 2005 Visual C++.NET změněn na Visual C++.
  4. V části šablony na Model Windows Forms Application (.NET).
  5. V poli název zadejte RecursiveSearchCPP. V vyhledejte zadejte C:\ a potom klepněte na tlačítko OK.
  6. Otevřete formulář Form1 v návrhovém zobrazení a stisknutím klávesy F4 otevřete okno Vlastnosti.
  7. V okně Vlastnosti rozbalte složku velikost. Do pole Šířka zadejte 700. V poli Výška zadejte 320.
  8. Přidat dva ovládací prvky štítek, jeden ovládací prvek TextBox, jeden ovládací prvek ComboBox jeden ovládací prvek seznam a jednoho ovládacího prvku tlačítko do formuláře Form1.
  9. V okně Vlastnosti změňte umístění, velikost, TabIndex a vlastnosti text následujícím způsobem:
    Zmenšit tuto tabulkuRozšířit tuto tabulku
    Ovládací prvek IDUmístěníVelikostTabIndexText
    Label18, 16144, 165Hledat soubory, které obsahují:
    textBox18, 40120, 204*.dll
    label28, 96120, 253Vyhledat v:
    Button1608, 24875, 250&Hledání
    Seznam1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. V metodě InitializeComponent pro pole se seznamem přidejte následující kód 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. Poklepejte na tlačítko Hledat a 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. Sestavit aplikaci, stiskněte CTRL + F5 sestavení.
  13. Spuštění aplikace.

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

Odkazy

Další informace o vytvoření model Windows Forms v spravované rozšíření pro Visual C++ .NET 2002 naleznete vzorové "ManagedCWinFormWiz" v nápovědě Visual Studio .NET.

Vlastnosti

ID článku: 307009 - Poslední aktualizace: 28. srpna 2007 - Revize: 3.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Klíčová slova: 
kbmt kbhowtomaster kbio KB307009 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:307009

Dejte nám zpětnou vazbu

 

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