Como pastas de procura recursivamente utilizando o Visual C++

Traduções de Artigos Traduções de Artigos
Artigo: 307009 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo passo a passo descreve como a recursivamente subpastas de procura para ficheiros, que começa com uma pasta raiz, utilizando o código. Esta tarefa é conhecida por recursividade de directório. Pode especificar uma cadeia de procura para que possa procurar ficheiros que correspondam a um determinado critério. Cada parte do código neste artigo é explicado e também é fornecido um exemplo de código de trabalho.

Directório recursividade é uma tarefa E/s comum para programadores. O objecto FileSystemObject facilita esta tarefa para o COM (Component Object Model) programas, mas esta tarefa é mais fácil no Visual C++ .NET 2002. Tal como o objecto FileSystemObject , as classes no espaço de nomes System.IO fornecem uma forma orientada para aceder a ficheiros e pastas.

Requisitos

A lista seguinte descreve o hardware recomendado, software, infra-estrutura de rede e service packs que necessita:
  • Microsoft Visual C++ .NET ou Microsoft Visual C++ 2005

Active Directory recursividade

As classes de manipulação de ficheiros e directórios residem no espaço de nomes System::IO . Antes de trabalhar com estas classes, adicione o seguinte código:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
o espaço de nomes System::IO fornece várias opções para trabalhar com ficheiros e pastas. O espaço de nomes System::IO não só fornece classes que pode criar uma instância do mas também fornece classes de utilitário de ficheiro e directório. Estas classes contém métodos estáticos que podem ser chamados sem ter de declarar uma variável desse tipo. Por exemplo, pode utilizar a classe de directório para obter as subpastas de uma pasta.

O código seguinte utiliza o método GetDirectories estático da classe Directory para devolver uma matriz de cadeias. Esta matriz contém caminhos de pastas para as subpastas da pasta C:\, se existir algum:
String* directories[] = Directory::GetDirectories("C:\\");
				
a classe de directório também contém o método GetFiles . Pode utilizar GetFiles para obter uma matriz de cadeia de ficheiros que correspondam a um determinado critério. O código de exemplo seguinte utiliza o método GetFiles para obter todos os ficheiros na pasta C:\ com uma extensão de nome de ficheiro .dll:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
pode utilizar o método GetDirectories e o método GetFiles da classe de directório para procurar ficheiros que correspondem à cadeia procura recursivamente. Utilize o seguinte método para efectuar a recursividade:
	 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);
		 }
	 }
ao código anterior transmite uma cadeia para a função DirSearch . Este valor de cadeia é o caminho completo da pasta que pretende procurar. Pode utilizar o método GetDirectories para obter as subpastas da pasta que é transmitido para o procedimento. Uma vez que o método GetDirectories devolve uma matriz, pode utilizar uma instrução para iterar através de cada subpasta. Para todas as subpastas, utilize o método GetFiles para iterar sobre os ficheiros nessa pasta. O valor da caixa de texto no formulário é transferido para o método GetFiles . A caixa de texto contém a cadeia de procura que filtra os resultados que o método GetFiles devolve. Quando o ficheiro corresponde os critérios de procura, é adicionado à caixa da lista. Para cada subpasta que se encontra, chamar a função DirSearch novamente e, em seguida, passar uma subpasta. Pode utilizar esta chamada recursiva para procurar em todas as subpastas de uma pasta raiz que especificar.

Criar o exemplo

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

    Nota No Microsoft Visual C++ 2005, Visual C++ .NET é alterado para o Visual C++ .
  4. Em modelos , clique em Windows Forms aplicação (NET) .
  5. Na caixa nome , escreva RecursiveSearchCPP . Em Localizar , escreva C:\ e, em seguida, clique em OK .
  6. Abra o formulário Form1 na estrutura de visualizar e, em seguida, prima F4 para abrir a janela Propriedades.
  7. Na janela Propriedades, expanda a pasta de tamanho . No campo largura , escreva 700 . No campo altura , escreva 320 .
  8. Adicione dois controlos de etiqueta , um controlo de caixa de texto , um controlo de caixa de combinação , um controlo de caixa de listagem e um controlo de botão ao formulário Form1.
  9. Na janela Propriedades, altere a localização , tamanho , TabIndex e as propriedades de texto da seguinte forma:
    Reduzir esta tabelaExpandir esta tabela
    Controlo IDLocalizaçãoTamanhoTabIndexTexto
    Label18, 16144, 165Procurar ficheiros que contenham:
    textBox18, 40120, 204*.dll
    label28, 96120, 253Procure:
    Button1608, 24875, 250&Procurar
    Caixadelistagem1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. Método InitializeComponent da caixa de combinação, adicione o código seguinte para inscrever todas as unidades rede estão 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. Faça duplo clique no botão Procurar e, em seguida, cole o código seguinte 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 a aplicação, prima CTRL + F5 para criar.
  13. Execute a aplicação.

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 mais informações sobre como criar formulários do Windows nas extensões geridas para o Visual C++ .NET 2002, consulte o exemplo de "ManagedCWinFormWiz" na ajuda do Visual Studio .NET.

Propriedades

Artigo: 307009 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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