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

Para una versión de Microsoft Visual Basic .NET de este artículo, consulte
306666 .
Para una versión de Microsoft C# .NET de este artículo, consulte
303974 .

En este artículo se refiere a los siguientes espacios de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System.IO
  • System.ComponentModel
  • System.Windows.Forms
  • System.Drawing

EN ESTA TAREA

Resumen

En este artículo paso a paso describe cómo a buscar de forma recursiva en subcarpetas para los archivos, que comienza con una carpeta de la raíz, mediante código. Esta tarea se conoce como recursividad de directorios. Puede especificar una cadena de búsqueda para que puedan buscar archivos que coincidan con determinados criterios. Cada parte del código en este artículo se explica y también se proporciona un ejemplo de código de trabajo.

Recursividad de directorios es una tarea de E/S habitual para los desarrolladores. El objeto FileSystemObject facilita esta tarea para programas de modelo de objetos componentes (COM), pero esta tarea es más fácil en Visual C++ .NET 2002. Similar al objeto FileSystemObject , las clases en el espacio de nombres System.IO proporcionan una forma orientada a objetos para tener acceso a archivos y carpetas.

Volver al principio

Requisitos

La lista siguiente describe el hardware, software, infraestructura de red y service packs recomendados que necesita:
  • Microsoft Visual C++ .NET o Microsoft Visual C++ 2005
Volver al principio

Activar la recursividad de directorios

Las clases de manipulación de directorios y archivos residen en el espacio de nombres 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 System::IO no sólo proporciona clases que puede crear una instancia de, pero también proporciona clases para utilidades de directorios 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 rutas de acceso de carpeta a las subcarpetas de la carpeta C:\, si existen:
String* directories[] = Directory::GetDirectories("C:\\");
La clase de directorio también contiene el método GetFiles . Puede utilizar GetFiles para recuperar una matriz de cadenas de archivos que cumplen determinados criterios. El ejemplo de código siguiente utiliza el método GetFiles para recuperar todos los archivos en la carpeta C:\ con extensión de nombre de archivo:
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 completa de la carpeta que desea buscar. Puede utilizar el métodoGetDirectories para recuperar las subcarpetas de la carpeta en la que se pasa al procedimiento. Dado 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 recorrer en iteración los archivos en esa carpeta. El valor del cuadro de texto del 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 de nuevo a la función DirSearch y, a continuación, pasar una subcarpeta. Puede utilizar esta llamada recursiva para buscar todas las subcarpetas de una carpeta raíz que especifique.

Volver al principio

Crear el ejemplo

  1. Inicie Microsoft Visual Studio .NET 2003 o Microsoft Visual Studio 2005.
  2. En el menú archivo , elija
    De nuevoy, 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 cuadro Buscar, escriba C:\y, a continuación, haga clic en
    OK.
  6. Abra el formulario Form1 en la vista Diseño 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 , uno
    Control ComboBox , un control ListBox y un control Button al formulario Form1.
  9. En la ventana Propiedades, cambie el
    Ubicación, el tamaño, TabIndexy las propiedades de texto como sigue:
    Identificador de controlUbicació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 código siguiente para dar de alta de 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.
Volver al principio

Ejemplo de código completo

// 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;
}
Volver al principio

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 la Ayuda de Visual Studio. NET.

Volver al principio
Propiedades

Id. de artículo: 307009 - Última revisión: 22 ene. 2017 - Revisión: 1

Comentarios