Bagaimana untuk secara rekursif folder pencarian dengan menggunakan Visual C++

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 307009 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini selangkah demi selangkah menjelaskan cara untuk secara rekursif mencari subfolder untuk file, dimulai dengan map akar, dengan menggunakan kode. Tugas ini dikenal sebagai direktori rekursi. Anda dapat menentukan pencarian string sehingga Anda dapat mencari berkas yang sesuai kriteria tertentu. Setiap bagian dari kode dalam artikel ini menjelaskan, dan sampel kode bekerja juga disediakan.

Direktori rekursi adalah umum I/O tugas untuk pengembang. The FileSystemObject objek membuat tugas ini mudah untuk Component Object Model (COM) program, tapi tugas ini lebih mudah dalam Visual C++.NET 2002. Mirip FileSystemObject objek, kelas-kelas di System.io namespace menyediakan cara yang berorientasi objek untuk akses file dan folder.

Persyaratan

Daftar berikut menguraikan fitur perangkat keras, perangkat lunak, jaringan infrastruktur, dan paket layanan yang Anda butuhkan:
  • Microsoft Visual C++.NET atau Microsoft Visual C++ 2005

Mengaktifkan direktori rekursi

Kelas manipulasi file dan direktori berada di System::IO namespace. Sebelum Anda bekerja dengan kelas-kelas ini, tambahkan berikut kode:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
The System::IO namespace menyediakan banyak pilihan untuk bekerja dengan file dan dengan folder. The System::IO namespace tidak hanya memberikan kelas yang Anda dapat membuat contoh, tetapi juga menyediakan file dan direktori utilitas kelas. Ini kelas berisi statis metode yang dapat Anda hubungi tanpa harus menyatakan variabel dari jenis. Sebagai contoh, Anda dapat menggunakan Direktori kelas untuk memperoleh subfolder dari folder.

The Berikut kode menggunakan statis GetDirectories metode Direktori kelas untuk mengembalikan sebuah array dari string. Array ini berisi map jalan untuk subfolder dari folder c: \, jika ada ada:
String* directories[] = Directory::GetDirectories("C:\\");
				
The Direktori kelas juga berisi GetFiles metode. Anda dapat menggunakan GetFiles untuk mengambil string array file yang sesuai kriteria tertentu. Berikut kode sampel menggunakan GetFiles metode untuk mengambil semua file dalam folder c: \ dengan berkas .dll ekstensi nama:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
Anda dapat menggunakan GetDirectories metode dan GetFiles metode Direktori kelas untuk secara rekursif mencari file yang mencocokkan string pencarian. Menggunakan metode berikut untuk melakukan rekursi:
	 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);
		 }
	 }
Kode sebelumnya melewati string untuk DirSearch fungsi. Nilai string ini adalah path lengkap dari map yang ingin Anda cari. Anda dapat menggunakanGetDirectories metode untuk mengambil subfolder dari folder yang dilewatkan ke Anda prosedur. Karena GetDirectories metode ini mengembalikan array, Anda dapat menggunakan untuk pernyataan untuk atas setiap subfolder. Untuk setiap subfolder, menggunakan GetFiles metode untuk atas file dalam folder. Nilai kotak teks pada formulir Anda berlalu untuk GetFiles metode. Kotak teks berisi string pencarian yang menyaring hasil yang GetFiles metode kembali. Ketika file sesuai kriteria pencarian, ditambahkan ke daftar kotak. Untuk setiap subfolder yang terletak, panggilan DirSearch berfungsi lagi, dan kemudian lulus subfolder. Anda dapat menggunakan rekursif ini panggilan untuk mencari semua subfolder dari folder akar yang Anda tentukan.

Membuat sampel

  1. Mulai Microsoft Visual Studio.NET 2003 atau Microsoft Visual Studio 2005.
  2. Pada Berkas menu, titikBaru, lalu klik Project.
  3. Di bawah Jenis proyek, klikVisual C++.NET.

    Catatan Di Microsoft Visual C++ 2005, Visual C++.NET berubah menjadi Visual C++.
  4. Di bawah Pola acu, klikWindows formulir aplikasi (.NET).
  5. Dalam Nama kotak, jenisRecursiveSearchCPP. Dalam Carikotak, jenis C: \, lalu klikOke.
  6. Terbuka Form1 bentuk dalam desain Lihat, dan kemudian tekan F4 untuk membuka Jendela properti.
  7. Pada jendela Properties, memperluas Ukuran folder. Dalam Lebar lapangan, jenis700. Dalam Tinggi lapangan, jenis320.
  8. Menambahkan dua Label kontrol, satu TextBox kontrol, satuComboBox kontrol, satu ListBox kontrol, dan satu Tombol kontrol untuk membentuk Form1.
  9. Pada jendela Properties, mengubahLokasi, the Ukuran, the TabIndex, dan The Teks sifat-sifat sebagai berikut:
    Perkecil tabel iniPerbesar tabel ini
    Kontrol IDLokasiUkuranTabIndexTeks
    Label18, 16144, 165Cari berkas yang berisi:
    textBox18, 40120, 204*.dll
    label28, 96120, 253Lihat:
    button1608, 24875, 250& Search
    listBox1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. Dalam InitializeComponent metode untuk combo box, menambahkan kode berikut untuk meminta semua drive jaringan yang tersedia di komputer:
    // 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. Klik dua kali pada Mencari tombol, dan kemudian paste kode berikut dalam metode:
    // 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. Untuk membangun aplikasi, tekan CTRL + F5 untuk membangun.
  13. Menjalankan aplikasi.

Contoh kode lengkap

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

REFERENSI

Untuk informasi lebih lanjut tentang cara membuat Windows Forms di berhasil ekstensi untuk Visual C++.NET 2002, lihat contoh "ManagedCWinFormWiz" di Visual Studio.NET bantuan.

Properti

ID Artikel: 307009 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Kata kunci: 
kbhowtomaster kbio kbmt KB307009 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:307009

Berikan Masukan

 

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