删除或重命名正在打开的文件

删除或重命名正在打开的文件

删除或重命名正在打开的文件

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撰写并发布

你可能感兴趣的:(删除或重命名正在打开的文件)