刪除或重命名正在打開的文件
Windows NT中有一個函數MoveFileEx,若使用MOVEFILE_DELAY_UNTIL_REBOOT 標記,它可以在重啓過程中刪除文件。但是,Windows 9x 並不支持這個標記。怎麼辦呢?
每次當你重啓,windows會在Windows目錄下尋找文件WININIT.INI。這個文件包含刪除/複製/重命名文件的命令,它可以在任何東西(實際上是決大部分)被載入前運行。你可以在[Rename]部分裏使用語法 目標文件=原文件。如果目標文件爲NUL,則文件將被刪除。文件名和路徑必須是短文件名(因爲這個過程運行於長文件名支持程序載入之前)。
注意文件win32.hlp與這個例子相反,你不可以使用WritePrivateProfileString()或TiniFile訪問這個文件,可能由於它有副本值。若它有空值,TiniFile會覆蓋它而不是新建一個,所以你最好使用TstringList代替。
以下是一些輸入項:
[rename]
NUL=C:/TEMP.TXT
NUL=C:/TEMP2.TXT
C:/NEW_DIR/EXISTING.TXT=C:/EXISTING.TXT
C:/NEW_DIR/NEWNAME.TXT=C:/OLDNAME.TXT
C:/EXISTING.TXT=C:/TEMP/NEWFILE.TXT
以下是函數DeleteLater,它會往wininit.ini裏添加NUL=文件名,若wininit.ini不存在,則創建一個,也可以創建[rename]部分。
procedure DeleteLater(Filename: string);
var
Wininit: string;
Buffer: array[0..MAX_PATH] Of char;
I, J: integer;
Ini: TStringList;
begin
FillChar(Buffer, SizeOf(Buffer), 0);
GetWindowsDirectory(Buffer, SizeOf(Buffer));
Wininit := IncludeTrailingBackslash(Buffer) + 'Wininit.ini';
Ini := TStringList.Create;
try
if FileExists(Wininit) then
Ini.LoadFromFile(Wininit);
for I := 0 to Ini.Count - 1 do
Ini[I] := Uppercase(Ini[I]);
J := Ini.IndexOf('[RENAME]');
if J = -1 then
begin
Ini.Add('[Rename]');
J := 0;
end;
FillChar(Buffer, SizeOf(Buffer), 0);
GetShortPathName(PChar(Filename), Buffer, SizeOf(Buffer));
Ini.Insert(J + 1, 'NUL=' + Buffer);
Ini.SaveToFile(Wininit);
finally
Ini.Free;
end;
end;
---
本文章使用“國華軟件”出品的博客內容管理軟件MultiBlogWriter撰寫併發布