你目前正处于脱机状态,正在等待 Internet 重新连接

如何通过使用 Visual c + + 以递归方式搜索文件夹

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 307009
为这篇文章的一个 Microsoft Visual Basic.net 版本,请参阅 306666
Microsoft C#.net 为这篇文章的版本,请参阅 303974

下面的 Microsoft.net 框架类库命名空间引用这篇文章:
  • System.IO
  • System.ComponentModel
  • System.Windows.Forms
  • System.Drawing

本任务中

概要
本分步指南介绍了如何以递归方式搜索子文件夹的文件,开头一个根文件夹的使用代码。 此任务被称为目录递归。您可以指定搜索字符串,以便您可以搜索符合特定条件的文件。在这篇文章中代码的每个部分会介绍,还提供了工作代码示例。

目录递归是常见的 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 方法返回数组,您可以使用 for 语句循环访问每个子文件夹。对于每个的子文件夹使用 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 窗体应用程序 (.NET)
  5. 名称 框中键入 RecursiveSearchCPP。在 $ 查找 中,键入 C:\,然后单击 确定
  6. 在设计中打开 Form1 窗体查看,然后按 F4 打开属性窗口。
  7. 在属性窗口中展开 大小 文件夹。在 宽度 字段中键入 700。在 高度 字段中键入 320
  8. 将两个 标签 控件、 一个 TextBox 控件、 一个 组合框 控件、 一个的 列表框 控件和一个 按钮 控件添加到 Form1 窗体。
  9. 在属性窗口中更改 位置大小TabIndex 中,和 文本 属性,如下所示:
    控件 ID位置大小TabIndex文本
    标签 18 16144 165搜索包含的文件,请执行以下操作:
    textBox18、 40120 204*.dll
    标签 28、 96120 253在中查找:
    button1608、 24875、 250和搜索
    listBox1152、 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 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;}
参考
有关如何为 Visual c + +.net 2002年在托管扩展中创建 Windows 窗体的详细信息请参见 Visual Studio.net 帮助中的"ManagedCWinFormWiz"示例。

警告:本文已自动翻译

属性

文章 ID:307009 - 上次审阅时间:08/28/2007 06:26:02 - 修订版本: 3.2

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

  • kbmt kbhowtomaster kbio KB307009 KbMtzh
反馈