- // strA 基準パス
- // strB 相対パスを計算させたいパス
- CString GetRelativePath(CString strA,CString strB){
- CString strBasePath = strA;
- CString strPath = str B;
- CString strBackDir; // ../文字列
- CString strDir;// 相対パス
- int nBackDir = 0;// ../を記述する回数
- int i,nNumHtml,nNumPath;// Loop変数
- char chDrv[_MAX_DRIVE];// Htmlのドライブ
- char chDir[_MAX_DIR];// Htmlのディレクトリ
- CString strTemp;// CStringテンポラリファイル
- bool bFlg = true;// フラグ
-
- // strBasePathからファイル名だけを取り除く②
- _splitpath(strBasePath,chDrv,chDir,NULL,NULL);
- strBasePath = (CString)chDrv + (CString)chDir;
-
- // 先頭から共通なデ゛ィレクトリを削除③
- while(bFlg){
- if(strHtmlPath.SpanExcluding("\\")==strPath.SpanExcluding("\\")){
-
- strTemp = strHtmlPath.SpanExcluding("\\");
-
- strHtmlPath.Delete(0,strTemp.GetLength()+1);
-
- strPath.Delete(0,strTemp.GetLength()+1);
-
- }
-
- else bFlg = false;
- }
-
- // ../と記述する数nBackDirをカウント④
- while(!strBasePath.IsEmpty()){
- strBasePath.Delete(0,strBasePath.SpanExcluding("\\").GetLength()+1);
- nBackDir++;
- }
-
- // ../文字列作成⑤
- for(i=0;i<nBackDir;i++)
- strBackDir += "../";
- //相対パス作成⑥
- strDir = strBackDir + strPath;
-
- // '\'と'/'の変更
- for(i=0;i<strDir.GetLength();i++){
- if(strDir.GetAt(i)=='\\') strDir.SetAt(i,'/');
- }
-
- // 先頭が'/'の場合は削除
- if(strDir.GetAt(0)=='/') strDir.Delete(0,1);
-
- return strDir;
-
- }
※このコードにはバグが残っている可能性があります。
|