/*!
	DirTools.h

	ディレクトリ関係の処理を行う

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


	作成日		: 2000/12/07
	修正日		: 2009/02/10
	改定履歴	: 2006/02/10 掃除・・・
	改定履歴	: 2009/02/10 UTF8化
*/
#pragma once
#include "Time_t.h"


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

	///////////////////////////////////////////////////////////////////////
	//	検索命令
	///////////////////////////////////////////////////////////////////////
	//!	ファイルの検索を行う
	int StartFind(CUTF8String fileName);

	//!	次を検索
	int FindNext();

	//!	検索終了
	void CloseFind();

	///////////////////////////////////////////////////////////////////////
	//	検索結果へのアクセス(名前)
	///////////////////////////////////////////////////////////////////////
	//!	現在のファイル名
	CUTF8String GetFileName() { return m_currentEntry.cFileName; }

	//!	現在のパス
	CUTF8String GetFilePath() { return m_findPath + GetFileName(); }

	///////////////////////////////////////////////////////////////////////
	//	検索結果へのアクセス(サイズ、日時)
	///////////////////////////////////////////////////////////////////////
	//!	ファイルサイズ
	__int64 GetFileSize() { return (__int64)m_currentEntry.nFileSizeHigh << 32 | (__int64)m_currentEntry.nFileSizeLow; }

	//!	更新時間
	CTime_t GetCreationTime() { return m_currentEntry.ftCreationTime; }

	//!	更新時間
	CTime_t GetLastWriteTime() { return m_currentEntry.ftLastWriteTime; }

	//!	アクセス時間
	CTime_t GetLastAccessTime() { return m_currentEntry.ftLastAccessTime; }

	///////////////////////////////////////////////////////////////////////
	//	検索結果へのアクセス(属性)
	///////////////////////////////////////////////////////////////////////
	//!	ディレクトリ
	int IsDirectory() { return(m_currentEntry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); }

	//!	非表示
	int IsHidden() { return(m_currentEntry.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN); }

	//!	読み込み専用
	int IsReadonly() { return(m_currentEntry.dwFileAttributes & FILE_ATTRIBUTE_READONLY); }

	//!	./..
	int IsDots() { return(wcscmp(m_currentEntry.cFileName, _U16(".")) == 0 || wcscmp(m_currentEntry.cFileName, _U16("..")) == 0); }

protected:
	///////////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////////
	//!	検索ハンドル
	HANDLE 				m_hFind;

	//!	現在のエントリ
	WIN32_FIND_DATA		m_currentEntry;

	//!	検索パス
	CUTF8String			m_findPath;
};


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

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

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

	//!	ディレクトリの存在を確認し、存在しなかったら生成
	static int MakeDirectory(CUTF8String 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 CUTF8String PathToDrive(CUTF8String path);

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

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

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

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

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

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

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

	//!	32Kパスを有効にする（頭に"\\?\"追加）
	static CUTF8String AddLongPathPrefix(CUTF8String path);

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

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

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

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

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

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

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

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

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

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

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

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

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