删除或重命名正在打开的文件
摘 要:对一些windows使用的文件,如DLL或VxD,有些时候需要
关键字:重启 删除 复制 重命名 文件
类 别:API
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;