実行ファイルのあるフォルダを取得する

「オプションの設定項目をiniファイルとして実行ファイルの存在するフォルダ内に保存したい」というようなときに使えるのがGetModuleFileName関数。この関数では実行ファイルへのフルパスを取得できる。しかし必要なのはフォルダ名の部分までだ。ここではフォルダ名までを取得できる関数を用意した。

依存環境:ATL
#include "atlstr.h"

//
//	実行ファイルの存在するフォルダとファイル名を取得する
//
//実行ファイルが"c:\test\aaa.exe"の場合は、pstrFolderに"c:\test\"、pstrFileに"aaa.exe"が帰る
//pstrFolderの末尾は'\'になる
//
bool	GetExecDir(CAtlString* pstrFolder,CAtlString* pstrFile)
{
	int			nLen;
	errno_t		err;
	TCHAR		pcbPath[_MAX_PATH*2];	//あまり意味はないが2倍値を利用
	TCHAR		pszDrive[_MAX_DRIVE];
	TCHAR		pszFolder[_MAX_DIR];
	TCHAR		pszFile[_MAX_FNAME];
	TCHAR		pszExtent[_MAX_EXT ];

	if(pstrFolder == NULL && pstrFile == NULL)
		return	true;
	if(pstrFolder)
		*pstrFolder = _T("");
	if(pstrFile)
		*pstrFile = _T("");

	//起動ディレクトリ名、ファイル名取得
	nLen = ::GetModuleFileName(NULL,pcbPath,_MAX_PATH*2);
	if(nLen == 0)
		return	false;

	//パスの分解
	err = ::_tsplitpath_s(pcbPath,pszDrive,_MAX_DRIVE,pszFolder,_MAX_DIR,pszFile,_MAX_FNAME,pszExtent,_MAX_EXT);
	if(err != 0)
		return	false;

	//結果保存
	if(pstrFolder)
	{
		*pstrFolder = pszDrive;
		*pstrFolder += pszFolder;
	}
	if(pstrFile)
	{
		*pstrFile = pszFile;
		*pstrFile += pszExtent;
	}

	return	true;
}



void	Test(void)
{
	CAtlString	strMessage;
	CAtlString	strFolder;
	CAtlString	strExec;

	GetExecDir(&strFolder,&strExec);

	strMessage.Format(_T("フォルダは「%s」、ファイル名は「%s」です"),strFolder,strExec);
	::MessageBox(NULL,strMessage,_T(""),MB_OK);

}

プロジェクトファイルをダウンロード


カテゴリー「ファイル・フォルダ」 のエントリー