初めまして、Delφ厨@初心者です。
WinXPsp1の、Delphi6Personalを使用して、Windows用GUIアプリケーションを作成してます(,,´ー`)
そこで質問なんですが作成したアプリケーションを終了した直後に、そのアプリケーションを削除する方法って無いでしょうか。。
普通に Erase(); だと、予想通りファイルアクセスが出来ませんでした。
プロセスが落ちて、アクセスが可能な時での処理って言うのは不可能なんでしょうか。。
Batファイルを利用すると
簡単に削除できますよ。
procedure TForm1.Button1Click(Sender: TObject);
var
BatFileName: String;
EraseBatFile: TStringList;
begin
BatFileName := ChangeFileExt(Application.ExeName, '.bat');
EraseBatFile := TStringList.Create;
try
EraseBatFile.Add(':TOP');
EraseBatFile.Add('@DEL '+Application.ExeName);
EraseBatFile.Add('IF EXIST '+Application.ExeName+' GOTO TOP');
EraseBatFile.Add('@DEL '+BatFileName);
EraseBatFile.SaveToFile(BatFileName);
finally
EraseBatFile.Free;
end;
WinExec(PChar(BatFileName), SW_HIDE);
Application.MainForm.Close;
迅速な対応ありがとうございます。
出来ました。本当に感謝しています^−^
バッチファイルは残るんじゃないの?
>バッチファイルは残るんじゃないの?
はい、確かに残りました。。
>はい、確かに残りました。。
バッチファイルで自分自身を削除するには,最後の行を
EraseBatFile.Add('DEL %0');
とします.Fusaさんの書き間違いでしょう.
(誤字脱字のMr.XRAYよりはひどくないけど... ゴメンなさいFusaさん)
あれ?うちの環境では
EraseBatFile.Add('@DEL '+BatFileName);
これでバッチファイル自身も消えてくれるのですが
何か環境依存するかな...と思って調べたら
スペースを含むフルパスファイル名ですか!
次のようにするとフォルダに
スペースを含む、含まないにかかわらず動作します。
procedure TForm1.Button1Click(Sender: TObject);
var
BatFileName: String;
EraseBatFile: TStringList;
begin
BatFileName := ChangeFileExt(Application.ExeName, '.bat');
EraseBatFile := TStringList.Create;
try
EraseBatFile.Add(':TOP');
EraseBatFile.Add('@DEL '+ '"'+Application.ExeName+'"' );
EraseBatFile.Add('IF EXIST "'+Application.ExeName+'" GOTO TOP');
EraseBatFile.Add('@DEL '+ '"'+ BatFileName + '"');
// EraseBatFile.Add('@DEL %0');
EraseBatFile.SaveToFile(BatFileName);
finally
EraseBatFile.Free;
end;
WinExec(PChar(BatFileName), SW_HIDE);
Application.MainForm.Close;
end;
%0の記述は知りませんでした。
こちらの方がきれいです。
勉強になります。
Fusaさん,大変失礼しました.
>%0の記述は知りませんでした。
%0というのは,コマンドラインの第一引数ですので,Fusaさんのコード
と同じですね.問題はスペースを含むファイル名だったんですね.
習慣的にこちらを使用しているために,勘違いしてしまいました.
>Fusaサン
>Mr.Xrayサン
本当にありがとうございます。出来ました。
ツイート | ![]() |