2つのパス間の相対パスを取得する

例えば画像ファイルを一覧できるHTMLファイルを書き出したい場合など、HTMLファイルの位置から見た画像ファイルへの相対パスを知りたいことがある。このようなときはPathRelativePathToを利用する。

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


//
//	相対パスの取得
//
//Aから見たBへの相対パスを返す。
//ドライブが異なるなど相対パス化できないときは関数は失敗する。
//
bool	GetRelatedPath(CAtlString* pstrRelatedPath,LPCTSTR pszPathA,bool bPathAisFolder,LPCTSTR pszPathB,bool bPathBisFolder)
{
	size_t	nLen;
	BOOL	ret;
	TCHAR*	pszPath;

	if(pstrRelatedPath == NULL)
		return	false;
	*pstrRelatedPath = _T("");
	if(pszPathA == NULL || pszPathB == NULL)
		return	false;

	nLen = max(::_tcslen(pszPathA),::_tcslen(pszPathB));
	nLen *= 2;		//変換結果の方が長くなる可能性があるので×2している

	pszPath = new TCHAR[nLen];
	if(pszPath == NULL)
		return	false;

	//本当はFILE_ATTRIBUTE_DIRECTORYかそうでないかで引数を渡さなければいけない
	ret = ::PathRelativePathTo(pszPath,pszPathA,(bPathAisFolder ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL),pszPathB,(bPathBisFolder ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL));

	if(ret)
		*pstrRelatedPath = pszPath;

	delete	pszPath;

	return	ret ? true : false;
}





void	Test(void)
{
	bool		ret;
	CAtlString	strPath;
	ret = GetRelatedPath(&strPath,_T("c:\\aaa\\bbb\\ccc\\aa.txt"),false,_T("c:\\aaa\\bbb\\ddd\\aa.txt"),false);

	if(ret)
		::MessageBox(NULL,strPath,_T(""),MB_OK);
	else
		::MessageBox(NULL,_T("取得に失敗しました"),_T(""),MB_OK);
}

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


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