例えば画像ファイルを一覧できる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);
}
