/*!
	CDir
	ディレクトリ関係の処理を行う
	ヘッダ ファイル

	Version		: 2.0 (Release2)
	Version		: 2.0 (Release2)
	説明		: ファイルの検索やパスの処理など


	作成日		: 2000/12/07
	修正日		: 2006/02/10
	改定履歴	: 2006/02/10 掃除・・・
*/

#include <afxtempl.h>
#pragma once


/*!
	ディレクトリ検索を行うクラス
*/
class CDirIndexer
{
public:
	CDirIndexer();
	virtual ~CDirIndexer();

	///////////////////////////////////////////////////////////////////////
	//	検索命令
	///////////////////////////////////////////////////////////////////////
	//!	ファイルの検索を行う
	int FindFile(CString path,int subDirectory = TRUE);

	//!	ディレクトリの検索を行う
	int FindDir(CString path,int subDirectory = TRUE);


	///////////////////////////////////////////////////////////////////////
	//	検索結果へのアクセス
	///////////////////////////////////////////////////////////////////////
	//!	ファイルのパスを取得
	CString GetFilePath(int index);	

	//!	ファイル数の取得
	int GetFileCount();

	//!	全ファイルの合計サイズを取得
	__int64 GetAllFleSize();

	//!	検索結果を配列で取得
	void GetFileList(CStringArray &list);

protected:
	///////////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////////
	//!	ファイルリスト
	CStringArray				m_fileList;

	//!	合計ファイルサイズ
	__int64						m_allFileSize;
};


/*!
	ファイル・ディレクトリ関係のツール郡
*/
class CFileDirTools
{
public:
	///////////////////////////////////////////////////////////////////////
	//	ファイル
	///////////////////////////////////////////////////////////////////////
	//!	ファイルの属性取得
	static DWORD GetFileAttribute(CString path);

	//!	ファイルの存在チェック
	static int FileExist(CString path);

	///////////////////////////////////////////////////////////////////////
	//	ディレクトリ生成
	///////////////////////////////////////////////////////////////////////
	//!	パスを補完(存在しないディレクトリを全て作成)
	static int MakeAllDirectory(CString path);

	//!	ディレクトリの生成
	static int MakeDirectory(CString path);

	///////////////////////////////////////////////////////////////////////
	//	定数
	///////////////////////////////////////////////////////////////////////
	//!	FileExist定数
	enum FILE_EXIST_TYPE
	{
		FILE_TYPE_FILE		= 1,
		FILE_TYPE_DIRECTORY = 2,
		FILE_TYPE_NOTFOUND	= 0
	};

	//!	ファイル属性
	enum
	{
		FILE_ATTR_NORMAL	= FILE_ATTRIBUTE_NORMAL,
		FILE_ATTR_READONLY	= FILE_ATTRIBUTE_READONLY,
		FILE_ATTR_HIDDEN	= FILE_ATTRIBUTE_HIDDEN,
		FILE_ATTR_SYSTEM	= FILE_ATTRIBUTE_SYSTEM,
		FILE_ATTR_DIRECTORY	= FILE_ATTRIBUTE_DIRECTORY,
		FILE_ATTR_ARCHIVE	= FILE_ATTRIBUTE_ARCHIVE,
		FILE_ATTR_COMPRESSED= FILE_ATTRIBUTE_COMPRESSED,
		FILE_ATTR_ENCRYPTED	= FILE_ATTRIBUTE_ENCRYPTED,
		FILE_ATTR_ERROR		= INVALID_FILE_ATTRIBUTES,
	};
};

class CPathTools
{
public:
	///////////////////////////////////////////////////////////////////////
	//	パス変換
	///////////////////////////////////////////////////////////////////////
	//!	ドライブ名の取得
	static CString PathToDrive(CString path);

	//!	ディレクトリパスの取得
	static CString PathToDir(CString path);

	//!	ファイル名の取得
	static CString PathToName(CString path);

	//!	ファイル名の取得(拡張子なし)
	static CString PathToNameNoExt(CString path);

	//!	ファイル拡張子の取得
	static CString PathToExt(CString path);

	//!	ひとつ上のディレクトリパスを取得
	static CString GetUpDir(CString path);

	//!	使えない文字を置き換え
	static CString SafeName(CString name, CString replace = _T("_"));

	//!	表示名（ファイル名 or フォルダ名 or ドライブ名）取得
	static CString PathToViewName(CString name);

	///////////////////////////////////////////////////////////////////////
	//	パスの比較
	///////////////////////////////////////////////////////////////////////
	//!	パスに含まれているか調べる
	static int IsInPath(CString parentPath, CString childPath);

	///////////////////////////////////////////////////////////////////////
	//	/\の加工
	///////////////////////////////////////////////////////////////////////
	//!	スラッシュを後ろに追加
	static CString AddSlash(CString path);

	//!	バックスラッシュを後ろに追加
	static CString AddBackSlash(CString path);

	//!	スラッシュを後ろから削除
	static CString RemoveSlash(CString path);

	//!	バックスラッシュを後ろから削除
	static CString RemoveBackSlash(CString path);

	//!	最後にスラッシュがあるか
	static int CheckSlash(CString path);
	
	//!	最後にバックスラッシュがあるか
	static int CheckBackSlash(CString path);
	
	//!	最後の文字をチェック
	static int CheckLastChar(CString path,unsigned char c);

	///////////////////////////////////////////////////////////////////////
	//	モジュールパス
	///////////////////////////////////////////////////////////////////////
	//!	モジュールパス取得
	static CString GetAppPath();

	//!	モジュールパス取得
	static CString GetAppPathName();

	/////////////////////////////////////////////////////////////////////////
	//	各種パスを取得
	/////////////////////////////////////////////////////////////////////////
	//!	パス変数を置き換え後のパスを取得
	static CString GetPathSwapString(CString path);

	//!	Windows パス取得
	static CString GetWindowsPath();

	//!	System32 パス取得
	static CString GetSystem32Path();

	//!	Program Files パス取得
	static CString GetProgramFilesPath();

	//!	All Users/Application Data パス取得
	static CString GetCommonAppDataPath();
};


/*!
	ファイル、ディレクトリの時刻を操作
*/
class CFileTimeAccess
{
public:
	int GetFileTime(CString path);
	int SetFileTime(CString path);

	int GetFileTime(HANDLE hFile);
	int SetFileTime(HANDLE hFile);

	CFileTime CTimeToCFileTime(CTime time);

	CFileTime 	m_cTime;
	CFileTime 	m_aTime;
	CFileTime	m_mTime;
};

