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

#pragma once

#include "findfile.h"

#define USE_IMGEXT 0

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

public:
	// ���������;
	static void random(IN STR_VEC& vtContent, IN BOOL bSort = TRUE);
	// �ָ�����;
	static void split(OUT vector<TString>& vtSplit, IN const TString str, IN const TString strSplit);
	// ���ݺ�׺�������ļ�;
	static void keepdownbyext(IN const TString &keepExt, IN STR_VEC &vtfiles);
	static void keepdownbyext(IN const TString &keepExt, IN const STR_VEC &vtfiles, OUT STR_VEC &vtresult);
	// ���ݺ�׺���Ƴ��ļ�;
	static void keepoutbyext(IN const TString &removeext, IN STR_VEC &vtfiles);
	static void keepoutbyext(IN const TString &removeext, IN const STR_VEC &vtfiles, OUT STR_VEC &vtresult);
	// ����ָ���ļ���(�к�׺�ģ�001.jpg)���ļ�·��;
	void keepdowbyname(IN const STR_VEC &vtnames);
	static void keepdowbyname(IN const STR_VEC &vtnames, IN STR_VEC &vtfiles);
	static void keepdowbyname(IN const STR_VEC &vtnames, IN const STR_VEC &vtfiles, OUT STR_VEC &vt_result);
	// ����ָ���ļ���(�޺�׺�ģ�001)���ļ�·��;
	void keepdowbyname_noext(IN const STR_VEC &vtnames);
	static void keepdowbyname_noext(IN const STR_VEC &vtnames, IN STR_VEC &vtfiles);
	static void keepdowbyname_noext(IN const STR_VEC &vtnames, IN const STR_VEC &vtfiles, OUT STR_VEC &vt_result);
	// ������չ��;
	static void subgroupExt(IN const TString &ext1, IN STR_VEC &vt1, IN const TString &ext2, IN STR_VEC &vt2);	

	// �����к�׺���ļ���(��:001.jpg)�������ļ�;
	static void filterbyname(IN STR_VEC &vtfiles, IN const STR_VEC &vtnames);
	void filterbyname(IN const STR_VEC &vtnames);

	// �����޺�׺���ļ���(��:001)�������ļ�;
	static void filterbyname_noext(IN STR_VEC &vtfiles, IN const STR_VEC &vtnames);
	void filterbyname_noext(IN const STR_VEC &vtnames);

	// ��ȡ�ļ���,����׺��(��:001.jpg);
	inline void getnames(IN STR_VEC &vtfiles, IN STR_VEC &vtnames)
	{
		INT nIndex = 0;
		for ( STR_VEC::iterator it = vtfiles.begin(); it != vtfiles.end(); it++ )
		{
			if ( (nIndex = it->find_last_of(_T('\\'))) != TString::npos )
			{
				vtnames.push_back(it->substr(nIndex+1));
			}
		}
	}

	// ��ȡ�ļ���,������׺��(��:001);
	inline void getnames_noext(IN const STR_VEC &vtfiles, IN STR_VEC &vtnames)
	{
		INT nIndex = 0;
		INT nIndex2 = 0;
		for ( STR_VEC::const_iterator it = vtfiles.begin(); it != vtfiles.end(); it++ )
		{
			if ( (nIndex = it->find_last_of(_T('\\'))) != TString::npos )
			{
				if ( (nIndex2 = it->find_last_of(_T('.'))) != TString::npos)
				{
					if ( nIndex2 > nIndex)
						vtnames.push_back(it->substr(nIndex+1, nIndex2-nIndex));
				}
			}
			else
			{// vtfiles��û��Ŀ¼���ļ���,�磺001.jpg;
				if ( (nIndex2 = it->find_last_of(_T('.'))) != TString::npos)
				{
					vtnames.push_back(it->substr(0, nIndex2));
				}
			}
		}
	}
public:
	// ����ȫ��;
	BOOL getall(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN OUT STR_VEC *pvtfiles,							// ����Ҫ���ҵ��ļ�ȫ��;
		IN OUT STR_VEC *pvtnames,							// ����Ҫ���ҵ��ļ���(��·��,������չ��);
		IN OUT STR_VEC *pvtfolders							// ����Ҫ���ҵ���Ŀ¼;
		);

	// ֻ��ȡ��ǰҪĿ¼�����ļ���,����ȡ���ļ����е��ļ���;
	BOOL getsubfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN STR_VEC *pvtfolders								// ���������;
		);

	BOOL getallsubfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN STR_VEC *pvtfolders								// �������������;
		);

	//////////////////////////////////////////////////////////////////////////
	BOOL getfiles_findin_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC *pvtfiles								// ����Ҫ���ҵ��ļ�ȫ��;
		);

	BOOL getfiles_findout_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN OUT STR_VEC *pvtfiles							// ����Ҫ���ҵ��ļ�ȫ��;
		);

	BOOL getfiles_within_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC *pvtfiles,								// ����Ҫ���ҵ��ļ�ȫ��;
		IN STR_VEC *pvtfolders								// ���;
		);

	//////////////////////////////////////////////////////////////////////////
	virtual BOOL getfiles_bynames_findin_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC &vtnames,
		IN STR_VEC *pvtfiles								// ����Ҫ���ҵ��ļ�ȫ��;
		);

	virtual BOOL getfiles_bynames_findout_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC &vtnames,
		IN OUT STR_VEC *pvtfiles							// ����Ҫ���ҵ��ļ�ȫ��;
		) ;

	virtual BOOL getfiles_bynames_within_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC &vtnames,
		IN STR_VEC *pvtfiles,								// ����Ҫ���ҵ��ļ�ȫ��;
		IN STR_VEC *pvtfolders								// ���;
		) ;

	//////////////////////////////////////////////////////////////////////////
	BOOL getnames_findin_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC *pvtnames								// ����Ҫ���ҵ��ļ���(��·��,������չ��);
		);

	BOOL getnames_findout_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC *pvtnames								// ����Ҫ���ҵ��ļ���(��·��,������չ��);
		);

	BOOL getnames_within_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC *pvtnames,								// ����Ҫ���ҵ��ļ�ȫ��;
		IN STR_VEC *pvtfolders								// ���;
		);

	//////////////////////////////////////////////////////////////////////////
	BOOL getfilesnames_findin_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC *pvtfiles,								// ����Ҫ���ҵ��ļ�ȫ��;
		IN STR_VEC *pvtnames								// ����Ҫ���ҵ��ļ���(��·��,������չ��);
		);

	BOOL getfilesnames_findout_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC *pvtfiles,								// ����Ҫ���ҵ��ļ�ȫ��;
		IN STR_VEC *pvtnames								// ����Ҫ���ҵ��ļ���(��·��,������չ��);
		);

	BOOL getfilesnames_within_subfolder(
		IN LPCTSTR lpfolder,								// Ҫ���ҵ�Ŀ¼;
		IN LPCTSTR lpfindext,								// Ҫ���ҵ���չ��;
		IN STR_VEC *pvtfiles,								// ����Ҫ���ҵ��ļ�ȫ��;
		IN STR_VEC *pvtnames,								// ����Ҫ���ҵ��ļ���(��·��,������չ��);
		IN STR_VEC *pvtfolders								// ���;
		);

public:
	//////////////////////////////////////////////////////////////////////////
	BOOL comparename_findin_names(IN LPCTSTR name);

	// �����ļ��Ա�,�Ƿ�ͬ��;
	BOOL comparename_2file(
		IN LPCTSTR file1,									// �ļ�1(ȫ·��);
		IN LPCTSTR file2									// �ļ�2(ȫ·��);
		);

	// ָ���ļ���,��һ���ļ����Ա�;
	BOOL comparename_findin_names(
		IN LPCTSTR name,									// �ļ���(��·��,������չ��);
		IN STR_VEC& vtnames									// һ���ļ���(��·��,������չ��);
		);

	// ָ���ļ���,��һ���ļ��Ա�;
	BOOL comparename_findin_files(
		IN LPCTSTR name,									// �ļ���(������չ��);
		IN STR_VEC& vtfiles									// һ���ļ�(ȫ·��);
		);

	// ָ���ļ���,��һ�ļ��жԱ�;
	BOOL comparename_findin_folder(
		IN LPCTSTR name,									// �ļ���(������չ��);
		IN LPCTSTR folder,									// ���;
		IN LPCTSTR findext,									// Ҫ���ҵ���չ��;
		IN BOOL bsubfolder									// �Ƿ�����ļ����ڵ���Ŀ¼;
		);

	//////////////////////////////////////////////////////////////////////////
	// ָ��һ���ļ���,����һ���ļ����Ա�;
	INT comparenames_findin_names(
		IN STR_VEC vtSrcnames,								// ָ����һ��Դ�ļ���(��·��,������չ��);
		IN STR_VEC vtDesnames,								// ָ����һ��Ŀ���ļ���(��·��,������չ��);
		OUT STR_VEC *pvtIsonym = NULL						// ����ͬ�����ļ���;	
		);

	// ָ��һ���ļ���,��һ���ļ�(ȫ·��)�Ա�;
	INT comparenames_findin_files(
		IN STR_VEC vtnames,									// ָ����һ��Դ�ļ���(��·��,������չ��);
		IN STR_VEC vtfiles,									// ָ����һ��Ŀ���ļ�(ȫ·��);
		IN LPCTSTR findext,									// Ҫ���ҵ���չ��;
		OUT STR_VEC *pvtIsonym = NULL						// ����ͬ�����ļ���;
		);

	// ָ����һ���ļ���,��һ�ļ��жԱ�;
	INT comparenames_findin_folder(
		IN STR_VEC vtnames,									// ָ����һ��Դ�ļ���(��·��,������չ��);
		IN LPCTSTR folder,									// ���;
		IN BOOL bsubfolder,									// �Ƿ�����ļ����ڵ���Ŀ¼;
		IN LPCTSTR findext,									// Ҫ���ҵ���չ��;
		OUT STR_VEC *pvtIsonym = NULL						// ����ͬ�����ļ���;
		);

	//////////////////////////////////////////////////////////////////////////
	// ָ��һ�ļ�,��һ���ļ����Ա�;
	BOOL comparefile_findin_names(
		IN LPCTSTR file,									// �ļ�1(ȫ·��);
		IN STR_VEC& vtnames									// ָ����һ���ļ���(��·��,������չ��)
		);

	// ָ��һ�ļ�,��һ���ļ��Ա�;
	BOOL comparefile_findin_files(
		IN LPCTSTR file,									// �ļ�(ȫ·��);
		IN STR_VEC& vtfiles,									// ָ����һ���ļ�(ȫ·��)
		IN LPCTSTR findext									// Ҫ���ҵ���չ��;
		);

	// ָ��һ�ļ�,��һ�ļ��жԱ�;
	BOOL comparefile_findin_folder(
		IN LPCTSTR file,									// �ļ�(ȫ·��);
		IN LPCTSTR folder,									// ���;
		IN BOOL bsubfolder,									// �Ƿ�������ļ���;
		IN LPCTSTR findext									// Ҫ���ҵ���չ��;
		);

	//////////////////////////////////////////////////////////////////////////
	// ָ��һ���ļ�,����һ���ļ��Ա�;
	INT comparefiles_findin_files(
		IN STR_VEC &vtfiles1,								// ָ����һ��Դ�ļ�;
		IN STR_VEC &vtfiles2,								// ָ����һ��Ŀ���ļ�;
		IN LPCTSTR findext,									// Ҫ���ҵ���չ��;
		OUT STR_VEC *pvtIsonym = NULL						// ����ͬ�����ļ���;
		);

	// ָ��һ���ļ�,��һ�ļ��жԱ�;
	INT comparefiles_findin_folder(
		IN STR_VEC &vtfiles,								// ָ����һ��Դ�ļ�;
		IN LPCTSTR folder,									// ָ�����ļ���;
		IN BOOL bsubfolder,									// �Ƿ�������ļ���;
		IN LPCTSTR findext,									// Ҫ���ҵ���չ��;
		OUT STR_VEC *pvtIsonym = NULL						// ����ͬ�����ļ���;
		);

	// �ļ������ҶԱ�(�������ļ��жԱ�)
	INT comparefolderself(
		IN LPCTSTR folder,									// ָ���ļ���;
		IN LPCTSTR findext,									// Ҫ���ҵ���չ��;
		OUT STR_VEC *pvtIsonym = NULL						// ����ͬ�����ļ���;
		);

	// ָ��һ�ļ���,����һ�ļ��жԱ�;
	INT comparefolder_findin_folder(
		IN LPCTSTR folder1,									// ָ��Դ�ļ���;
		IN LPCTSTR folder2,									// ָ��Ŀ���ļ���;
		IN BOOL bsubfolder,									// �Ƿ�������ļ���;
		IN LPCTSTR findext,									// Ҫ���ҵ���չ��;
		OUT STR_VEC *pvtIsonym = NULL						// ����ͬ�����ļ���;
		);

	public:
		INT copyfolder(IN LPCTSTR from, IN LPCTSTR to);
};

#endif