最近写的一个程序需要将新编译的文件打包成自解压文件供用户去安装,在程序中通过WinRAR命令结合WinRAR自解压注释命令实现该功能。
WinRAR命令
WinRAR自解压注释命令
程序界面:
文件目录 为要压缩的目录,默认安装目录为执行生成的自解压文件时默认的安装目录,备注为执行自解压文件时显示的注释。
自解压文件执行界面:
[SinglePic not found]
程序的实现:
首先定义一个公共的自解压注释命令模板 SFX_COMMENT_TEMPLATE.txt
Title=文件安装
SavePath
Path=@Path
Text
{
管理系统
注意事项
在没有确定执行该安装时,请慎重执行
备注
@Comment
}
@Path 执行自解压文件默认安装目录
@Comment为备注信息
程序根据用户选择依据该模板文件生成具体的自解压注释名利文件 comment.txt,并在WinRAR生成解压文件时关联该注释文件。
生成自解压文件代码:
procedure TBuildInstallationForm.btnBuildClick(Sender: TObject,',','); var cmd,CommentTemplate,comment,FileStr,ExeFile: string; FileList,TempList : TStringList; i : Integer; begin if Trim(edtDir.Text) = '' then begin ShowMessage('文件目录不能为空',',','); Exit; end; //打开文件保存对话框 with dlgSave do begin if Execute then begin ExeFile := FileName;//要保存的自解压文件 end; end; CommentTemplate := ExtractFilePath(Application.ExeName) + 'SFX_COMMENT_TEMPLATE.txt'; comment := ExtractFilePath(Application.ExeName) + 'comment.txt'; FileList := TStringList.Create; FindDirFile(edtDir.Text,FileList,',','); //只获取该目录下的文件 和文件夹2.1.9 TempList := TStringList.Create; TempList.LoadFromFile(CommentTemplate,',','); //加载模板文件 //注释模板文件较小,这种处理方式不会对性能造成明显影响 with TempList do begin Text := StringReplace(Text,'@Path',edtDefaultDir.Text,[rfReplaceAll],',',');//替换文件路径 Text := StringReplace(Text,'@Comment',editComment.Text,[rfReplaceAll],',',');//替换注释 end; TempList.SaveToFile(comment,',',');//保存到注释文件 FileStr := '';//文件列表 for i := 0 to FileList.Count - 1 do begin FileStr := FileStr + ' "' + fileList.Strings[i] + '"'; end; //Config.WinRAR WinRAR.exe 路径 cmd := Format('"%s" a -z"%s" -ep1 -sfx "%s" %s',[Config.WinRAR,comment,ExeFile,FileStr],',','); WinExec(PChar(cmd),SW_SHOWNORMAL,',','); ShowMessage('生成成功!',',','); end; FindDirFile: procedure FindDirFile(ASourceDir:string;var fileList : TStringList,',','); var sr : TSearchRec; i : Integer; found : Integer; begin if ASourceDir[Length(ASourceDir)]<>'\' then ASourceDir := ASourceDir + '\'; //找出所有的dof文件 try found := FindFirst(ASourceDir + '*.*',faAnyFile,sr,',','); while found = 0 do begin if (sr.Name <> '.') and (sr.Name <> '..')then //(sr.Attr = faDirectory) then begin fileList.Add(ASourceDir + sr.Name ,',','); end; found := FindNext(sr,',','); end; finally Findclose(sr,',','); end; end;
关键字词: