Visual C++ kullanarak özyinelemeli olarak arama klasörleri hakkında

Makale çevirileri Makale çevirileri
Makale numarası: 307009 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bu adım adım makalede nasıl da kullanarak bir kök klasör ile başlayan dosyalar için özyinelemeli arama alt klasörlere kod açıklar. Bu görev, dizin özyineleme bilinir. Arama dizesi belirtebilirsiniz, böylece belirli bir ölçüte uyan dosyaları arayabilirsiniz. Bu makaledeki kod her bölümü açıklanmıştır ve bir <a0>çalışma</a0> kod örneği de sağlanır.

Dizin özyineleme geliştiriciler için ortak bir g/Ç görevdir. Bu görevi FileSystemObject nesnesini Bileşen Nesne Modeli (COM) kolaylaştırır, ancak programlar bu görevi Visual C++ .NET 2002'de daha kolay. Benzer şekilde bir FileSystemObject nesnesini, System.ıo ad alanındaki sınıfların dosya ve klasörlere erişmek için bir nesne yönelimli sağlar.

Gereksinimler

Aşağıdaki listede, gereksinim duyacağınız donanım, yazılım, ağ altyapısı ve hizmet paketleri önerilmektedir:
  • Microsoft Visual C++ .NET veya Microsoft Visual C++ 2005

Dizin Recursion etkinleştir

Dosya ve dizin düzenleme sınıfları System::IO ad alanında bulunur. Bu sınıflar ile çalışmak için önce aşağıdaki kodu ekleyin:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
System::IO ad, dosyalarla ve klasörlerle çalışma için birçok seçenek sağlar. System::IO ad yalnızca örneği oluşturabilirsiniz, ancak dosya ve dizin yardımcı sınıfları sağlar... sınıfları sağlar. Bu sınıflar, bu türde bir değişken bildirmek zorunda kalmadan çağırabileceğiniz statik yöntemler içerir. Örneğin, Directory sınıfı, bir klasörün alt klasörleri almak için kullanabilirsiniz.

Aşağıdaki kod, dize dizisi dönmek için <a0>dizin</a0> sınıfının statik GetDirectories yöntemi kullanır. Bu dizinin alt C:\ klasörünün, klasör yolları varsa herhangi:
String* directories[] = Directory::GetDirectories("C:\\");
				
Directory sınıfı, GetFiles yöntemini de içerir. GetFiles, belirli bir ölçüte uyan dosyaları bir dize dizisi almak için kullanabilirsiniz. Aşağıdaki kod örneği GetFiles C:\ klasöründe bir .dll dosya adı uzantısına sahip tüm dosyaları almak için yöntemini kullanır:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
GetDirectories yöntemi ve özyinelemeli olarak arama, arama dizesini dosyaları için <a1>dizin</a1> sınıfının GetFiles yöntemini kullanabilirsiniz. Özyineleme gerçekleştirmek için aşağıdaki yöntemi kullanın: <a1>
	 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);
		 }
	 }
Önceki kod DirSearch işleve bir dize gönderir. Bu dize değeri aramak istediğiniz klasörün tam yoludur. Geçirilen klasörünün alt klasörleri yordamınız almak için GetDirectories yöntemini kullanabilirsiniz. GetDirectories yöntemi bir dizi verdiğinden, her alt klasörün içinde yineleme yapmak için ifade kullanabilirsiniz. Her alt klasörün, bu klasördeki dosyalar üzerinde yineleme yapmak için GetFiles yöntemini kullanın. Formunuzda metin kutusunun değeri GetFiles yönteme geçirildi. Metin kutusunu GetFiles yönteminin döndürdüğü sonuç süzgeçleri arama dizesini içerir. Dosya arama ölçütleri ile eşleşen liste kutunuz eklenir. Bulunan her alt klasörün DirSearch işlevi tekrar arayın ve sonra da bir alt klasör geçirmek. Bu bir özyinelemeli arama, belirttiğiniz bir kök klasörün tüm alt klasörleri aramak için kullanabilirsiniz.

Örnek oluşturma

  1. Microsoft Visual Studio .NET 2003 veya Microsoft Visual Studio 2005'i başlatın.
  2. Dosya menüsünde Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
  3. Project Types altında Visual C++.NET ' i tıklatın.

    Not Microsoft Visual C++ 2005'te, Visual C++.NET, Visual C++ için değiştirilir.
  4. Şablonları altında Windows Forms uygulaması (.NET) tıklatın.
  5. Ad kutusuna RecursiveSearchCPP yazın. Içinde Bul kutusunda C:\ yazın ve Tamam ' ı tıklatın.
  6. Tasarım Form1 formunu açmak görüntüleyin ve sonra da Özellikler penceresini açmak için F4 tuşuna basın.
  7. Özellikler penceresinde boyutu klasörünü genişletin. Genişlik</a0> alanına, 700 yazın. Yükseklik</a0> alanına, 320 yazın.
  8. Iki Etiket denetimi, bir TextBox (metin kutusu) denetimi, bir ComboBox denetimi, bir liste kutusu denetimi ve bir Düğme denetimi Form1 forma ekleyin.
  9. Özellikler penceresinde Konum, <a1>Boyut</a1>, Tabındex ve metin özelliklerini aşağıdaki gibi değiştirin:
    Bu tabloyu kapaBu tabloyu aç
    Denetim KIMLIĞIKonumBoyutTabındexText
    label18, 16144, 165Içeren dosyaları arayın:
    textBox18, 40120, 204*.dll
    sütununulabel28, 96120, 253Bak:
    button1608, 24875, 250&Arama
    listBox1152, 8530, 2251
    comboBox18, 128120, 252c:\\
  10. ınitializecomponent yöntemini birleşik giriş kutusu için bilgisayarda kullanılabilir olan ağ sürücülerini listeleme aşağıdaki kodu ekleyin:
    // 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. Arama düğmesini çift tıklatın ve aşağıdaki kodu yöntemi yapıştırın:
    // 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. Uygulama oluşturmak için <a0></a0>, oluşturmak için CTRL + F5 tuşlarına basın.
  13. Uygulamayı çalıştırın.

Tam bir kod örneği

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

Referanslar

Windows Forms, Visual C++ .NET 2002 için Yönetilen Uzantılar oluşturma hakkında daha fazla bilgi için Visual Studio .NET Yardımı'nda "ManagedCWinFormWiz" örneğe bakın.

Özellikler

Makale numarası: 307009 - Last Review: 28 Ağustos 2007 Salı - Gözden geçirme: 3.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Anahtar Kelimeler: 
kbmt kbhowtomaster kbio KB307009 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:307009

Geri Bildirim Ver

 

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