DetailPage-MSS-KB

기술 자료

기술 자료: 307009 - 마지막 검토: 2007년 8월 28일 화요일 - 수정: 3.2

 

이 페이지에서

요약

이 문서에서는 방법을 사용하여 루트 폴더로 시작하는 하위 재귀적으로 검색 폴더에 대한 파일, 코드 설명합니다. 이 작업 디렉터리 재귀라고 합니다. 특정 조건에 맞는 파일을 검색할 수 있도록 검색 문자열을 지정할 수 있습니다. 이 문서에 나와 있는 코드는 각 부분을 설명합니다 및 작업 코드 예제는 또한 제공됩니다.

디렉터리 재귀 개발자 위한 일반적인 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 문자열 배열을 특정 조건에 일치하는 파일 검색할 수 있습니다. 다음 코드 샘플은 .dll 파일 이름 확장명이 C:\ 폴더의 모든 파일을 검색하려면 GetFiles 메서드를 사용하는:
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++ .NETVisual C++ 로 변경됩니다.
  4. 템플릿Windows Forms 응용 프로그램 (.NET)를 클릭하십시오.
  5. 이름 상자에 RecursiveSearchCPP을 입력하십시오. 찾기 상자에 C:\ 를 입력한 다음 확인 을 누릅니다.
  6. 디자인 Form1 폼을 열어 보고, 다음 속성 창을 열려면 F4 키를 누릅니다.
  7. 속성 창에서 크기 폴더를 확장하십시오. 700너비 필드에 입력하십시오. 320높이 필드에 입력하십시오.
  8. 두 개의 레이블 컨트롤이, 한 TextBox 컨트롤, 한 ComboBox 컨트롤, 한 ListBox 컨트롤 및 한 Button 컨트롤을 Form1 폼에 추가하십시오.
  9. 속성 창에서 위치, 크기, TabIndexText 속성을 다음과 같이 변경하십시오.
    표 축소표 확대
    컨트롤 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 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 만드는 방법에 대한 자세한 내용은 Visual Studio .NET 도움말의 "ManagedCWinFormWiz" 샘플을 참조하십시오.


본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
키워드: 
kbmt kbhowtomaster kbio KB307009 KbMtko
기계 번역된 문서기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
공유
추가 지원 옵션
Microsoft Community 지원 포럼
직접 문의하기
Microsoft Certified Partner 찾기
Microsoft Store
소기업이 아닙니까?
다음에서 팔로우하십시오.