#include "stdafx.h"
#include "Common.h"
#include "FindFile.h"

std::vector<YCString> CFindFile::DoFind(LPCTSTR pszBasePath, LPCTSTR pszFileName)
{
	HANDLE hFind;
	WIN32_FIND_DATA stwfdWork;
	TCHAR szBasePath[MAX_PATH];
	TCHAR szPathToFile[MAX_PATH];

//-- ファイル探索 ------------------------------------------------------------------------

	lstrcpy(szBasePath, pszBasePath);
	PathRemoveBackslash(szBasePath);

	_stprintf(szPathToFile, _T("%s\\%s"), szBasePath, pszFileName);

	hFind = FindFirstFile(szPathToFile, &stwfdWork);

	if (hFind != INVALID_HANDLE_VALUE) {
		do {
			// 見つかったファイルをリストに加える
			YCString sPathToFile = szBasePath;
			sPathToFile += _T("\\");
			sPathToFile += stwfdWork.cFileName;

			m_vtsPathToFile.push_back(sPathToFile);
		} while (FindNextFile(hFind, &stwfdWork));

		FindClose(hFind);
	}

//-- ディレクトリ探索 --------------------------------------------------------------------

	_stprintf(szPathToFile, _T("%s\\*.*"), szBasePath); // 検索対象はすべてのファイル

	hFind = FindFirstFile(szPathToFile, &stwfdWork);

	if (hFind != INVALID_HANDLE_VALUE) {
		do {
			if (!(stwfdWork.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
				// フォルダではない
				continue;
			}

			if (lstrcmp(stwfdWork.cFileName, _T(".")) == 0 || lstrcmp(stwfdWork.cFileName, _T("..")) == 0) {
				// ルートまたはカレント
				continue;
			}

			// 発見ディレクトリの潜航準備(発見ディレクトリを検索パスに追加する)
			_stprintf(szPathToFile, _T("%s\\%s"), szBasePath, stwfdWork.cFileName);

			// 再帰呼び出し
			DoFind(szPathToFile, pszFileName);
		} while (FindNextFile(hFind, &stwfdWork));

		FindClose(hFind);
	}

	return m_vtsPathToFile;
}

void CFindFile::Clear()
{
	m_vtsPathToFile.clear();
}