/************************************************************************/
/*  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 filehelpImpl :public findfile
{
public:
	filehelpImpl(void);
	~filehelpImpl(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