Sample5

[ファイル操作関係]



//--------------------------------------------------------------------------------
//
//【ファイルの有無を調べる】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
// ファイルの存在チェック
// 引数に渡した名前のファイルが存在すればTRUEを、無ければFALSEを返す
BOOL	FileExist(LPCTSTR lpFileName)
{
	BOOL bResult ;
	WIN32_FIND_DATA wfd ;

	// ファイル検索ハンドルを取得
	HANDLE hFile = FindFirstFile(lpFileName, &wfd) ;

	// 検索できたかチェック
	if(hFile == INVALID_HANDLE_VALUE){
		// ファイル無し
		bResult = FALSE ;
	}
	else{
		// ファイル有り
		bResult = TRUE ;
	}
	// 検索ハンドルをクローズ
	FindClose(hFile) ;

	return bResult ;
}
// CFileクラスの静的メンバGetStatus()を使ってファイルの存在チェックを行うサンプル
{
	CFileStatus status ;

	if(CFile::GetStatus(_T("c:\\autoexec.bat"), status)){
		TRACE(_T("c:\\autoexec.batは存在します")) ;
	}
	else{
		TRACE(_T("c:\\autoexec.batは存在しません")) ;
	}
}
//--------------------------------------------------------------------------------
//
//【ショートファイル名からロングファイル名の取得】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
// ショートファイル名からロングファイル名の取得

BOOL GetLongFileName(LPCTSTR lpszShortFileName, LPTSTR lpszBuffer, DWORD dwBufferSize)
{
	WIN32_FIND_DATA ffd ;
	char szTmpShortFile[MAX_PATH] ;
	char szLongFile[MAX_PATH] ;
	char szTmp[MAX_PATH] ;
	LPTSTR lpYen ;
	int nPos ;
	szLongFile[0] = '\0' ;

	lstrcpy(szTmpShortFile, lpszShortFileName) ;

	if(FindFirstFile(szTmpShortFile, &ffd) == INVALID_HANDLE_VALUE)
		return FALSE ;

	do{
		// 全角コードに「\」のアスキーコードが含まれていた場合に不具合が合ったので
		// 下記の関数を追加
		lpYen = jstrrchr(szTmpShortFile, '\\') ;
		if(lpYen != NULL){
			nPos = lpYen - szTmpShortFile ;
			if(lstrlen(szLongFile) == 0)
				lstrcpy(szLongFile, ffd.cFileName) ;
			else{
				wsprintf(szTmp, "%s\\%s", ffd.cFileName, szLongFile) ;
				lstrcpy(szLongFile, szTmp) ;
			}
			szTmpShortFile[nPos] = '\0' ;
			FindFirstFile(szTmpShortFile ,&ffd) ;
		}
		else{
			wsprintf(szTmp, "%s\\%s", szTmpShortFile, szLongFile) ;
			lstrcpy(szLongFile, szTmp) ;
		}
	}while(lpYen != NULL) ;

	if((DWORD)lstrlen(szLongFile) >= dwBufferSize)
		return FALSE ;

	lstrcpy(lpszBuffer, szLongFile) ;
	return TRUE ;
}
//↓追加
/////////////////////////////////////////////////////////////////////////////
// MultiByte対応版strrchr
// 文字列の最後から指定した文字を検索し見つかったらそのポインタを返す
// 見つからない場合はNULLを返す

char* jstrrchr(char* lpszSrc, const unsigned char uchSerchCode)
{
	char* lpszResult = NULL ;

	// NULL文字が現れるまで繰り返す
	while(*lpszSrc){
		// 2バイト文字列は無視する
		if(_ismbblead((unsigned char)*lpszSrc)){
			lpszSrc += 2 ;
			continue ;
		}
		if((unsigned char)*lpszSrc == uchSerchCode)
			lpszResult = lpszSrc ;
		lpszSrc++ ;
	}
	return lpszResult ;
}

//--------------------------------------------------------------------------------
//
//【ドライブの存在チェック】
//
//(SDK)
/////////////////////////////////////////////////////////////////////////////
void OnTest(HWND hDlg)
{
	char szDriveName[] = {"A:"} ;
	char szDriveType[256] ;
	HWND hwndListBox = GetDlgItem(hDlg, IDC_LISTBOX) ;
	int nIndex ;
	UINT uType ;

	for(nIndex='A' ; nIndex<'H' ; nIndex++){
		// 検索するドライブ名作成
		szDriveName[0] = (char)nIndex ;
		// ドライブの種類を取得
		uType = GetDriveType(szDriveName) ;
		switch(uType){
			case DRIVE_UNKNOWN :
				wsprintf(szDriveType, "%s不明", szDriveName) ;
				break ;
			case DRIVE_NO_ROOT_DIR :
				wsprintf(szDriveType, "%s存在しない", szDriveName) ;
				break ;
			case DRIVE_REMOVABLE :
				wsprintf(szDriveType, "%sリムーバブルディスク", szDriveName) ;
				break ;
			case DRIVE_FIXED :
				wsprintf(szDriveType, "%sハードディスク", szDriveName) ;
				break ;
			case DRIVE_REMOTE :
				wsprintf(szDriveType, "%sネットワークドライブ", szDriveName) ;
				break ;
			case DRIVE_CDROM :
				wsprintf(szDriveType, "%sCD-ROM", szDriveName) ;
				break ;
			case DRIVE_RAMDISK :
				wsprintf(szDriveType, "%sRAMディスク", szDriveName) ;
				break ;
			default:
				wsprintf(szDriveType, "%s異常", szDriveName) ;
				break ;
		}
		// 取得した結果をリストボックスに格納
		// m_wndListBoxはCListBox型のオブジェクト
		SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)szDriveType) ;
	}
}
//(MFC)
/////////////////////////////////////////////////////////////////////////////
BOOL CTestDialog::OnTest()
{
	char szDriveName[] = {"A:"} ;
	char szDriveType[256] ;

	for(int nIndex='A' ; nIndex<'H' ; nIndex++){
		// 検索するドライブ名作成
		szDriveName[0] = (char)nIndex ;
		// ドライブの種類を取得
		UINT uType = GetDriveType(szDriveName) ;
		switch(uType){
			case DRIVE_UNKNOWN :
				wsprintf(szDriveType, "%s不明", szDriveName) ;
				break ;
			case DRIVE_NO_ROOT_DIR :
				wsprintf(szDriveType, "%s存在しない", szDriveName) ;
				break ;
			case DRIVE_REMOVABLE :
				wsprintf(szDriveType, "%sリムーバブルディスク", szDriveName) ;
				break ;
			case DRIVE_FIXED :
				wsprintf(szDriveType, "%sハードディスク", szDriveName) ;
				break ;
			case DRIVE_REMOTE :
				wsprintf(szDriveType, "%sネットワークドライブ", szDriveName) ;
				break ;
			case DRIVE_CDROM :
				wsprintf(szDriveType, "%sCD-ROM", szDriveName) ;
				break ;
			case DRIVE_RAMDISK :
				wsprintf(szDriveType, "%sRAMディスク", szDriveName) ;
				break ;
			default:
				wsprintf(szDriveType, "%s異常", szDriveName) ;
				break ;
		}
		// 取得した結果をリストボックスに格納
		// m_wndListBoxはCListBox型のオブジェクト
		m_wndListBox.AddString(szDriveType) ;
	}
}

//--------------------------------------------------------------------------------
//
//【実行ファイルのフルパス取得】
//
//(SDK/MFC)
/////////////////////////////////////////////////////////////////////////////
{
	char szModulePath[MAX_PATH] ;

	GetModuleFileName(NULL, szModulePath, MAX_PATH) ;
}
//--------------------------------------------------------------------------------
//
//【フォルダ選択ダイアログを表示する】
//
// ファイル選択ダイアログや色の選択ダイアログがコモンダイアログとしてMFCのクラス化されて
// いるのに対してフォルダ選択ダイアログはMFCには存在しないため、この話題は メーリングリス
// ト等でよく見かけます。
// ファイル選択ダイアログ(CFileDialog)をカスタマイズして代用しようとする人もいますが 非
// 常に面倒です。
// 以下の様なダイアログであれば SHBrowseForFolder() というAPIを使って表示することができ
// ます。 

#include  // このヘッダーのインクルードが必要です

{
	BROWSEINFO bInfo ;
	LPITEMIDLIST pIDList ;
	TCHAR szDisplayName[MAX_PATH] ;
    
	// BROWSEINFO構造体に値を設定
	bInfo.hwndOwner             = AfxGetMainWnd()->m_hWnd ;		// ダイアログの親ウインドウのハンドル
	bInfo.pidlRoot              = NULL ;						// ルートフォルダを示すITEMIDLISTのポインタ (NULLの場合デスクトップフォルダが使われます)
	bInfo.pszDisplayName        = szDisplayName ;				// 選択されたフォルダ名を受け取るバッファのポインタ
	bInfo.lpszTitle             = _T("フォルダの選択") ;		// ツリービューの上部に表示される文字列 
	bInfo.ulFlags               = BIF_RETURNONLYFSDIRS ;		// 表示されるフォルダの種類を示すフラグ
	bInfo.lpfn                  = NULL ;						// BrowseCallbackProc関数のポインタ
	bInfo.lParam                = (LPARAM)0 ;					// コールバック関数に渡す値

	// SHBrowseForFolder()に渡すBROWSEINFO構造体(ここではbInfo)のメンバに次ぁの値
	// を設定します。
	//これで デフォルトで c:\tempが選択された状態になるはずです。
	bInfo.lpfn = BrowseCallbackProc ; // BrowseCallbackProc関数のポインタ
	bInfo.lParam = (LPARAM)"c:\\temp"; // コールバック関数に渡す値
 
	// フォルダ選択ダイアログを表示
	pIDList = ::SHBrowseForFolder(&bInfo) ;
	if(pIDList == NULL){

		// 戻り値がNULLの場合、フォルダが選択されずにダイアログが閉じられたことを意味します。

	}
	else{
		// ItemIDListをパス名に変換します
		if(!::SHGetPathFromIDList(pIDList, szDisplayName)){
			// エラー処理
		}
		// szDisplayNameに選択されたフォルダのパスが入っています

		// 最後にpIDListのポイントしているメモリを開放します
		::CoTaskMemFree(pIDList) ;
	}
}

// 応用 : 特定のフォルダを初期選択させるには
// 以下のようなコールバック関数を作ります。
int __stdcall BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam,  LPARAM lpData)
{
	if(uMsg == BFFM_INITIALIZED){
		SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData) ;
	}
 
	return 0 ;
}
   
//--------------------------------------------------------------------------------
//
//【複数ファイルをまとめて操作する】
//
// SHFileOperation()を使うと 複数ファイルのコピー、移動、削除ができます。
// SHFileOperation()を使って 複数ファイルをコピーするサンプル
{
	// c:\temp の中のファイルをすべて c:\temp2にコピーします
	SHFILEOPSTRUCT fop ;
	fop.hwnd = m_hWnd ; 
	fop.wFunc = FO_COPY ;
	fop.pFrom = "C:\\temp\\*.*\0" ;	// コピー元 (複数指定する場合は NULLで区切ります 最後はNULL2文字で終わらせます)
	fop.pTo = "C:\\temp2\\\0" ;		// コピー先 (複数指定する場合は NULLで区切ります 最後はNULL2文字で終わらせます)
	fop.fFlags = FOF_ALLOWUNDO ;
	SHFileOperation(&fop) ;
}
//--------------------------------------------------------------------------------
//
//【フォルダ内のファイルを検索する】
//
// MFCのCFileFindクラスを使って (サブフォルダを含む)フォルダ内のすべてのファイルを検索するプログラムのサンプル 

// Cドライブのすべてのファイルを検索
{
	SearchFile(_T("C:")) ;
}
void SearchFile(CString strFolder)
{ 
	CFileFind FileFind ;
    
	// すべてのファイルを検索
	CString strSearchFile = strFolder + _T("\\*.*") ;

	if(!FileFind.FindFile(strSearchFile)) 
		return ; 
    
	BOOL bContinue = TRUE ;
	while(bContinue){ 
		bContinue = FileFind.FindNextFile() ;
		// ドット("." , "..")の場合 無視
		if(FileFind.IsDots())
			continue ; 
		// ディレクトリの場合、そのディレクトリ内を検索するため再起呼び出し
		if(FileFind.IsDirectory()) 
			SearchFile(FileFind.GetFilePath()) ; 
		else
			// ファイルの場合
			TRACE("%s\n",FileFind.GetFilePath()) ; 
	} 
}
// MFCを使わない場合, _findfirst _findnext を使って同等のことができる。