Al momento sei offline in attesa che la connessione Internet venga ristabilita

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

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.

307009
Per la una versione di Microsoft Visual Basic .NET di questo articolo, vedere 306666.
Per un Microsoft C# .NET versione di questo articolo, vedere 303974.

Questo articolo si riferisce ai seguenti spazi dei nomi delle librerie di classi di Microsoft .NET Framework:
  • System.IO
  • System.ComponentModel
  • System.Windows.Forms
  • System.Drawing

Contenuto dell'attività

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:
    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 oncenamespace 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.

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 307009 - Ultima revisione: 08/28/2007 06:26:02 - Revisione: 3.2

  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • kbmt kbhowtomaster kbio KB307009 KbMtit
Feedback
>