Você está offline; aguardando reconexão
Entrar

Como pastas de pesquisa recursivamente usando o Visual C++

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

307009
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 306666.
Para um Microsoft .NET translation from VPE for Csharp versão deste artigo, consulte 303974.

Este artigo se refere aos seguintes namespaces Microsoft .NET Framework Class Library:
  • System.IO
  • System.ComponentModel
  • System.Windows.Forms
  • System.Drawing

NESTA TAREFA

Sumário
Este artigo passo a passo descreve como a subpastas de pesquisa recursivamente para arquivos, começando com uma pasta raiz, usando código. Esta tarefa é conhecida como recursão de diretório. Você pode especificar uma seqüência de pesquisa para que você pode procurar arquivos que correspondam a um determinado critério. Cada parte do código neste artigo é explicada e um exemplo de código de trabalho também é fornecido.

Recursão de diretório é uma tarefa comum de E/s para desenvolvedores. O objeto FileSystemObject torna essa tarefa fácil para COM (Component Object Model) programas, mas esta tarefa é mais fácil no Visual C++ .NET 2002. Semelhante ao objeto FileSystemObject , as classes no namespace System.IO fornecem uma maneira orientada a objeto para acessar arquivos e pastas.

Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que você precisa:
  • Microsoft Visual C++ .NET ou Microsoft Visual C++ 2005

Habilitar a recursão de diretório

As classes de manipulação de arquivo e diretório residem no namespace System::IO . Antes de trabalhar com essas classes, adicione o seguinte código:
using <mscorlib.dll>using namespace System;using namespace System::IO;
o namespace System::IO fornece várias opções para trabalhar com arquivos e pastas. O namespace System::IO não apenas fornece classes que você pode criar uma instância de, mas também fornece classes de utilitário de arquivo e diretório. Essas classes contêm métodos estáticos que você pode chamar sem ter que declare uma variável do tipo. Por exemplo, você pode usar a classe de Directory para obter as subpastas de uma pasta.

O código a seguir usa o método GetDirectories estático da classe Directory para retornar uma matriz de seqüências de caracteres. Essa matriz contém caminhos de pasta para as subpastas da pasta C:\, se houver:
String* directories[] = Directory::GetDirectories("C:\\");				
a classe Directory também contém o método GetFiles . Você pode usar GetFiles para recuperar uma matriz de seqüência de caracteres de arquivos que correspondam a um determinado critério. O exemplo de código a seguir usa o método GetFiles para recuperar todos os arquivos na pasta C:\ com uma extensão de nome de arquivo .dll:
String* files[] = Directory::GetFiles("C:\\", "*.dll");				
você pode usar o método GetDirectories e o método GetFiles da classe Directory recursivamente procurar arquivos que correspondem a seqüência de caracteres de pesquisa. Use o seguinte método para executar a recursão:
	 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);		 }	 }
o código anterior passa uma seqüência de caracteres para a função DirSearch . Esse valor de seqüência de caracteres é o caminho completo da pasta que você deseja pesquisar. Você pode usar o método GetDirectories para recuperar as subpastas da pasta que é passado para o procedimento. Como o método GetDirectories retorna uma matriz, você pode usar uma instrução para iterar em cada subpasta. Para cada subpasta, use o método GetFiles para iterar sobre os arquivos nessa pasta. O valor da caixa de texto no formulário é passado para o método GetFiles . A caixa de texto contém a seqüência de pesquisa que filtra os resultados que o método GetFiles retorna. Quando o arquivo coincide com os critérios de pesquisa, ele é adicionado à sua caixa de listagem. Para cada subpasta que está localizada, chamar a função DirSearch novamente e, em seguida, passar uma subpasta. Você pode usar esta chamada recursiva para pesquisar todas as subpastas de uma pasta raiz que você especificar.

Criar o exemplo

  1. Inicie o Microsoft Visual Studio .NET 2003 ou Microsoft Visual Studio 2005.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Em Project Types , clique em Visual C++. NET .

    Observação No Microsoft Visual C++ 2005, Visual C++ .NET é alterado para Visual C++ .
  4. Em modelos , clique em Windows Forms Application (. NET) .
  5. Na caixa nome , digite RecursiveSearchCPP . Em Localizar caixa, digite C:\ e, em seguida, clique em OK .
  6. Abra o formulário Form1 no design exibir e, em seguida, pressione F4 para abrir a janela Propriedades.
  7. Na janela Properties, expanda a pasta de tamanho . No campo largura , digite 700 . No campo altura , digite 320 .
  8. Adicione dois controles Label , um controle TextBox , um controle ComboBox , um controle ListBox e um controle Button ao formulário Form1.
  9. Na janela Propriedades, altere o local , o tamanho , TabIndex e as propriedades de texto da seguinte maneira:
    Controle de códigoLocalTamanhoTabIndexTexto
    Label18, 16144, 165Procurar por arquivos que contêm:
    textBox18, 40120, 204*.dll
    Label28, 96120, 253Examine:
    Button1608, 24875, 250&Pesquisa
    Caixalistagem1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. No método InitializeComponent para a caixa de combinação, adicione o seguinte código para inscrever-se todas as unidades rede disponíveis no computador:
    // 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. Clique duas vezes no botão Pesquisar e cole o código a seguir no método:
    // 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. Para criar o aplicativo, pressione CTRL + F5 para criar.
  13. Execute o aplicativo.

Exemplo de código concluída

// Form1.h#pragma oncenamespace 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;}
Referências
Para obter mais informações sobre como criar Windows Forms em extensões gerenciadas para o Visual C++ .NET 2002, consulte o exemplo de "ManagedCWinFormWiz" na Ajuda do Visual Studio .NET.

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 307009 - Última Revisão: 08/28/2007 06:26:02 - Revisão: 3.2

  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • kbmt kbhowtomaster kbio KB307009 KbMtpt
Comentários