删除目录中的所有文件,排除特定文件

时间:2019-11-04 16:16:20

标签: inno-setup pascalscript

我正在尝试编写脚本(pascal-script和innosetup的新功能),安装后必须删除目录中除特定文件名之外的所有文件。

[Code]

procedure CompareAndRemove(const Path: String); 
begin 
Log('checking file path  : ' + Path);
    if (ExtractFileExt(Path) <> 'setup-0.1.1.2.exe') 
        then  DelayDeleteFile(Path, 2);    
end; 

procedure CleanDirOutOfFiles();
var  
  Path, FilePath: string;
  FindRec: TFindRec;
begin
   Path := ExpandConstant('{{app}\{#test}\recurring}');
  if FindFirst(Path + '*', FindRec) then
  begin
    try
      repeat
        // if just File
      if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0         
        then
         begin
             CompareAndRemove(Path+FindRec.Name);
         end;
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
    end;
   end;

该代码必须删除重复目录中除setup-0.1.1.2.exe之外的所有文件。所以我该怎么做。好像现在没有删除任何内容。

    [Code]
procedure DelTreeExceptSavesDir(Path: string);
var
  FindRec: TFindRec;
  FilePath: string;
begin
  if FindFirst(Path + '\*', FindRec) then
  begin
    try
      repeat
        if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
        begin
          FilePath := Path + '\' + FindRec.Name;
          if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          begin
            if DeleteFile(FilePath) then
            begin
              Log(Format('Deleted file %s', [FilePath]));
            end
              else
            begin
              Log(Format('Failed to delete file %s', [FilePath]));
            end;
          end
        end;
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end
    else
  begin
    Log(Format('Failed to list %s', [Path]));
  end;
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  SavePath: string;
begin
  SavePath := ExpandConstant('{app}\{#test}\recurring');

  if CurUninstallStep = usUninstall then
  begin
      DelTreeExceptSavesDir(SavePath);
    end;
  end;

由于我只想删除文件,因此我对Inno Setup - Delete whole application folder except for data subdirectory做了一些修改。编译器没有抱怨,但我在这里没有得到如何提及该特定文件名的信息

1 个答案:

答案 0 :(得分:1)

function DeleteReqdFiles(FileNameToSkipDelete: String; WildCharPath: String): Boolean;
 var
  FindRec: TFindRec;   
  FilesFound: Integer;
  FilePath: String;
  ResultVal: Integer;
  Path: String;
begin
  FilesFound := 0
  Path:=ExpandConstant('{app}')
  ResultVal:=FilesFound
  if FindFirst(Path + '\*' + WildCharPath + '.*' , FindRec) then
  begin
   try
     repeat
        if (FindRec.Name <> '.') and (FindRec.Name <> '..') and (FindRec.Name <> FileNameToSkipDelete) then
        begin
         FilesFound := FilesFound + 1;
         ResultVal:=FilesFound
         FilePath := Path + '\' + FindRec.Name;
         DelTree(FilePath,False, True, False);
         end;
      until not FindNext(FindRec);
     finally
      FindClose(FindRec);
    end;     
  end
end;

嗨,我想我发布这个消息有点晚了。但是我也遇到了同样的问题,并且尝试了这种方式及其工作方式。

FileNameToSkipDelete:它是您要跳过的文件的名称

WildCharPath:如果您具有路径C:\ Program Files(x86)\ Test \ New,并且在此文件夹中您有许多文件,则某些文件具有几个字符,如SW.SL.Test.dll,SW。 SL.New.dll,SW.SL.KL.dll,SW.SL.JK.dll以及其他文件,例如SP.SL.HH.dll,SP.SL.KJ.dll。然后,我可能有兴趣删除特定文件SW.SL.KL.dll,并希望在该SW.SL中进行搜索,然后FileNameToSkipDelete将是SW.SL.KL.dll,WildCharPath将是SW.SL。因此,将仅搜索匹配的WildCharPath中的文件。

我试图通过尝试输入可以跳过的字符串数组来使其更通用,但出于即时要求,现在只需要跳过一个文件名。

希望它可以解决您的问题。