Danke für die Demo und das Testen.
Gerne!
Es muss doch eine andere Möglichkeit geben, um bzip2, deflate usw zum Laufen zu bekommen. Eine
DLL von 2009 kann nicht die Lösung sein.
Naja, die Header sind von 2009, von daher bleibe ich nun auch beim testen bei diesen alten Bibliotheken.
Das Problem liegt also bei 7z selbst.
Oder die Header Übersetzung... Du siehst ja das nicht alles so klappt wie man eigentlich vermuten sollte.
- Kompressionslevel SAVE und Kompressionsmethode COPY funktionieren nur im Single-Threaded-Modus
-- funktionieren außerdem nur, wenn EncryptHeaders nicht an ist. Ist EncryptHeaders an, sind wir wieder beim LZMA-Problem.
Also die 7z.dll macht irgendwie schon das was sie sollte, nur eben nicht alles.
Abgesehen von BZip2, Kompressions Level und Threads, arbeitet es einwandfrei.
Das mit den Threads ist mir erstmal gar nicht so ins Auge gefallen da ich mich mehr auf die erzeugten Archive fokusiert hatte.
Deinen Patch kann ich nicht nachvollziehen.
Delphi-Quellcode:
procedure SetMultiThreading(Arch: I7zOutArchive; ThreadCount: Cardinal);
begin
// SetCardinalProperty(arch, 'MT', ThreadCount);
if (ThreadCount > 1) then
SetCardinalProperty(arch, 'MT', ThreadCount)
else
if (ThreadCount <= 0) then
SetBooleanProperty(arch, 'MT', False);
end;
Macht doch das gleiche wie
Delphi-Quellcode:
procedure SetMultiThreading(Arch: I7zOutArchive; ThreadCount: Cardinal);
begin
SetCardinalProperty(arch, 'MT', ThreadCount);
end;
(Boolean False wird doch zu einer 0)
So sieht meine "Pack" routine aus:
Delphi-Quellcode:
procedure TfrmMain.btnCreateClick(Sender: TObject);
var
Arch: I7zOutArchive;
fn: string;
i: Integer;
len: Integer;
begin
if (lbFiles.Items.Count > 0) then
if sdCreate.Execute(Self.Handle) then
begin
// update UI
btnAdd.Enabled := False;
btnClear.Enabled := False;
edtPassword.Enabled := False;
gbLevel.Enabled := False;
rgMethod.Enabled := False;
cbThreads.Enabled := False;
cbThread.Enabled := False;
Application.ProcessMessages;
Sleep(1);
// begin creating internal archive format
Arch := CreateOutArchive(CLSID_CFormat7z);
// store filename
fn := sdCreate.FileName;
// calculate the number of chars to be stripped
if (lbFiles.Items.Count > 1) then
len := Succ(Length(FindCommonPath(PathDelim, lbFiles.Items.ToStringArray)));
// compression level 0-9 (store - ultra)
SetCompressionLevel(Arch, tbLevel.Position);
// compression method
case rgMethod.ItemIndex of
0: SevenZipSetCompressionMethod(Arch, m7Copy);
1: SevenZipSetCompressionMethod(Arch, m7LZMA);
2: SevenZipSetCompressionMethod(Arch, m7BZip2);
3: SevenZipSetCompressionMethod(Arch, m7PPMd);
4: SevenZipSetCompressionMethod(Arch, m7Deflate);
5: SevenZipSetCompressionMethod(Arch, m7Deflate64);
else
SevenZipSetCompressionMethod(Arch, m7Copy);
end;
// number of threads
if ((not cbThread.Checked) and (cbThreads.Items.Strings[0] <> 'N/A')) then
SetMultiThreading(Arch, Succ(cbThreads.ItemIndex))
else
SetMultiThreading(Arch, 0);
// optional try archive settings
SevenZipRemoveSfxBlock(Arch, True);
SevenZipSetSolidSettings(Arch, True);
SevenZipAutoFilter(Arch, True);
SevenZipCompressHeaders(Arch, True);
SevenZipCompressHeadersFull(Arch, True);
SevenZipEncryptHeaders(Arch, True);
// optional password encrypt
if (edtPassword.Text <> '') then
Arch.SetPassword(edtPassword.Text);
// use progressbar
Arch.SetProgressCallback(Self, ProgressCallback);
// add files to archive, stripping leading folders
if (lbFiles.Items.Count = 1) then
Arch.AddFile(lbFiles.Items.Strings[0], ExtractFileName(lbFiles.Items.Strings[0]))
else
for i := 0 to Pred(lbFiles.Items.Count) do
Arch.AddFile(lbFiles.Items.Strings[i], Copy(lbFiles.Items.Strings[i], Succ(len), (Length(lbFiles.Items.Strings[i]) - len)));
// encode and write the archive
Arch.SaveToFile(fn);
// update UI
btnAdd.Enabled := True;
btnClear.Enabled := True;
edtPassword.Enabled := True;
gbLevel.Enabled := True;
cbThread.Enabled := True;
cbThreads.Enabled := ((not cbThread.Checked) and (cbThreads.Items.Strings[0] <> 'N/A'));
rgMethod.Enabled := True;
Application.ProcessMessages;
end;
end;