16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"再起動時にファイル/フォルダをリネーム/削除"
この発言は #01068 Tiny Mouse さんのRE^3:Wininit.iniの使用例 に対するコメントです
こんにちは、Tiny Mouse です。
再起動時にファイルあるいはフォルダを削除するサンプル、以前に書きましたが、
実は大変なバグがありました。自作のソフトに使っていて、ひどい目に遭いました。
存在しないファイルあるいはフォルダを指定すると、Windows フォルダを削除して
しまいます (;_;) 。
現在自分が使っているコードを、以下に紹介します。このコードでは、実在しな
いファイルあるいはフォルダを指定しても、最悪なことにはなりません。とはいえ、
適切なエラー処理はしていません。呼び出し前にファイルあるいはフォルダの存在
をチェックすべきです (^^; 。
NT 系では動作未確認です。
{------------------------------------------------------------------------}
interface
uses
Windows, SysUtils, Classes, FileCtrl;
function MoveFileAtReboot(FromPath, ToPath: String): Boolean;
function DeleteFileAtReboot(Path: String): Boolean;
implementation
{ Windows の次の起動時にファイルをリネームあるいは削除する }
{ FromPath が '' の時 To を削除する }
function MoveFileAtReboot(FromPath, ToPath: String): Boolean;
function MoveFileAtRebootFor95(FromPath, ToPath: String): Boolean;
var
inifile: String;
pos: Integer;
buf, buf1, buf2: array[0..MAX_PATH] of Char;
begin
{ Wininit.ini のパス名を取得 }
GetWindowsDirectory(buf, SizeOf(buf));
inifile := String(buf) + '\Wininit.ini';
{ 編集用のStringListを作成 }
with TStringList.Create do
try
try
{ Wininit.ini が既にあれば読み込む }
if FileExists(inifile) then
LoadFromFile(inifile);
{ [Rename]セクションの位置を取得 }
pos := IndexOf('[Rename]');
{ [Rename]セクションが無ければ追加する }
if pos < 0 then
pos := Add('[Rename]');
{ コピーあるいは削除する設定の行を追加 }
if FileGetAttr(FromPath) and faDirectory > 0 then
begin
{ フォルダを削除 }
GetShortPathName(PChar(FromPath), buf1, SizeOf(buf1));
Insert(pos + 1, 'DirNul=' + String(buf1));
end
else
begin
{ ファイルを削除 }
GetShortPathName(PChar(FromPath), buf1, SizeOf(buf1));
Insert(pos + 1, 'Nul=' + String(buf1));
end;
if ToPath <> '' then
begin
{ ファイル/フォルダをコピー }
GetShortPathName(PChar(FromPath), buf1, SizeOf(buf1));
GetShortPathName(PChar(ToPath), buf2, SizeOf(buf2));
Insert(pos + 1, String(buf2) + '=' + String(buf1));
end;
{ Wininit.ini を保存する }
SaveToFile(inifile);
Result := True;
except
Result := False;
end;
finally
Free;
end;
end;
begin
if MoveFileEx(PChar(FromPath), PChar(ToPath),
MOVEFILE_DELAY_UNTIL_REBOOT or MOVEFILE_REPLACE_EXISTING) then
Result := True
else
Result := MoveFileAtRebootFor95(FromPath, ToPath);
end;
{ Windows の次の起動時にファイルを削除する }
function DeleteFileAtReboot(Path: String): Boolean;
begin
Result := MoveFileAtReboot(Path, '');
end;
◆◆ KHC04052 : http://member.nifty.ne.jp/tinymouse/ : Tiny Mouse ◆◆
Original document by Tiny Mouse 氏 ID:(KHC04052)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|