Como pastas de pesquisa recursivamente usando o Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 307009 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

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:
    Recolher esta tabelaExpandir esta tabela
    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 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;
}

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.

Propriedades

ID do artigo: 307009 - Última revisão: terça-feira, 28 de agosto de 2007 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Palavras-chave: 
kbmt kbhowtomaster kbio KB307009 KbMtpt
Tradução automática
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.
Clique aqui para ver a versão em Inglês deste artigo: 307009

Submeter comentários

 

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