Одной из возможностей будет добавление каждого временного файла в список файлов, которые удаляются при запуске системы.
На платформе Windows NT (начиная с Windows 2000) вы можете просто вызвать функцию MoveFileEx со вторым параметром (назначение), равным nil, и с флагом MOVEFILE_DELAY_UNTIL_REBOOT.
В Windows 9x это намного сложнее. Вы должны отредактировать файл% WINDIR% \ wininit.ini и записать запись в раздел [Rename].
MSDN запись Как переместить файлы, которые используются в настоящее время описывает оба метода.
Функция DSiMoveOnReboot (часть бесплатной библиотеки DSiWin32 ) обрабатывает обе операционные системы. Если вы передадите пустую строку в качестве второго параметра, при перезагрузке будет удален исходный файл.
function DSiMoveOnReboot(const srcName, destName: string): boolean;
var
wfile: string;
winit: text;
wline: string;
cont : TStringList;
i : integer;
found: boolean;
dest : PChar;
begin
if destName = '' then
dest := nil
else
dest := PChar(destName);
if DSiIsWinNT then
Result := MoveFileEx(PChar(srcName), dest, MOVEFILE_DELAY_UNTIL_REBOOT)
else
Result := false;
if not Result then begin
// not NT, write a Rename entry to WININIT.INI
wfile := DSiGetWindowsFolder+'\wininit.ini';
if FileOpenSafe(wfile,winit,500,120{one minute}) then begin
try
cont := TStringList.Create;
try
Reset(winit);
while not Eof(winit) do begin
Readln(winit,wline);
cont.Add(wline);
end; //while
if destName = '' then
wline := 'NUL='+srcName
else
wline := destName+'='+srcName;
found := false;
for i := 0 to cont.Count - 1 do begin
if UpperCase(cont[i]) = '[RENAME]' then begin
cont.Insert(i+1,wline);
found := true;
break;
end;
end; //for
if not found then begin
cont.Add('[Rename]');
cont.Add(wline);
end;
Rewrite(winit);
for i := 0 to cont.Count - 1 do
Writeln(winit,cont[i]);
Result := true;
finally cont.Free; end;
finally Close(winit); end;
end;
end;
end; { DSiMoveOnReboot }