/************************************************************************/
/*  Copyright (C), 2016-2020, [IT], ��������Ȩ��;
/*  ģ �� ����;
/*  ��    ����;
/*
/*  ��    ����[V];	
/*  ��    �ߣ�[IT];
/*  ��    �ڣ�[12/22/2016];
/*
/*
/*  ע    �⣺;
/*
/*  �޸ļ�¼��[IT];
/*  �޸����ڣ�;
/*  �޸İ汾��;
/*  �޸����ݣ�;
/************************************************************************/
#ifndef __FIND_FILE_20151003__
#define __FIND_FILE_20151003__

#include <string>
#include <vector>
using namespace std;

#ifndef _UNICODE
typedef string TString;
#else
typedef wstring TString;
#endif

typedef vector<TString> STR_VEC;

#pragma once

class findfile
{
public:
	findfile(void);
	virtual ~findfile(void);

//protected:
public:
	INT m_nlimit;
	STR_VEC m_vtEffctExt;
	STR_VEC *m_pvtfiles;
	STR_VEC *m_pvtnames;
	STR_VEC *m_pvtfolders;

	STR_VEC *m_pvtfiles_sth;	// sСͼ;
	STR_VEC *m_pvtfiles_mth;	// mСͼ;	
public:
	static BOOL iscorrectext(IN const TString &fext, OUT TString* lpMistakenExt = NULL);
	// lowercase��uppercase�ڶ��ֽ�����Ƨ�ֻ�����⣨�B���b���BתСд���ɬb���������bת��д���ɬB��;���޸�;
	static TString lowercase(IN const TString &Str);
	static void lowercase(IN TString& str);
	static TString uppercase(IN const TString &Str);
	static void uppercase(IN TString& str);
	//static int match(IN CONST TString &sExt, IN CONST TString &sFile);
	static inline int findfile::match(IN CONST TString &strExt, IN CONST TString &strfile)
	{
		int pos = strfile.find_last_of(_T('.'));
		if (TString::npos != pos)
			return !_tcsicmp(strExt.c_str(), strfile.substr(pos).c_str());

		return FALSE;
	}
	
	static TString getfilename(IN CONST TString &file);
protected:
	INT  getlimit() const { return m_nlimit; }
	void setlimit(IN CONST INT &nlimit);

	void groupExt();
	void groupExt( IN CONST TString &exts, IN STR_VEC &vtExts );

	inline INT checklimit() { return m_pvtfiles->size() == getlimit(); }

	BOOL IsaDirectory(CONST TString &sDirectory) { return (FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(sDirectory.c_str())); }

public:
	// ���������ļ�,�������ļ��������ļ������ļ�·��;
	void findall(IN CONST TString& folder);
	// ֻ����2����Ŀ¼��(����ok);
	void findsubfolder(IN CONST TString& folder);
	// ֻ����������Ŀ¼��(����ok);
	void findallsubfolder(IN CONST TString& folder);

	// �����ļ�·��,�Լ�������Ŀ¼���ļ�·��,������ȡ��Ŀ¼��(����ok);
	void findfiles_findin_subfolder(IN CONST TString& folder);
	// �����ļ�·��,��������Ŀ¼���ļ�(����ok);
	void findfiles_findout_subfolder(IN CONST TString& folder);
	// �����ļ�·��,�Լ�������Ŀ¼���ļ�·��,ͬʱ��ȡ��Ŀ¼��(����ok);
	void findfiles_within_subfolder(IN CONST TString& folder);

	// �����ļ�����,�Լ�������Ŀ¼���ļ�����,������ȡ��Ŀ¼��(���ص��ļ�������չ��)(����ok);
	void findnames_findin_subfolder(IN CONST TString& folder);
	// �����ļ�����,��������Ŀ¼���ļ�(���ص��ļ�������չ��)(����ok);
	void findnames_findout_subfolder(IN CONST TString& folder);
	// �����ļ�����,�Լ�������Ŀ¼���ļ�����,ͬʱ��ȡ��Ŀ¼��(���ص��ļ�������չ��)(����ok);
	void findnames_within_subfolder(IN CONST TString& folder);

	// �����ļ�·�����ļ���,�Լ�������Ŀ¼���ļ�·�����ļ���,������ȡ��Ŀ¼��;(���ص��ļ�������չ��)(����ok);
	void findfilesnames_findin_subfolder(IN CONST TString& folder);
	// �����ļ�·�����ļ���,��������Ŀ¼;(���ص��ļ�������չ��)(����ok);
	void findfilesnames_findout_subfolder(IN CONST TString& folder);
	// �����ļ�·�����ļ���,�Լ�������Ŀ¼���ļ�·�����ļ���,�һ�ȡ��Ŀ¼��;(���ص��ļ�������չ��)(����ok);
	void findfilesnames_within_subfolder(IN CONST TString& folder);
};

#endif