如何使用 Visual C++ 的遞迴搜尋資料夾

文章翻譯 文章翻譯
文章編號: 307009 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴您,如何到遞迴搜尋子資料夾的檔案,開頭是藉由使用的根資料夾代碼。 這項工作就是所謂的目錄遞迴。您可以指定搜尋字串,以便您可以搜尋符合特定準則的檔案。說明本文的程式碼的每個部分,以及也提供工作的程式碼範例。

目錄遞迴是常見的 I/O 工作,開發人員。FileSystemObject 物件輕鬆這項工作的元件物件模型 (COM) 程式,但這項工作是在 Visual C++.NET 2002年中更容易。類似 FileSystemObject 物件,System.IO 命名空間中的類別提供物件導向的方式來存取檔案和資料夾。

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Microsoft Visual C++.NET 或 Microsoft Visual C++ 2005

啟用目錄的遞迴

檔案及目錄操作類別位於 System::IO 命名空間。您使用這些類別之前加入下列程式碼:
using <mscorlib.dll>
using namespace System;
using namespace System::IO;
System::IO 命名空間提供工作的許多選項,與檔案和資料夾。System::IO 命名空間不只提供您可以建立的執行個體,但它也提供檔案和目錄的公用程式類別的類別。這些類別包含而不需要宣告該型別的變數,您可以呼叫的靜態方法。比方說您可以使用 目錄 類別以取得之資料夾的子資料夾。

下列程式碼會使用 目錄 類別的靜態的 GetDirectories 方法傳回的字串陣列。這個陣列包含到 C:\] 資料夾的子資料夾的資料夾路徑,如果有存在任何:
String* directories[] = Directory::GetDirectories("C:\\");
				
目錄 類別也包含 GetFiles 方法。您可以使用 GetFiles 來擷取字串陣列,符合特定準則的檔案。下列程式碼範例使用 GetFiles 方法來擷取具有.dll 副檔名 C:\ 資料夾中的所有檔案:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
您可使用 GetDirectories 方法] 和 [的 目錄 類別中,以符合搜尋字串的檔案以遞迴方式搜尋 GetFiles 方法。使用下列方法,以執行遞迴:
	 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 方法所傳回的陣列所以您可以使用 陳述的式來逐一查看每一個子資料夾。針對每個子資料夾使用 GetFiles 方法來逐一查看該資料夾中的檔案。在表單上的 [文字] 方塊的值傳遞給 GetFiles 方法。[文字] 方塊中包含篩選 GetFiles 方法會傳回結果的搜尋字串。當檔案符合搜尋準則時,則將它新增到清單方塊中。針對每個子資料夾位於,再次,呼叫 DirSearch 函式,然後將 [子資料夾]。您可能會使用這個遞迴呼叫來搜尋您指定的根資料夾的所有子資料夾。

建立範例

  1. 啟動 Microsoft Visual Studio.NET 2003年或 Microsoft Visual Studio 2005。
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  3. 在 [專案類型,按一下 [Visual C++.NET]。

    附註在 Microsoft Visual C++ 2005年中 Visual C++.NET 變更為 Visual C++]。
  4. 在 [範本 下, 按一下 [Windows Form 應用程式 (.NET)]。
  5. 在 [名稱] 方塊中,輸入 RecursiveSearchCPP。在 [尋找] 方塊中輸入 C:\,然後再按一下 [確定]
  6. 在 [設計] 中開啟 Form1 表單檢視,然後按下 F4 以開啟 [屬性] 視窗。
  7. 在 [屬性] 視窗中展開 [大小] 資料夾。在 [寬度] 欄位中,鍵入 700。在 [高度] 欄位中,鍵入 320
  8. 將兩個 標籤 控制項、 一個 TextBox 控制項、 一個 組合方塊 控制項、 一個的 清單方塊 控制項及一個 按鈕 控制項加入至 Form1 表單。
  9. 在 [屬性] 視窗中變更 位置大小定位點索引文字] 屬性,如下所示:
    摺疊此表格展開此表格
    控制項識別碼位置大小定位點索引文字
    label18、 16144、 165搜尋檔案,其中包含:
    textBox18、 40120、 204*.dll
    label28、 96120、 253查詢:
    button1608、 24875、 250搜尋 (& I)
    清單方塊 1152、 8530、 2251
    comboBox18、 128120、 252C:\\
  10. 在下拉式方塊的 InitializeComponent] 方法中加入下列程式碼,以編列在電腦上可用的所有網路磁碟機:
    // 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 Form 的 Visual C++.NET 2002年的詳細資訊,請參閱 ManagedCWinFormWiz 」 範例,說明 Visual Studio.NET 中的]。

屬性

文章編號: 307009 - 上次校閱: 2007年8月28日 - 版次: 3.2
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
關鍵字:?
kbmt kbhowtomaster kbio KB307009 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:307009
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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