Как рекурсивно искать папки с помощью Visual C++

Переводы статьи Переводы статьи
Код статьи: 307009 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В этой статье описывается, как рекурсивно вложенные файлы, начиная с корневой папки, используя код. Эта задача называется каталогов. Можно указать строку поиска, чтобы найти файлы, отвечающие определенным критериям. Каждая часть кода в этой статье объясняется, а также предоставляются примеры кода.

Каталог рекурсии является распространенной задачей ввода-вывода для разработчиков. Объекта 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 предоставляет классы, можно создать экземпляр, но он также предоставляет вспомогательные классы файлов и каталогов. Эти классы содержат статические методы, которые можно вызвать без необходимости объявлять переменную этого типа. Например можно использовать класс Directory получить вложенные папки.

Следующий код использует статический метод GetDirectories класса Directory для возвращения массива строк. Этот массив содержит пути к папкам в подпапках папки C:\, если они существуют:
String* directories[] = Directory::GetDirectories("C:\\");
				
Класс Directory также содержит метод GetFiles . GetFiles можно использовать для извлечения строкового массива файлов, соответствующих определенным критериям. В следующем примере кода используется метод GetFiles для извлечения всех файлов в папке C:\ с расширением .dll.
String* files[] = Directory::GetFiles("C:\\", "*.dll");
				
Можно использовать метод GetDirectories и метод GetFiles класс Directory для рекурсивного поиска файлов, соответствующих строке поиска. Используйте следующий метод для выполнения рекурсии.
	 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 Forms (.NET).
  5. В поле имя введитеRecursiveSearchCPP. В поле Найтивведите C:\, а затем нажмите кнопкуОК.
  6. Откройте форму Form1 в Designview и нажмите клавишу F4, чтобы открыть окно theProperties.
  7. В окне «Свойства» разверните папку размер . В поле Ширина введите700. Введите в поле « Высота »320.
  8. Добавьте два элемента управления Label , один элемент управления TextBox , один элемент управленияComboBox , один элемент управления ListBox и один элемент управления Button на форму Form1.
  9. В окне «Свойства» изменитерасположение, размер, свойства текста и TabIndexследующим образом:
    Свернуть эту таблицуРазвернуть эту таблицу
    ControlIDРасположениеSizeTabIndexТекст
    Label18, 16144,165Поиск файлов, содержащих:
    textBox18, 40120,204*.dll
    Label28, 96120,253Искать в:
    Button1608, 24875,250& Поиска
    listBox1152, 8530,2251
    comboBox18, 128120,252C:\\
  10. В метод InitializeComponent списком addthe следующий код, чтобы прикрепить все сетевые диски, доступные на компьютере:
    // 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. Запустите theapplication.

Полный пример кода

// 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 Forms в управляемых расширениях для Visual C++ .NET 2002 см «ManagedCWinFormWiz» в справке Visual Studio .NET.

Свойства

Код статьи: 307009 - Последний отзыв: 9 февраля 2014 г. - Revision: 6.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Ключевые слова: 
kbhowtomaster kbio kbmt KB307009 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.
Эта статья на английском языке: 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