[[TIPS/Programming]]

* Visual C++ 2008用 指定フォルダ以下のファイル再帰的検索 サンプルプログラム [#ib7d6a74]


** 概要 [#df13cc22]
このプログラムは、指定フォルダ以下のファイルを再帰的に検索するサンプルプログラムです。

下記の環境での開発の参考にすることが出来ます。

** ダウンロード [#va7e7c1a]
下記よりサンプルプロジェクトをダウンロード可能です。

[[FileSerchSample100.zip(16KB)>http://www.altemasoft.com/download/FileSerchSample100.zip]]


** 環境 [#q60b55ae]
- OS: WindowsXP SP3
- PC: WindowsXP SP3が動作するPC
- 開発環境: Microsoft Visual C++ Express Edition(.NET)

** 基本動作 [#w758fc11]
- 指定されたフォルダ以下のファイルを再帰的に検索します。
- ファイル名には、ワイルドカードなどでフィルタを指定することが出来ます。
- 検索されたファイルを、リストボックスに表示します。

#ref("http://www.altemasoft.com/image/fileop20090608.jpg")


** 技術 [#s56baa63]
- メインフォームより、ファイルを再帰的に検索する元フォルダを指定できます。
- 検索プログラムは、別クラスとしてあります。
- クラスのインスタンスを生成し、関数を実行することで、String型のコレクションに検索されたファイル名が格納されます。
- これらの操作には、System::IO::Directory クラスを使用します。


** 著作権などについて [#f4f2716f]
このサンプルプログラムの使用はフリーとしますが、基本的に作者が保有しています。


** 再配布・転載について [#u6a8bc7d]
再配布・転載については事前にご相談下さい。
ただし、この記事の内容に関してトラブルが発生しても責任を負いかねます。
再配布・転載については事前にご相談下さい。~
なお、この記事の内容に関してトラブルが発生しても責任を負いかねます。

転載、再配布の際には、当WEBサイトへのリンクを何処かに掲載していただけると、作者が喜びます。


** ソースコード [#d20efb32]
*** ListFiles.h [#f8438a29]
	#pragma once
	//
	//必要な名前空間
		using namespace System;
		using namespace System::Windows::Forms;
		using namespace System::Data;
		using namespace System::Collections::Generic;
	//
	ref class ListFiles
	{
	private:	List<String^>^	DirListItems;	//フォルダのリストを格納する。
	public:		List<String^>^	FileListItems;	//ファイルのリストを格納する。
												//ファイルのリストは公開して、取り出せるようにする。
	private:	int				_NumberOfFolders;	//フォルダの数
	private:	int				_NumberOfFiles;		//ファイルの数
	//
	public:		property	int	NumberOfFolders{	//読み出し専用で公開
					int	get(){
						return(_NumberOfFolders);
					}
				}
	public:		property	int	NumberOfFiles{
					int	get(){
						return(_NumberOfFiles);
					}
				}
	public:
		ListFiles(void);
	//指定されたフォルダ以下のファイルを全て検索。
	public:	System::Void	SerchFilesUnderSpecifiedFolder(String^	TopFolder,	String^	Filter);
	//指定されたフォルダ以下のファイルを探す。
	private:	System::Void	ListFileNameInSpecifiedFolder(String^	TopFolder,	String^ Filter);
	//指定されたフォルダ以下のフォルダを探す。
	private:	System::Void	SerchFolderRecursively(String^	TopFolder);
	};

*** ListFile.cpp [#h1f08c59]
	#include "StdAfx.h"
	#include "ListFiles.h"
	//
	ListFiles::ListFiles(void){
		//必要な変数を初期化
		this->DirListItems = gcnew List<String^>;
		this->FileListItems = gcnew List<String^>;
		_NumberOfFolders = 0;
		_NumberOfFiles = 0;
	}
	//
	System::Void	ListFiles::SerchFilesUnderSpecifiedFolder(String^	TopFolder,	String^	Filter){
		_NumberOfFolders = 0;	//フォルダ数とファイル数を初期化
		_NumberOfFiles = 0;
	//
		SerchFolderRecursively(TopFolder);	//まずはフォルダだけ一覧する。
	//
		//ここで、DirListItemsには、指定フォルダ以下のフォルダが全部一覧されている。
		//各フォルダの中にあるファイルを一覧する。
		//コレクションから一つずつフォルダ名を取り出し、そのフォルダ以下のファイル名を列挙する。
		for each (String^	DirItem in this->DirListItems){
			//ファイル名を追加
			ListFileNameInSpecifiedFolder(DirItem, Filter);
			Application::DoEvents();	//アプリが固まるのを防止する。
		}
	}
	//指定されたフォルダ以下のファイルをリストする。
	System::Void	ListFiles::ListFileNameInSpecifiedFolder(String^	TopFolder,	String^ Filter){
		//指定フォルダ以下の、ファイルを取得する。
		array<String^>^ Files = System::IO::Directory::GetFiles(TopFolder);
		//
		System::Collections::IEnumerator^	listFiles	=	Files->GetEnumerator();
		while( listFiles->MoveNext()){
			String^ fileName = safe_cast<String^>(listFiles->Current);
			FileListItems->Add(fileName);
			_NumberOfFiles ++;
		}
	}
	//指定フォルダ以下のフォルダを再帰的に検索します。
	System::Void	ListFiles::SerchFolderRecursively(String^	TopFolder){
		bool	IsExceptionOccured = false;
		array<String^>^ Dirs;
		//
		Application::DoEvents();	//アプリが固まるのを防止する。
		//
			 try{
				Dirs = System::IO::Directory::GetDirectories(TopFolder);
			 }catch(Exception^ e){
				 //例外がおこったら、アクセスできないと言うこと。これ以降のフォルダは検索しない。
				 IsExceptionOccured = true;
			 }
			//
			 if(IsExceptionOccured == false){
				_NumberOfFolders++;
				DirListItems->Add(TopFolder);	//フォルダを追加
				System::Collections::IEnumerator^	listDirs = Dirs->GetEnumerator();
				while( listDirs->MoveNext()){
					String^	dirName =	safe_cast<String^>(listDirs->Current);
					//フォルダを再帰的に検索する。
					SerchFolderRecursively(dirName);
				}
			}
	}

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS