From 703d2d5a52df5775c45428bde0acc8a2bcbf8359 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 31 Jan 2023 17:17:02 +0300 Subject: [PATCH] 20230131 --- jarunpacker.lpi | 103 ++++++++++++++++++++++++++++++ jarunpacker.lpr | 162 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 265 insertions(+) create mode 100644 jarunpacker.lpi create mode 100644 jarunpacker.lpr diff --git a/jarunpacker.lpi b/jarunpacker.lpi new file mode 100644 index 0000000..14ee076 --- /dev/null +++ b/jarunpacker.lpi @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + <UseAppBundle Value="False"/> + <ResourceType Value="res"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <VersionInfo> + <UseVersionInfo Value="True"/> + <AutoIncrementBuild Value="True"/> + <MajorVersionNr Value="2023"/> + <MinorVersionNr Value="1"/> + <RevisionNr Value="31"/> + <Language Value="0419"/> + <StringTable Comments="fwZIP создан Rouse_" CompanyName="Александр Бабаев" FileDescription="JAR UnPacker ZIP Tool" InternalName="jarunpacker" LegalCopyright="Александр Бабаев" LegalTrademarks="Александр Бабаев" OriginalFilename="jarunpacker" ProductName="Jar Unpacker" ProductVersion="2023.01.31"/> + </VersionInfo> + <BuildModes Count="1"> + <Item1 Name="Win32" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <FormatVersion Value="2"/> + <Modes Count="1"> + <Mode0 Name="default"/> + </Modes> + </RunParams> + <RequiredPackages Count="2"> + <Item1> + <PackageName Value="ANBSTCP"/> + </Item1> + <Item2> + <PackageName Value="fwzip"/> + </Item2> + </RequiredPackages> + <Units Count="1"> + <Unit0> + <Filename Value="jarunpacker.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value=".\output\jarunpacker"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="data\lib"/> + </SearchPaths> + <Parsing> + <SyntaxOptions> + <SyntaxMode Value="Delphi"/> + </SyntaxOptions> + </Parsing> + <CodeGeneration> + <SmartLinkUnit Value="True"/> + <TargetCPU Value="i386"/> + <TargetOS Value="win32"/> + <Optimizations> + <OptimizationLevel Value="3"/> + </Optimizations> + <SmallerCode Value="True"/> + </CodeGeneration> + <Linking> + <Debugging> + <DebugInfoType Value="dsDwarf3"/> + <StripSymbols Value="True"/> + <UseExternalDbgSyms Value="True"/> + </Debugging> + <LinkSmart Value="True"/> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/jarunpacker.lpr b/jarunpacker.lpr new file mode 100644 index 0000000..8fcf16a --- /dev/null +++ b/jarunpacker.lpr @@ -0,0 +1,162 @@ +program jarunpacker; + +{$mode delphi} +{$codepage UTF8} +uses + Interfaces, + Classes, + Windows, + FWZipReader, + SysUtils, + ParamsMngr, + LazUTF8Classes, + FWZipConsts, + FWZipWriter, + FWZipZLib, + SimplyJSON, + LazFileUtils, + ANBFormatString; + +{$R *.res} +resourcestring + msg_consoletitle = 'JAR Unpacker Tool'; + msg_noparametrsfound = #13#10 + '[ОШИБКА] Параметры не заданы!'; + msg_extractingfile = 'Извлекаю файл: %s'; + msg_buildingfile = 'Сжимаю файл: %s'; + + procedure ExtractJAR(const JARName, TargetDir, ListFileName: string); + var + Reader: TFWZipReader; + zItem: TFWZipReaderItem; + FS: TFileStreamUTF8; + FL: TStringList; + Indx: integer; + begin + FS := TFileStreamUTF8.Create(JARName, fmOpenRead + fmShareExclusive); + FL := TStringList.Create; + Reader := TFWZipReader.Create; + try + Reader.LoadFromStream(FS); + for Indx := 0 to Reader.Count - 1 do + begin + zItem := Reader.Item[Indx]; + FL.Add(FormatStr(zItem.FileName + '=' + zItem.FileName, ['/'], ['\'])); + end; + Reader.ExtractAll(TargetDir); + finally + Reader.Free; + if Trim(ListFileName) <> '' then + FL.SaveToFile(ListFileName); + FreeAndNil(FL); + FS.Free; + end; + end; + + procedure CompressJAR(const JARName, SourceDir, ListFileName: string); + var + Writer: TFWZipWriter; + FS: TFileStreamUTF8; + FL: TStringList; + begin + if FileExistsUTF8(JARName) then + DeleteFileUTF8(JARName); + FS := TFileStreamUTF8.Create(JARName, fmCreate); + FL := TStringList.Create; + FL.LoadFromFile(ListFileName); + SetCurrentDir(SourceDir); + Writer := TFWZipWriter.Create(clMax); + try + Writer.AddFilesAndFolders(FL, True); + Writer.BuildZip(FS); + finally + Writer.Free; + FreeAndNil(FL); + FS.Free; + end; + end; + + procedure WriteHelpExtract(); + begin + WriteLn('Допустимые параметры команды extract:'); + WriteLn(' target - папка извлечения;'); + WriteLn(' listFile - имя файла для списка распакованных файлов.'); + WriteLn(''); + WriteLn('Пример:'); + WriteLn('/extract="d:\file.jar" /target="d:\toextract\" /listFile="d:\1.txt"'); + end; + + procedure WriteHelpCompress(); + begin + WriteLn('Допустимые параметры команды compress:'); + WriteLn(' from - папка с файлами для архива;'); + WriteLn(' filesList - имя файла со списком файлов для упаковки.'); + WriteLn(''); + WriteLn('Пример:'); + WriteLn('/compress="d:\file.jar" /from="d:\toextract\" /filesList="d:\1.txt"'); + end; + + procedure WriteHelp(); + begin + WriteLn('Допустимые параметры:'); + WriteLn(' extract - извлечение jar-архива;'); + WriteLn(' compres - сжатие jar-ахива.'); + WriteLn(''); + WriteHelpExtract; + WriteLn(''); + WriteHelpCompress(); + WriteLn(msg_noparametrsfound); + end; + +var + isHandled: boolean; + JARName, TargetDir, ListFileName: string; +begin + SetConsoleTitle(PChar(msg_consoletitle)); + WriteLn('--------------------------------------------------------------------'); + WriteLn('****************Утилита упаковки/распаковки JAR файлов**************'); + WriteLn('*************************Версия: 2023.01.31*************************'); + WriteLn('**********Авторские права (c) 2016 - 2023, Александр Бабаев*********'); + WriteLn('--------------------------------------------------------------------'); + isHandled := False; + if HasParam('extract') then + begin + if not (HasParam('target') and HasParam('listFile')) then + begin + WriteHelpExtract(); + ReadLn; + isHandled := True; + end + else + begin + JARName := GetParamValue('extract'); + TargetDir := IncludeTrailingBackslash(GetParamValue('target')); + ListFileName := GetParamValue('listFile'); + ExtractJAR(JARName, TargetDir, ListFileName); + WriteLn(Format(msg_extractingfile, [JARName])); + isHandled := True; + end; + end; + if HasParam('compress') then + begin + if not (HasParam('from') and HasParam('filesList')) then + begin + WriteHelpExtract(); + ReadLn; + isHandled := True; + end + else + begin + JARName := GetParamValue('compress'); + TargetDir := GetParamValue('from'); + ListFileName := GetParamValue('filesList'); + CompressJAR(JARName, TargetDir, ListFileName); + WriteLn(Format(msg_buildingfile, [JARName])); + isHandled := True; + end; + end; + if not isHandled then + begin + WriteHelp(); + ReadLn; + end; +end.