Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để đệ quy tìm kiếm thư mục bằng cách sử dụng Visual C++

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:307009
Đối với một Microsoft Visual Basic.NET Phiên bản này viết, xem 306666.
Đối với một Microsoft C#.NET Phiên bản của bài viết này, xem 303974.

Bài viết này đề cập Microsoft sau.Không gian tên thư viện lớp của NET Framework:
  • System.io
  • System.ComponentModel
  • System.Windows.Forms
  • System.Drawing

TRONG TÁC VỤ NÀY

TÓM TẮT
Bài từng bước này mô tả cách đệ quy tìm kiếm thư mục con cho tác phẩm, bắt đầu với một thư mục gốc, bằng cách sử dụng mã. Tác vụ này được gọi là thư mục đệ quy. Bạn có thể chỉ định một tìm kiếm / / String để các bạn có thể tìm kiếm cho các tập tin phù hợp với một tiêu chí nhất định. Mỗi một phần của mã trong bài viết này được giải thích, và một mẫu mã làm việc là cũng cung cấp.

Thư mục đệ quy là một phổ biến I/O nhiệm vụ cho các nhà phát triển. Các FileSystemObject làm đối tượng cho nhiệm vụ này dễ dàng cho mô hình đối tượng thành phần (COM) các chương trình, nhưng công việc này dễ dàng hơn trong Visual C++.NET 2002. Tương tự như các FileSystemObject đối tượng, các lớp học trong các System.io không gian tên cung cấp một hướng đối tượng cách để truy cập tập tin và thư mục.

Yêu cầu

Danh sách sau vạch ra được đề nghị phần cứng, phần mềm, cơ sở hạ tầng mạng và gói dịch vụ mà bạn cần:
  • Microsoft Visual C++.NET hoặc Microsoft Visual C++ 2005

Kích hoạt tính năng thư mục đệ quy

Các tập tin và thư mục thao tác các lớp học nằm trong các System::Io không gian tên. Trước khi bạn làm việc với các lớp học, thêm dưới đây Mã số:
using <mscorlib.dll>using namespace System;using namespace System::IO;
Các System::Io không gian tên cung cấp nhiều tùy chọn để làm việc với tệp và với các thư mục. Các System::Io không gian tên không chỉ cung cấp các lớp học mà bạn có thể tạo ra một Ví dụ, nhưng nó cũng cung cấp các lớp học hữu ích tập tin và thư mục. Đây các lớp học có phương pháp tĩnh mà bạn có thể gọi mà không cần tuyên bố một biến kiểu đó. Ví dụ, bạn có thể sử dụng các Thư mục lớp học để có được các cặp con của cặp.

Các sau mã sử dụng tĩnh GetDirectories phương pháp của các Thư mục lớp học để trở lại một mảng của chuỗi. Mảng này chứa thư mục đường dẫn đến thư mục con trong thư mục c: \, nếu có tồn tại:
String* directories[] = Directory::GetDirectories("C:\\");				
Các Thư mục lớp cũng chứa các GetFiles phương pháp. Bạn có thể sử dụng GetFiles để lấy một chuỗi mảng của tập tin mà phù hợp với một tiêu chí nhất định. Sau mã mẫu sử dụng các GetFiles phương pháp để lấy tất cả các file trong thư mục c: \ với một tập tin .dll phần mở rộng tên:
String* files[] = Directory::GetFiles("C:\\", "*.dll");				
Bạn có thể sử dụng các GetDirectories phương pháp và các GetFiles phương pháp của các Thư mục lớp học để đệ quy tìm kiếm các tập tin mà phù hợp với chuỗi tìm kiếm. Sử dụng phương pháp sau để thực hiện đệ quy:
	 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);		 }	 }
Mã trước đó vượt qua một chuỗi để các DirSearch chức năng. Giá trị chuỗi này là đường dẫn đầy đủ của thư mục mà bạn muốn tìm kiếm. Bạn có thể sử dụng cácGetDirectories phương pháp để lấy các cặp con của cặp được thông qua vào thủ tục của bạn. Bởi vì các GetDirectories phương pháp trả về một mảng, bạn có thể sử dụng một cho tuyên bố để iterate trong mỗi thư mục con. Đối với mỗi thư mục con, sử dụng các GetFiles phương pháp để iterate qua các tập tin trong thư mục đó. Giá trị của các hộp văn bản vào hình thức của bạn thông qua với các GetFiles phương pháp. Hộp văn bản chứa chuỗi tìm kiếm các bộ lọc các kết quả trên mà các GetFiles phương pháp trả về. Khi các tập tin phù hợp với tiêu chí tìm kiếm, nó là thêm vào hộp danh sách của bạn. Đối với mỗi cặp con có vị trí, gọi cho các DirSearch chức năng một lần nữa, và sau đó vượt qua một thư mục con. Bạn có thể sử dụng này đệ quy gọi đến tìm kiếm tất cả các cặp con của cặp gốc mà bạn chỉ định.

Tạo mẫu

  1. Bắt đầu Microsoft Visual Studio.NET 2003 hoặc Microsoft Visual Studio 2005.
  2. Trên các Tệp trình đơn, điểm đếnMới, sau đó bấm Dự án.
  3. Dưới Các loại dự án, bấmVisual c + +.NET.

    Chú ý Trong Microsoft Visual C++ 2005, Visual c + +.NET là để thay đổi Visual c ++.
  4. Dưới Khuôn mẫu, bấmỨng dụng Windows Forms (.NET).
  5. Trong các Tên hộp, loạiRecursiveSearchCPP. Trong các Xác định vị tríhộp, loại C: \, sau đó bấmOk.
  6. Mở các Form1 hình thức trong thiết kế xem và sau đó nhấn F4 để mở các Cửa sổ Properties.
  7. Trong cửa sổ thuộc tính, mở rộng các Kích thước thư mục. Trong các Chiều rộng lĩnh vực này, loại700. Trong các Chiều cao lĩnh vực này, loại320.
  8. Thêm hai Nhãn hiệu điều khiển, một TextBox kiểm soát, mộtComboBox kiểm soát, một ListBox kiểm soát, và một Nút điều khiển để tạo thành Form1.
  9. Trong cửa sổ thuộc tính, thay đổi cácVị trí, các Kích thước, các TabIndex, và các Văn bản thuộc tính như sau:
    Kiểm soát IDVị tríKích thướcTabIndexVăn bản
    Label18, 16144, 165Tìm kiếm cho các tập tin có chứa:
    textBox18, 40120, 204*.dll
    label28, 96120, 253Tìm trong:
    button1608, 24875, 250& Search
    listBox1152, 8530, 2251
    comboBox18, 128120, 252C:\\
  10. Trong các InitializeComponent phương pháp cho hộp combo, thêm các mã sau đây để tranh thủ tất cả các ổ đĩa mạng có sẵn trên máy tính:
    // 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. Bấm đúp chuột vào các Tìm kiếm nút, và sau đó dán mã sau trong phương pháp:
    // 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. Để xây dựng các ứng dụng, nhấn CTRL + F5 để xây dựng.
  13. Chạy các ứng dụng.

Hoàn thành mẫu mã

// Form1.h#pragma oncenamespace 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;}
THAM KHẢO
Cho biết thêm thông tin về làm thế nào để tạo Windows Forms trong quản lý phần mở rộng của Visual C++.NET 2002, xem mẫu "ManagedCWinFormWiz" trong Visual Studio.Trợ giúp NET.

Warning: This article has been translated automatically

Thuộc tính

ID Bài viết: 307009 - Xem lại Lần cuối: 08/27/2011 23:33:00 - Bản sửa đổi: 2.0

Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition

  • kbhowtomaster kbio kbmt KB307009 KbMtvi
Phản hồi