Come per le cartelle di ricerca in modo ricorsivo utilizzando Visual c ++

Traduzione articoli Traduzione articoli
Identificativo articolo: 307009 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo passo passo viene descritto il come a in modo ricorsivo le sottocartelle di ricerca per i file, che inizia con una cartella principale, mediante codice. Questa operazione Ŕ nota come ricorsione delle directory. ╚ possibile specificare una stringa di ricerca in modo che possano eseguire ricerche per i file che corrispondono a criteri specifici. Ogni parte del codice in questo articolo viene illustrato, e un esempio di codice di lavoro viene inoltre fornito.

La ricorsione di directory Ŕ un'attivitÓ di I/O comune per gli sviluppatori. L'oggetto FileSystemObject semplifica questa operazione per COM (Component Object Model) programmi, ma questa operazione Ŕ pi¨ semplice in Visual c ++ .NET 2002. Simile all'oggetto FileSystemObject , le classi nello spazio dei nomi System.IO forniscono un modo orientato di accedere a file e cartelle.

Requisiti

Nell'elenco seguente sono indicati hardware, software, infrastruttura di rete e i service pack Ŕ necessario:
  • Microsoft Visual c ++ .NET o Microsoft Visual c ++ 2005

Attivare la ricorsione delle directory

Le classi di manipolazione dei file e directory risiedono nello spazio dei nomi System::IO . Prima di utilizzare queste classi, aggiungere il seguente codice:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
lo spazio dei nomi System::IO fornisce numerose opzioni per il lavoro, in file e cartelle. Lo spazio dei nomi System::IO fornisce non solo di classi che Ŕ possibile creare un'istanza di, ma fornisce anche classi di utilitÓ per file e directory. Tali classi contengono metodi static che Ŕ possibile chiamare senza dover dichiarare una variabile di tale tipo. Ad esempio, Ŕ possibile utilizzare la classe Directory per ottenere le sottocartelle della cartella.

Il codice riportato di seguito utilizza il metodo GetDirectories statico della classe Directory per restituire una matrice di stringhe. Questa matrice contiene i percorsi cartella le sottocartelle della cartella C:\, se presenti:
String* directories[] = Directory::GetDirectories("C:\\");
				
la classe di Directory contiene inoltre il metodo GetFiles . ╚ possibile utilizzare GetFiles per recuperare una matrice di stringhe di file che corrispondono a criteri specifici. Nell'esempio di codice riportato di seguito viene utilizzato il metodo di GetFiles per recuperare di tutti i file nella cartella C:\ con estensione dll:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
Ŕ possibile utilizzare il metodo GetDirectories e il metodo GetFiles della classe Directory per la ricerca in modo ricorsivo per i file corrispondenti alla stringa di ricerca. Utilizzare il metodo seguente per eseguire la ricorsione:
	 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);
		 }
	 }
il codice precedente passa una stringa alla funzione DirSearch . Questo valore stringa Ŕ il percorso completo della cartella che si desidera eseguire la ricerca. ╚ possibile utilizzare il metodo di GetDirectories per recuperare le sottocartelle della cartella in cui viene passato nella routine. PoichÚ il metodo GetDirectories restituisce una matrice, Ŕ possibile utilizzare un'istruzione for per scorrere ogni sottocartella. Per ciascuna sottocartella, utilizzare il metodo GetFiles per scorrere i file in tale cartella. Il valore della casella di testo nel form viene passato al metodo GetFiles . La casella di testo contiene la stringa di ricerca che filtra i risultati che restituisce il metodo GetFiles . Quando il file corrisponde ai criteri di ricerca, viene aggiunto alla casella di elenco. Per ciascuna sottocartella che si trova, chiamare la funzione DirSearch nuovamente e passare quindi una sottocartella. ╚ possibile utilizzare questa chiamata ricorsiva per cercare tutte le sottocartelle della cartella principale che specifica.

Creare l'esempio

  1. Avviare Microsoft Visual Studio .NET 2003 o Microsoft Visual Studio 2005.
  2. Scegliere Nuovo dal menu file , quindi progetto .
  3. In Tipi progetto fare clic su Visual c ++. NET .

    Nota In Microsoft Visual c ++ 2005, Visual c ++ .NET viene modificata in Visual c ++ .
  4. In modelli , fare clic su Applicazione Windows Form (. NET) .
  5. Nella casella nome , digitare RecursiveSearchCPP . individuare digitare C:\ , quindi fare clic su OK .
  6. Aprire la maschera Form1 in Design consente di visualizzare e quindi premere F4 per aprire la finestra ProprietÓ.
  7. Nella finestra ProprietÓ, espandere la cartella di dimensione . Nel campo larghezza , digitare 700 . Nel campo altezza , digitare 320 .
  8. Aggiungere due controlli Label , un controllo TextBox , un controllo ComboBox , un controllo ListBox e un controllo Button al form Form1.
  9. Nella finestra ProprietÓ modificare la posizione , la dimensione , la proprietÓ TabIndex e le proprietÓ di testo come segue:
    Riduci questa tabellaEspandi questa tabella
    Controllo IDPosizioneDimensioneTabIndexTesto
    Label18, 16144, 165Cercare i file che contengono:
    textBox18, 40120, 204*.dll
    Label28, 96120, 253Cerca in:
    Button1608, 24875, 250&Ricerca
    listBox1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. Nel metodo InitializeComponent per la casella combinata, aggiungere il seguente codice per integrare tutte le unitÓ rete disponibile nel computer:
    // 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. Fare doppio clic sul pulsante di ricerca e quindi incollare il codice seguente nel metodo:
    // 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. Per generare l'applicazione, premere CTRL+F5 per generare.
  13. Eseguire l'applicazione.

Esempio di codice 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;
}

Riferimenti

Per ulteriori informazioni sulla creazione di Windows Form nelle estensioni gestite per Visual c ++ .NET 2002, vedere l'esempio di "ManagedCWinFormWiz" nella Guida di Visual Studio. NET.

ProprietÓ

Identificativo articolo: 307009 - Ultima modifica: martedý 28 agosto 2007 - Revisione: 3.2
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Chiavi:á
kbmt kbhowtomaster kbio KB307009 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 307009
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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