Cómo las carpetas de búsqueda de forma recursiva mediante Visual C++

Seleccione idioma Seleccione idioma
Id. de artículo: 307009 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se describe cómo recursivamente las subcarpetas de búsqueda de archivos, comenzando en una carpeta raíz, mediante código. Esta tarea se conoce como recursividad de directorios. Puede especificar una cadena de búsqueda, de modo que puede buscar archivos que coincidan con determinados criterios. Se explica cada parte del código en este artículo, y también se proporciona un ejemplo de código trabajo.

La recursividad de directorio es una tarea de E/s común para los desarrolladores. El objeto FileSystemObject facilita esta tarea para el modelo de objetos componentes (COM) programas, pero esta tarea es más fácil en Visual C++ .NET 2002. Al igual que el objeto FileSystemObject , las clases en el espacio de nombres System.IO proporcionan una forma orientada a objetos tener acceso a archivos y carpetas.

Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los service pack recomendados que se necesitarán:
  • Microsoft Visual C++ .NET o Microsoft Visual C++ 2005

Habilitar la recursividad de directorios

Las clases de manipulación de directorios y archivos residen en el espacio de nombres de System::IO . Antes de trabajar con estas clases, agregue el código siguiente:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
el espacio de nombres System::IO proporciona muchas opciones para trabajar con archivos y carpetas. El espacio de nombres de System::IO no sólo proporciona clases que puede crear una instancia de, pero también proporciona clases para utilidades de directorio y archivos. Estas clases contienen métodos estáticos que pueden llamarse sin tener que declarar una variable de ese tipo. Por ejemplo, puede utilizar la clase Directory para obtener las subcarpetas de una carpeta.

El código siguiente utiliza el método estático GetDirectories de la clase Directory para devolver una matriz de cadenas. Esta matriz contiene las rutas de carpeta a las subcarpetas de la carpeta C:\, si existen:
String* directories[] = Directory::GetDirectories("C:\\");
				
la clase Directory también contiene el método GetFiles . Puede utilizar GetFiles para recuperar una matriz de cadenas de archivos que cumplen determinados criterios. En el siguiente ejemplo de código utiliza el método GetFiles para recuperar todos los archivos en la carpeta C:\ con una extensión de nombre de archivo .dll:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
puede utilizar el método GetDirectories y el método GetFiles de la clase Directory para buscar de forma recursiva archivos que coincidan con la cadena de búsqueda. Utilice el método siguiente para efectuar la recursividad:
	 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);
		 }
	 }
el código anterior pasa una cadena a la función DirSearch . Este valor de cadena es la ruta de acceso completa de la carpeta que desea buscar. Puede utilizar el método GetDirectories para recuperar las subcarpetas de la carpeta que se pasa al procedimiento. Debido a que el método GetDirectories devuelve una matriz, puede utilizar una instrucción for para recorrer en iteración cada subcarpeta. Para cada subcarpeta, utilice el método GetFiles para iterar por los archivos de esa carpeta. El valor del cuadro de texto en el formulario se pasa al método GetFiles . El cuadro de texto contiene la cadena de búsqueda que filtra los resultados que devuelve el método GetFiles . Cuando el archivo coincide con los criterios de búsqueda, se agrega al cuadro de lista. Para cada subcarpeta que se encuentra, llame la función DirSearch nuevo y, a continuación, pase una subcarpeta. Puede utilizar esta llamada recursiva para buscar todas las subcarpetas de una carpeta de raíz que especifique.

Crear el ejemplo

  1. Inicie Microsoft Visual Studio .NET 2003 o Microsoft Visual Studio 2005.
  2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
  3. En Tipos de proyecto , haga clic en Visual C++. NET .

    Nota En Microsoft Visual C++ 2005, Visual C++ .NET se cambia a Visual C++ .
  4. En plantillas , haga clic en Aplicación de Windows Forms (. NET) .
  5. En el cuadro nombre , escriba RecursiveSearchCPP . En el Buscar , escriba C:\ y, a continuación, haga clic en Aceptar .
  6. Abra el formulario Form1 en diseño de ver y, a continuación, presione F4 para abrir la ventana Propiedades.
  7. En la ventana Propiedades, expanda la carpeta de tamaño . En el campo ancho , escriba 700 . En el campo alto , escriba 320 .
  8. Agregue dos controles Label , un control TextBox , un control ComboBox , un control ListBox y un control Button al formulario Form1.
  9. En la ventana Propiedades, cambie la ubicación , el tamaño , TabIndex y las propiedades de texto como sigue:
    Contraer esta tablaAmpliar esta tabla
    Control IDUbicaciónTamañoTabIndexTexto
    Label18, 16144, 165Buscar archivos que contienen:
    textBox18, 40120, 204*.dll
    Label28, 96120, 253Buscar en:
    Button1608, 24875, 250&Búsqueda
    listBox1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. En el método InitializeComponent del cuadro combinado, agregue el siguiente código para incluir todas las unidades de red que están disponibles en el equipo:
    // 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. Haga doble clic en el botón Buscar y, a continuación, pegue el código siguiente en el 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 generar la aplicación, presione CTRL + F5 para generar.
  13. Ejecute la aplicación.

Código completo del ejemplo

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

Referencias

Para obtener más información acerca de cómo crear formularios Windows Forms en extensiones administradas para Visual C++ .NET 2002, vea el ejemplo "ManagedCWinFormWiz" en Ayuda de Visual Studio. NET.

Propiedades

Id. de artículo: 307009 - Última revisión: martes, 28 de agosto de 2007 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard
Palabras clave: 
kbmt kbhowtomaster kbio KB307009 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 307009

Enviar comentarios

 

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