#include "stdafx.h"


#include "stdafx.h"
#include <windows.h>
#include <Strsafe.h>
#include <stdio.h>

bool ListFiles(const wchar_t *sDir,
	const wchar_t* exta[],
	int n,
	void(*Callback)(const wchar_t*,void*),
	void* data)
{
	WIN32_FIND_DATA fdFile;
	HANDLE hFind = NULL;

	wchar_t sPath[MAX_PATH];

	wsprintf(sPath, L"%s\\*.*", sDir);

	if ((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
	{
		return false;
	}

	do
	{
		//Find first file will always return "."
		//    and ".." as the first two directories.
		if (wcscmp(fdFile.cFileName, L".") != 0
			&& wcscmp(fdFile.cFileName, L"..") != 0)
		{
			//Build up our file path using the passed in
			//  [sDir] and the file/foldername we just found:
			wsprintf(sPath, L"%s\\%s", sDir, fdFile.cFileName);

			if (fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
			{
				ListFiles(sPath, exta,n,Callback, data);
			}
			else
			{
				
				wchar_t drive[_MAX_DRIVE];
				wchar_t dir[_MAX_DIR];
				wchar_t fname[_MAX_FNAME];
				wchar_t ext[_MAX_EXT];

				_wsplitpath(sPath, drive, dir, fname, ext);
				for (int k = 0; k < n; k++)
				{
					if (wcscmp(exta[k], ext) == 0)
					{
						Callback(fdFile.cFileName, data);
						break;
					}
				}
				
			}
		}
	} while (FindNextFile(hFind, &fdFile));

	FindClose(hFind);

	return true;
}


void f(const wchar_t* fileName, void* data)
{
	printf("%ws\n", fileName);
}

int main()
{
	const wchar_t* ext[] = { L".h", L".cpp" };
	ListFiles(L".",ext, 2, &f, 0);
    return 0;
}