วิธีการ recursively โฟลเดอร์การค้นหาโดยใช้ c ++ Visual

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 307009 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความที่มีการทีละขั้นตอนนี้อธิบายวิธีการ recursively โฟลเดอร์ย่อยของการค้นหาแฟ้ม ตำแหน่งเริ่มต้น ด้วยโฟลเดอร์ราก โดยใช้รหัส งานนี้เรียกว่าการสอบถามซ้ำของไดเรกทอรี คุณสามารถระบุสายอักขระการค้นหาเพื่อให้คุณสามารถค้นหาแฟ้มที่ตรงกับเงื่อนไขที่แน่นอน แต่ละส่วนของรหัสในบทความนี้จะอธิบาย และยังมีให้ตัวอย่างรหัสการทำงาน

สอบถามซ้ำของไดเรกทอรีเป็นงาน I/O ทั่วไปสำหรับนักพัฒนา กระบวนการFileSystemObjectวัตถุที่ทำงานนี้ง่ายสำหรับคอมโพเนนต์วัตถุแบบจำลอง (COM) โปรแกรม แต่งานนี้ได้ง่ายขึ้นใน 2002 .NET c ++แสดงผล เหมือนกับFileSystemObjectวัตถุ ระดับชั้นในนั้นSystem.IOnamespace ให้วิธีที่เป็นวัตถุในการเข้าถึงแฟ้มและโฟลเดอร์

ความต้องการ

รายการต่อไปนี้แสดงฮาร์ดแวร์ที่แนะนำ ซอฟต์แวร์ โครงสร้างพื้นฐานของเครือข่าย และ service pack ที่คุณต้องการ:
  • Microsoft Visual c ++.NET หรือ Microsoft Visual c ++ 2005

การเปิดใช้งานการสอบถามซ้ำของไดเรกตอรี

คลาสที่ manipulation ของไฟล์และไดเรกทอรีที่อยู่ในนั้นSystem::IOnamespace ก่อนที่คุณทำงานกับคลาสที่เหล่านี้ เพิ่มรหัสต่อไปนี้:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
กระบวนการSystem::IOnamespace แสดงตัวเลือกต่าง ๆ สำหรับการทำงาน กับแฟ้ม และ กับโฟลเดอร์ กระบวนการSystem::IOnamespace แสดงระดับชั้นที่คุณสามารถสร้างอินสแตนซ์ของ แต่มีคลาสที่อรรถประโยชน์ของไฟล์และไดเรกทอรีที่ยังไม่เท่านั้น คลาสที่เหล่านี้ประกอบด้วยวิธีการแบบคงที่คุณสามารถเรียกใช้โดยไม่ต้องกำหนดตัวแปรของชนิดนั้น ตัวอย่างเช่น คุณสามารถใช้การไดเรกทอรีคลาเพื่อขอรับโฟลเดอร์ย่อยของโฟลเดอร์

รหัสต่อไปนี้ใช้คงGetDirectoriesวิธีการนี้ไดเรกทอรีคลาสที่จะส่งกลับอาร์เรย์ของสตริงการ อาร์เรย์นี้ประกอบด้วยเส้นทางโฟลเดอร์ไปยังโฟลเดอร์ย่อยของโฟลเดอร์ C:\ ถ้าใด ๆ ที่มีอยู่:
String* directories[] = Directory::GetDirectories("C:\\");
				
กระบวนการไดเรกทอรีนอกจากนี้ยังประกอบด้วยคลาGetFilesวิธีการ คุณสามารถใช้ได้GetFilesการเรียกอาร์เรย์เป็นสายอักขระของแฟ้มที่ตรงกับเงื่อนไขที่แน่นอน รหัสการต่อไปนี้ใช้ตัวอย่างนี้GetFilesวิธีการดึงข้อมูลไฟล์ทั้งหมดในโฟลเดอร์ C:\ มีนามสกุลชื่อแฟ้ม.dll:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
คุณสามารถใช้ได้GetDirectoriesวิธีการ และGetFilesวิธีการนี้ไดเรกทอรีคลา recursively ค้นหาแฟ้มที่ตรงกับสตริงการค้นหา ใช้วิธีการต่อไปนี้เพื่อทำการสอบถามซ้ำ:
	 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);
		 }
	 }
รหัสก่อนหน้านี้ส่งผ่านสตริงที่ไปDirSearchฟังก์ชัน ค่าสายอักขระนี้มีเส้นทางแบบเต็มของโฟลเดอร์ที่คุณต้องการค้นหา คุณสามารถใช้ได้GetDirectoriesวิธีการเรียกดูโฟลเดอร์ย่อยของโฟลเดอร์ที่ผ่านเข้าไปในกระบวนการของคุณ เนื่องจากการGetDirectoriesวิธีการส่งกลับค่าอาร์เรย์ คุณสามารถใช้เป็นสำหรับคำสั่งเพื่อ iterate บนแต่ละโฟลเดอร์ย่อย สำหรับแต่ละโฟลเดอร์ย่อย ใช้GetFilesวิธีการ iterate ผ่านแฟ้มในโฟลเดอร์นั้น ค่าของกล่องข้อความบนฟอร์มของคุณถูกส่งผ่านไปยังGetFilesวิธีการ กล่องข้อความที่ประกอบด้วยสตริงการค้นหาที่กรองผลลัพธ์ที่จะGetFilesวิธีการคืนค่า เมื่อแฟ้มตรงกับเกณฑ์การค้นหา จะถูกเพิ่มเข้าไปยังกล่องรายการของคุณ สำหรับโฟลเดอร์แต่ละย่อยที่อยู่ เรียกการDirSearchการทำงานอีกครั้ง และจากนั้น ผ่านโฟลเดอร์ย่อย คุณสามารถใช้การเรียกซ้ำนี้เพื่อค้นหาโฟลเดอร์ย่อยทั้งหมดของโฟลเดอร์หลักที่คุณระบุ

สร้างตัวอย่างนี้

  1. เริ่ม Microsoft Visual Studio .NET 2003 หรือ Microsoft Visual Studio 2005
  2. ในการแฟ้ม:เมนู ให้ชี้ไปที่ใหม่แล้ว คลิกProject.
  3. ภายใต้ชนิดโครงการคลิก.NET c ++เสมือน.

    หมายเหตุ:ใน Microsoft Visual c ++ 2005.NET c ++เสมือนเปลี่ยนเป็นc ++เสมือน.
  4. ภายใต้แม่แบบคลิกwindows โปรแกรมประยุกต์ของฟอร์ม (.NET).
  5. ในการชื่อ:กล่อง ชนิดRecursiveSearchCPP. ในการค้นหากล่อง ชนิดC:\แล้ว คลิกตกลง.
  6. เปิดการform1แบบฟอร์มในการออกแบบดู และจากนั้น กด F4 เพื่อเปิดหน้าต่างคุณสมบัติ
  7. ในหน้าต่างคุณสมบัติ ขยายsizeโฟลเดอร์ ในการความกว้าง:ฟิลด์ ชนิด700. ในการความสูงฟิลด์ ชนิด320.
  8. เพิ่มสองป้ายชื่อตัวควบคุม หนึ่งกล่องข้อความตัวควบคุม หนึ่งComboBoxตัวควบคุม หนึ่งกล่องรายการตัวควบคุม และหนึ่งปุ่มควบคุมไปยังแบบฟอร์ม Form1
  9. ในหน้าต่างคุณสมบัติ เปลี่ยนแปลงนั้นตำแหน่ง:กระบวนการsizeกระบวนการTabIndexและข้อความคุณสมบัติดังกล่าว:
    ยุบตารางนี้ขยายตารางนี้
    ตัวควบคุมรหัสตำแหน่ง:sizeTabIndexข้อความ
    label18, 16144, 165ค้นหาแฟ้มที่ประกอบด้วย:
    textBox18, 40120, 204*.dll
    label28, 96120, 253ค้นหาใน:
    button1608, 24875, 250& ค้นหา
    listBox1152, 8530, 2251
    comboBox18, 128120, 252c:\\
  10. ในการInitializeComponentวิธีการสำหรับกล่องคำสั่งผสม เพิ่มโค้ดต่อไปนี้เพื่อ enlist ไดรฟ์เครือข่ายทั้งหมดที่พร้อมใช้งานบนคอมพิวเตอร์:
    // 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. คลิกสองครั้งบนค้นหาปุ่ม และวางรหัสต่อไปนี้ในวิธีการ:
    // 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. เมื่อต้องสร้างโปรแกรมประยุกต์ กด CTRL + F5 เพื่อสร้าง
  13. เรียกใช้โปรแกรมประยุกต์

ตัวอย่างของรหัสการทำให้เสร็จสมบูรณ์

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

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการสร้างแบบฟอร์ม Windows ในส่วนขยายที่มีการจัดการสำหรับ 2002 .NET c ++ Visual ให้ดูที่ "ManagedCWinFormWiz" ตัวอย่างใน Visual Studio .NET ช่วย

คุณสมบัติ

หมายเลขบทความ (Article ID): 307009 - รีวิวครั้งสุดท้าย: 10 มกราคม 2554 - Revision: 4.0
ใช้กับ
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Keywords: 
kbhowtomaster kbio kbmt KB307009 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:307009

ให้ข้อเสนอแนะ

 

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