DetailPage-MSS-KB

Knowledge Base

Artikel-ID: 307009 - Geändert am: Dienstag, 28. August 2007 - Version: 3.2

 

Auf dieser Seite

Zusammenfassung

Dieser detaillierte Artikel beschreibt, wie rekursiv Suche Unterordner für Dateien, beginnend mit einem Stammordner mit code. Dieser Vorgang wird als Verzeichnis Rekursion bezeichnet. Sie können einen Suchbegriff angeben, sodass Sie nach Dateien suchen können, die einem bestimmten Kriterium entsprechen. Jeder Teil des Codes in diesem Artikel wird erläutert, und ein Codebeispiel arbeiten auch bereitgestellt.

Verzeichnis Rekursion ist eine allgemeine e/A-Aufgabe für Entwickler. Das FileSystemObject -Objekt erleichtert diese Aufgabe für Komponentenobjektmodells (COM) Programme, aber dieser Vorgang ist in Visual C++ .NET 2002 einfacher. Das FileSystemObject -Objekt ähnlich, lassen sich die Klassen im System.IO -Namespace objektorientierte Weise Dateien und Ordner zuzugreifen.

Voraussetzungen

Die folgende Liste führt die empfohlene Hardware, Software, Netzwerkinfrastruktur und Servicepacks, die Sie benötigen:
  • Microsoft Visual C++ .NET oder Microsoft Visual C++ 2005

Directory Rekursion aktivieren

Die Klassen der Manipulation Datei und Verzeichnis befinden sich in der System::IO -Namespace. Bevor Sie mit diesen Klassen arbeiten, fügen Sie folgenden Code:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
System::IO -Namespace bietet viele Optionen für die Arbeit mit Dateien und Ordner. Der System::IO -Namespace stellt nicht nur Klassen, Sie können eine Instanz erstellen, jedoch außerdem Datei- und Verzeichnisnamen Dienstprogrammklassen bietet. Diese Klassen enthalten statische Methoden, die Sie aufrufen können, ohne eine Variable dieses Typs deklarieren zu müssen. Die Directory -Klasse können Sie um die Unterordner eines Ordners zu erhalten.

Im folgenden Codebeispiel wird die statische GetDirectories --Methode der Klasse Directory verwendet, um ein Array von Zeichenfolgen zurückzugeben. Dieses Array enthält Ordnerpfade den Unterordnern des Ordners "C:\", sofern vorhanden:
String* directories[] = Directory::GetDirectories("C:\\");
				
die Directory -Klasse enthält außerdem die GetFiles -Methode. GetFiles können Sie ein Zeichenfolgenarray von Dateien abrufen, die einem bestimmten Kriterium entsprechen. Im folgenden Codebeispiel werden GetFiles -Methode alle Dateien im Ordner "C:\" mit der Erweiterung .dll abzurufen:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
Sie können verwenden, das GetDirectories -Methode und die GetFiles -Methode der Directory -Klasse rekursiv nach Dateien, die der Suchzeichenfolge entsprechen. Verwenden Sie die folgende Methode, um die Rekursion:
	 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);
		 }
	 }
der vorherige Code übergibt eine Zeichenfolge an die DirSearch -Funktion. Dieser Zeichenfolgenwert ist der vollständige Pfad des Ordners, den Sie suchen möchten. GetDirectories -Methode können Sie die Unterordner des Ordners, der übergeben wird in die Prozedur abzurufen. Da die Methode GetDirectories ein Array zurückgibt, können Sie eine for -Anweisung, zum Durchlaufen der einzelnen Unterordner. Verwenden Sie für jeden Unterordner die GetFiles -Methode zum Durchlaufen von Dateien in diesem Ordner. Der Wert des Textfeldes in Ihrem Formular ist der GetFiles -Methode übergeben. Das Textfeld enthält die Suchzeichenfolge, die die Ergebnisse zu filtern, die die GetFiles -Methode zurückgibt. Wenn die Datei die Suchkriterien übereinstimmt, wird Ihr Listenfeld hinzugefügt. Rufen Sie für jeden Unterordner, der gespeichert ist die DirSearch -Funktion erneut, und übergeben Sie dann einen Unterordner. Dieses rekursiven Aufrufs können alle Unterordner eines Ordners Root suchen, die Sie angeben.

Erstellen des Beispiels

  1. Starten Sie Microsoft Visual Studio .NET 2003 oder Microsoft Visual Studio 2005.
  2. Zeigen im Menü Datei auf neu , und klicken Sie dann auf Projekt .
  3. Klicken Sie unter Projekttypen auf Visual C++ .NET .

    Hinweis: In Visual C++ 2005 wird Visual C++ .NET auf Visual C++ geändert.
  4. Klicken Sie unter Vorlagen auf Windows Forms-Anwendung (.NET) .
  5. Geben Sie im Feld Name RecursiveSearchCPP . In der Suchen im Feld, geben C:\ , und klicken Sie auf OK .
  6. Öffnen Sie das Form1 -Formular in Entwurfsansicht anzeigen, und drücken Sie dann F4, um das Eigenschaftenfenster zu öffnen.
  7. Erweitern Sie im Fenster Eigenschaften den Größe Ordner. Geben Sie im Feld Breite 700 . Geben Sie im Feld Höhe 320 .
  8. Fügen Sie zwei Label -Steuerelemente, ein TextBox -Steuerelement, ein Kombinationsfeld -Steuerelement, ein ListBox -Steuerelement, und ein Button -Steuerelement auf das Formular Form1.
  9. Klicken Sie im Eigenschaftenfenster ändern Sie den Speicherort , Größe , den TabIndex und Text -Eigenschaften wie folgt:
    Tabelle minimierenTabelle vergrößern
    Steuerelement-IDOrdnerGrößeTabIndexText
    Label18, 16144, 165Suchen Sie nach Dateien, die enthalten:
    textBox18, 40120, 204*.dll
    Label28, 96120, 253Suchen Sie in:
    Button1608, 24875, 250&Suchen
    listBox1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. Fügen Sie in der InitializeComponent -Methode für das Kombinationsfeld den folgenden Code die Netzlaufwerke eintragen, die auf dem Computer verfügbar sind:
    // 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. Doppelklicken Sie auf die Schaltfläche Suchen auf und fügen Sie folgenden Code in der Methode:
    // 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. Drücken Sie STRG + F5, um zu erstellen, zum Erstellen der Anwendung.
  13. Führen Sie die Anwendung aus.

Vollständiges Codebeispiel

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

Informationsquellen

Weitere Informationen zum Erstellen von Windows Forms in verwalteten Erweiterungen für Visual C++ .NET 2002 finden Sie im Beispiel "ManagedCWinFormWiz" in der Hilfe zu Visual Studio .NET.


Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Keywords: 
kbmt kbhowtomaster kbio KB307009 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 307009  (http://support.microsoft.com/kb/307009/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Freigeben
Weitere Supportoptionen
Microsoft Community-Supportforen
Kontaktieren Sie uns direkt
Zertifizierten Partner finden
Microsoft Store
Folgen Sie uns: