Ako rekurzívne vyhľadávacie priečinky pomocou Visual c ++

Preklady článku Preklady článku
ID článku: 307009 - Zobraziť produkty, ktorých sa tento článok týka.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

SUHRN

Tento podrobný článok popisuje ako rekurzívne Prehľadávať podpriečinky pre súbory začínajúce koreňového priečinka pomocou kódu. Táto úloha je známy ako adresár rekurziu. Môžete zadať vyhľadávanie reťazec tak, že môžete vyhľadávať súbory, ktoré spĺňajú určité kritériá. Každý časť kódu v tomto článku je vysvetlené, a je pracovný kód vzorka poskytnú tiež.

Adresár rekurziu je spoločné I/O úloha pre vývojárov. The FileSystemObject objekt uľahčuje tejto úlohy pre COM Component Object Model) programy, ale táto úloha je jednoduchšie v Visual C++.NET 2002. Podobné FileSystemObject objekt, triedy v System.io priestor názvov poskytujú objektovo-orientované spôsob na prístup k súborom a priečinky.

Požiadavky

Nasledujúci zoznam popisuje odporúčané hardvér, softvér, sieťovú infraštruktúru a balíky service pack, ktoré potrebujete:
  • Microsoft Visual C++.NET alebo Microsoft Visual c ++ 2005

Umožniť Directory rekurziu

Nachádzajú manipulácia triedy súborov a adresárov v System::IO priestor názvov. Pred prácou s týchto tried, pridať nasledujúce kód:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
The System::IO priestor názvov poskytuje možnosti pre prácu so súbormi a s priečinkami. The System::IO priestor názvov nielen poskytuje tried, ktoré môžete vytvoriť inštancia, ale tiež poskytuje súborov a adresárov pomôcku triedy. Tieto triedy obsahujú statickej metódy, ktoré môžete volať bez toho, aby vyhlásiť premenná tohto typu. Napríklad, môžete použiť Adresár Trieda získať podpriečinky priečinka.

The nasledujúceho kódu používa statickými GetDirectories metóda Adresár Trieda vrátiť Pole reťazcov. Toto pole obsahuje priečinok cesty podpriečinky priečinka C:\, ak existuje ktorákoľvek:
String* directories[] = Directory::GetDirectories("C:\\");
				
The Adresár Trieda tiež obsahuje GetFiles metóda. Môžete použiť GetFiles na načítanie Pole reťazcov s n?ízvami spĺňajú určité kritériá. Nasledujúce kód vzorky použitia GetFiles metóda získať všetky súbory v priečinku C:\ s súboru .dll Prípona názvu:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
Môžete použiť GetDirectories metóda a GetFiles metóda Adresár triedy rekurzívne hľadať súbory, ktoré zápas vyhľadávací reťazec. Použiť túto metódu na vykonanie rekurziu:
	 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);
		 }
	 }
Predchádzajúci kód prechádza reťazca s DirSearch Funkcia. Túto hodnotu reťazca je úplná cesta priečinka, ktorý chcete vyhľadať. Môžete použiťGetDirectories metóda na získanie podpriečinky priečinka, ktorý je odovzdaný do váš postup. Pretože GetDirectories metóda Vracia pole, môžete použiť pre vyhlásenie Iterácia súboru počas každého podpriečinka. Pre každého podpriečinka použite GetFiles metóda Iterácia súboru nad súbory v tomto priečinku. Hodnota textové pole formulára prechádza do GetFiles metóda. Blok textu obsahuje hľadaný reťazec, ktorý filtruje výsledky, ktoré GetFiles metóda vráti. Keď súbor spĺňajúce kritériá vyhľadávania, je pridaný do vášho zoznamu. Pre každého podpriečinka, ktorý je umiestnený, volajte DirSearch Funkcia znova a potom prechádzajú podpriečinok. Môžete použiť tento rekurzívne hovoru chcete prehľadať všetky podpriečinky hlavného priečinka, ktoré zadáte.

Vytvorenie vzorky

  1. Spustiť Microsoft Visual Studio.NET 2003 alebo Microsoft Visual Studio 2005.
  2. Na Súbor ponuku, ukážte naNové, a potom kliknite na tlačidlo Projekt.
  3. Podľa Projekt typy, kliknite na tlačidloVisual C++.NET.

    Poznámka V programe Microsoft Visual c ++ 2005, Visual C++.NET sa zmení na Visual c ++.
  4. Podľa Šablóny, kliknite na tlačidloWindows formy aplikácie (.NET).
  5. V meno zadajteRecursiveSearchCPP. V Vyhľadajtezadajte C:\, a potom kliknite na tlačidlook.
  6. Otvorené Form1 formulár v dizajne zobrazenie a potom stlačením klávesu F4 otvorte Okno Vlastnosti.
  7. V okne Vlastnosti Rozbaliť Veľkosť priečinok. V Šírka pole Typ700. V Výška pole Typ320.
  8. Pridajte dva Štítok kontroly, jeden Blok textu kontrola, jedenComboBox kontrola, jeden ListBox kontroly a jeden Tlačidlo kontroly na Form1 formulár.
  9. V okne Vlastnosti zmeňteUmiestnenie, Veľkosť, TabIndex, a The Textu vlastnosti takto:
    Zbaliť túto tabuľkuRozbaliť túto tabuľku
    Kontrola IDENTIFIKÁCIAUmiestnenieVeľkosťTabIndexTextu
    Label18, 16144, 165Hľadať súbory, ktoré obsahujú:
    textBox18, 40120, 204*.dll
    Label28, 96120, 253Kde hľadať:
    button1608, 24875, 250& Vyhľadávanie
    listBox1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. V InitializeComponent metóda pre pole so zoznamom Pridať nasledujúci kód trvajúca všetky sieťové jednotky, ktoré sú k dispozícii na 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 kliknite na Vyhľadávanie tlačidlo a potom prilepte nasledujúci kód v metóde:
    // 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. Zostavte aplikáciu, stlačte CTRL + F5 stavať.
  13. Spustiť aplikácia.

Kompletná vzorka sa kód

// 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

Ďalšie informácie o tom, ako vytvoriť formuláre systému Windows v riadené rozšírenia pre Visual C++.NET 2002, pozri vzorka sa "ManagedCWinFormWiz" Visual Studio.NET Help.

Vlastnosti

ID článku: 307009 - Posledná kontrola: 31. októbra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Kľúčové slová: 
kbhowtomaster kbio kbmt KB307009 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:307009

Odošlite odozvu

 

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