刪除或重命名正在打開的文件

刪除或重命名正在打開的文件

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撰寫併發布

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章