|
Iranoanさん、
おかげさまで、2つの絶対パスから、相対パスを求めるマクロの基本部分が完成しま
した。またバグが取れきっていないかもしれませんが、使いながら直していこうと思
います。
ありがとうございました。
// ---------------------------------------------------------
// 相対パス変換マクロ
// 対象パスと基準パスから、相対パスを返す
// 対象ファイル 動作確認用
// ファイル名が必要なのは、対象側のみ
$TargetFile = @"H:\MyWebSite\WebDesign\Tools\CMS\CMS.html";
// 対象パスの作業変数
$T_Pass = @"H:\MyWebSite\WebDesign\Tools\CMS";
// 基準パスの作業変数
$S_Pass = @"H:\MyWebSite\WebDesign\TagScript";
// ドライブ文字が同じことを確認する ex. H:\
if(leftstr($T_Pass,3) != leftstr($S_Pass,3))
{
message "2つのファイルが異なるドライブに存在します";
// マクロを終了する
endmacro;
}
// ドライブ文字を取得する ex. H:\
$DriveLetter = leftstr($T_Pass,3);
// 対象ファイル名を取得する
#FileNamePosition=strrstr($TargetFile,"\\")+1;
$T_FileName= midstr($TargetFile,#FileNamePosition);
// 状態確認用MessageBox
$msg = "ファイル名 " + $T_FileName;
message $msg;
// 「\\」までごとに、2つのパスの同じ部分を削除する
while(1){
// $T_Pass内の「\」の位置を確認する「\\」と2つあるので、+1
// #YenPosition内の位置を示す値は、0から開始される
#YenPosition=strstr($T_Pass,"\\")+1;
// \が見つからない場合
if(#YenPosition==0){
// $S_Passに、\が存在するか確認する
#YenPosition=strstr($S_Pass,"\\")+1;
if(#YenPosition==0){
// どちらにも\がない場合
if($T_Pass==$S_Pass){
// $T_Passと$S_Passが同じであれば、どちらの内容も削除する
$T_Pass="";
$S_Pass="";
break;
}
// $T_Passと$S_Passが異なれば、そのまま、ループから抜ける
break;
}
}
// 左から「\」の位置までの文字列が異なる場合、
if(leftstr($T_Pass,#YenPosition)!=leftstr($S_Pass,#YenPosition))
{
// 一方のパスが最後まで削除された時の処理
// 片側が **\ もう一方が、**になる。
if(leftstr($T_Pass,#YenPosition-1)!=leftstr($S_Pass,#YenPosition-1))
{
// while[ループ](Loop)から抜ける。
break;
}
else
{
// ディレクトリ部分のみ削除する
$T_Pass= midstr( $T_Pass, #YenPosition-1);
$S_Pass= midstr( $S_Pass, #YenPosition-1);
// 一方のパスの先頭にある「\」を削除する
if(leftstr($T_Pass,1)=="\\"){
$T_Pass= midstr( $T_Pass,1);
}
if(leftstr($S_Pass,1)=="\\"){
$S_Pass= midstr( $S_Pass,1);
}
// while[ループ](Loop)から抜ける。
break;
}
}
// 「\」までの内容を削除する。
$T_Pass= midstr( $T_Pass, #YenPosition);
$S_Pass= midstr( $S_Pass, #YenPosition);
}
// 動作確認用 ループを抜けた後のパスを表示
$msg = "同じフォルダを削除した相対パスを作成する前のパス" + "\n";
$msg = $msg + "対象パス" + $T_Pass + "\n";
$msg = $msg + "基準パス" + $S_Pass;
message $msg;
// 相対パスを作成する
// 対象パスの区切り文字「\」を「/」に変更する
$T_Result="";
#YenPosition=strstr($T_Pass,"\\")+1;
if(#YenPosition==0){
// \が見つからない場合で、
if(strlen($T_Pass)>0){
// 文字列(フォルダ)が存在すれば、$T_Resultの結果はその文字列(フォルダ)
$T_Result=$T_Pass;
if($T_Result!=""){
$T_Result=$T_Result+"/";
}
}
}else{
// 対象パスの区切り文字「\」を全て「/」に変更する
while(1)
{
$T_Result=$T_Result+leftstr($T_Pass,#YenPosition-1);
$T_Pass= midstr($T_Pass, #YenPosition);
#YenPosition=strstr($T_Pass,"\\")+1;
if(#YenPosition == 0){
// \が見つからないとき、
$T_Result=$T_Result+"/"+$T_Pass;
// while[ループ](Loop)から抜ける。
break;
}
}
$T_Result=$T_Result+"/";
}
// 状態確認用MessageBox
$msg = "$T_Result " + $T_Result;
message $msg;
// 基準パスのフォルダを../に変更する
$S_Result="";
#YenPosition=strstr($S_Pass,"\\")+1;
if(#YenPosition==0){
// \が見つからない場合で、
if(strlen($S_Pass)>0){
// 文字列(フォルダ)が存在すれば、../を結果に追加する
$S_Result=$S_Result+"../";
}
}
while(#YenPosition)
{
// \が見つかれば、../を結果に追加する
$S_Result=$S_Result+"../";
// \までの文字列を削除する
$S_Pass= midstr( $S_Pass, #YenPosition);
// 再度、\を探す。
#YenPosition=strstr($S_Pass,"\\")+1;
if(#YenPosition==0){
// \が見つからない場合で、
if(strlen($S_Pass)>0){
// 文字列(フォルダ)が存在すれば、../を結果に追加する
$S_Result=$S_Result+"../";
}
}
}
// 状態確認用MessageBox
$msg = "$S_Result " + $S_Result;
message $msg;
// 状態確認用MessageBox
$msg = "相対パス " + $S_Result + $T_Result + $T_FileName;
message $msg;
// ---------------------------------------------------------
|
|