我正在尝试编写脚本(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做了一些修改。编译器没有抱怨,但我在这里没有得到如何提及该特定文件名的信息
答案 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中的文件。
我试图通过尝试输入可以跳过的字符串数组来使其更通用,但出于即时要求,现在只需要跳过一个文件名。
希望它可以解决您的问题。