Visual C を使用して、再帰的に検索フォルダーをする方法

文書翻訳 文書翻訳
文書番号: 307009
すべて展開する | すべて折りたたむ

目次

概要

この資料で説明を再帰的にする方法サブフォルダーのルート フォルダーには、コードを使用して、開始するファイルを検索します。このタスクは、ディレクトリの再帰呼び出しとして知られています。検索を指定することができます。特定の条件に一致するファイルを検索できるようにする文字列を指定します。各この資料のコードの一部を説明し、作業用サンプルのコードです。また提供されます。

ディレクトリの再帰呼び出しは、開発者向けの一般的な I/O タスク。は、 ファイル システム オブジェクト オブジェクトがコンポーネント オブジェクト モデル (COM) はこのタスクを容易します。このタスクがプログラムを Visual C では簡単です。NET 2002。同様に、 ファイル システム オブジェクト オブジェクト、クラス、 System.IO 名前空間は、オブジェクト指向のファイルにアクセスを提供し、フォルダー表示されます。

要件

推奨されるハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および必要な service pack を以下に示します。
  • 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 配列を返すメソッドは、使用できます、 繰り返しステートメント各サブフォルダーにします。各サブフォルダーには、 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:\、し[OK].
  6. 開いている、 Form1 フォームのデザインで表示、および、開くには F4 キーを押して、プロパティ ウィンドウです。
  7. [プロパティ] ウィンドウでを展開し、 サイズ フォルダーです。で、 フィールドの種類700.で、 高さ フィールドの種類320.
  8. 2 つを追加します。 ラベル コントロール、1 テキスト ボックス [1 つの管理コンボ ボックス [1 つの管理 リスト ボックス コントロールは、1 つ ボタン Form1 フォームに制御します。
  9. プロパティ ウィンドウで、変更する、場所、、 サイズ、、 Tabindex プロパティ、、は、 テキスト プロパティには、次のように:
    元に戻す全体を表示する
    コントロールID場所サイズTabindex プロパティテキスト
    label18, 16144、165含むファイルを検索してください。
    textBox18, 40120204*.dll
    label28, 96120253[ファイルの場所します。
    button1608、248[75]、250& 検索
    listBox1152、8530、2251
    comboBox18, 128120252C:\\
  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 フォームの作成方法の詳細については、管理Visual の C++ の拡張します。Net 2002 を実行、サンプル"ManagedCWinFormWiz"を参照してください。Visual Studio。NET のヘルプします。

プロパティ

文書番号: 307009 - 最終更新日: 2011年7月24日 - リビジョン: 5.0
キーワード:?
kbhowtomaster kbio kbmt KB307009 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:307009
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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