Visual C++ 사용 하 여 재귀적으로 검색 폴더를 하는 방법

이 문서의 Microsoft Visual Basic.NET 버전을 참조 하십시오.
306666 .
C# 영문 버전에 참조 하십시오.
303974 .

이 문서에서는 다음 Microsoft.NET Framework 클래스 라이브러리 네임 스페이스:
  • 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 네임 스페이스는 클래스 인스턴스를 만들 수 있지만 파일 및 디렉터리 유틸리티 클래스도 제공을 뿐만 아니라 제공 합니다. 이러한 클래스는 해당 형식의 변수를 선언 하지 않고도 호출할 수 있는 정적 메서드를 포함 합니다. 예를 들어, 디렉터리 클래스 폴더의 하위 폴더를 얻을 수에 사용할 수 있습니다.

다음 코드 문자열의 배열을 반환 하는 Directory 클래스의 정적 GetDirectories 메서드를 사용 합니다. 이 배열에 있는 경우 C:\ 폴더의 하위 폴더에 대 한 폴더 경로 포함:
String* directories[] = Directory::GetDirectories("C:\\");
Directory 클래스에는 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:\입력 한 다음
    OK.
  6. Form1 폼을 디자인 보기에서 엽니다 및 속성 창을 열려면 F4 키를 누릅니다.
  7. 속성 창에서 크기 폴더를 확장 합니다. 너비 필드에 입력
    700. 높이 필드에 입력
    320.
  8. 두 개의 Label 컨트롤, TextBox 컨트롤, 하나를 추가 합니다.
    ComboBox 컨트롤, ListBox 컨트롤 및 Form1 폼을 단추 컨트롤입니다.
  9. 속성 창에서 변경 된
    위치, 크기, TabIndex및 다음과 같이 텍스트 속성:
    컨트롤 ID위치크기TabIndex텍스트
    label18, 16144, 165포함 된 파일을 검색 합니다.
    textBox18, 40120, 204*.dll
    label28, 96120, 253찾는 위치:
    button1248, 60875, 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 + f 5를 누릅니다.
  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;
}
맨 위로

참조

Visual C++.NET 2002의 관리 되는 확장에 Windows Forms을 만드는 방법에 대 한 자세한 내용은 Visual Studio.NET 도움말의 "ManagedCWinFormWiz" 샘플을 참조 하십시오.

맨 위로
속성

문서 ID: 307009 - 마지막 검토: 2017. 2. 6. - 수정: 1

피드백