色々とノリの悪いMSCompAssプログラミング、今回は不注意からまたバグを出しました。
1.まず当初(Version 1.0)のコードでは、ソースコードを読み込み、それをMSCompAssを使ってcsc.exeでコンパイルしますが、出力先を指定していなかったのでカレントディレクトリーであるMSCompAss.exeのあるフォールダーに出力してしまいます。
2.それに気が付いて、慌ててcsc.exeの"/out:(ファイル名)"オプションを使い、ソースファイル名(フルパス+ファイル名.csまたはvb)の拡張子を".exe"に交換して出力する仕様にしましたが、今度はその長々とした"/\out:"オプションが気に入らなくなり、
3.「現在仕掛っているソースファイルのあるフォールダーへ移動して、(他のソースコードが読み込まれるまでは)そこにいてexeファイルも出力する仕様にしました。
4.その際、プログラムに与えられる引数を切り出すと共にフルパスファイル名も分解するCARGクラスを使ったのは良いですが、あまり考えずに次のようにコーディングしました。
//フルパスファイル名g_FileNameからファイルパスをg_TargetPathに記録
Arg = g_FileName.ToChar(); //CSTRクラスインスタンスのg_FileNameにはソースのフルパスファイル名が入っている
g_TargetPath = Arg.Path(); //Path()はchar*でファイルパスのみを返す
5.そして今朝、C#サンプルプログラムのソースコードが入っている「C#」フォールダーを「C# Programing」に変更した途端、そのフォールダーの直上のフォールダーに出力されるようになりました。(注)
注:勘がよい方はもうお分かりと思いますが、「(パス)\C#\(プログラム名)」を分解して最後の'\'以降を外すPath()を使って「(パス)\C#」を取得していましたが、CARGのArgに「(パス)\C# Programing\(プログラム名)」を渡すと、[C#」と「Programing」の間の空白文字で別の引数と認識され、Path()関数には「(パス)\C#」までが渡されるため、パス名は最後の'\'以降が外されて「(パス)」になってしまいます。
6.なら、フルパスファイル名を分解する場合にはOSが行うように「""」で囲めばよいじゃない、というのが正解ですが、実はCARGクラスには元々そういう使い方をすることを想定して、
|
char* GetLongName(char*); |
引数にスペースがあればダブルコーテーションをつける |
ファイルパス、ネームの文字列 |
|
char* GetQuatoOff(char*); |
引数にダブルコーテーションがあればこれをとる |
ファイルパス、ネームの文字列 |
という関数を予め用意していました。しかし、それも「20年前」で今は耄碌した爺さんはすっかり忘れていた、という次第です。
従って正解は、
//フルパスファイル名g_FileNameからファイルパスをg_TargetPathに記録
Arg = Arg.GetLongName(g_FileName.ToChar());
g_TargetPath = Arg.Path();
とすることでした。(なお、当然のことですが、本日修正パッケージをアップしましたので、早晩修正版がアップされるでしょう。)