UPD: Speed up zip-archive creation/modification

This commit is contained in:
Alexander Koblov 2020-06-04 18:32:43 +00:00
commit 465990f1da

View file

@ -631,6 +631,7 @@ uses
SysUtils,
LazUTF8,
DCOSUtils,
DCStrUtils,
DCBasicTypes,
DCClassesUtf8,
DCDateTimeUtils,
@ -2180,6 +2181,8 @@ var
WorkingStream : TAbVirtualMemoryStream;
CurrItem : TAbZipItem;
Progress : Byte;
ATempName : String;
CreateArchive : Boolean;
begin
if Count = 0 then
Exit;
@ -2204,8 +2207,14 @@ begin
TAbSpanWriteStream(NewStream).OnRequestImage := DoRequestImage;
end
else begin
NewStream := TAbVirtualMemoryStream.Create;
TAbVirtualMemoryStream(NewStream).SwapFileDirectory := FTempDir;
CreateArchive:= FOwnsStream and (FStream.Size = 0) and (FStream is TFileStreamEx);
if CreateArchive then
NewStream := FStream
else begin
ATempName := Copy(ExtractOnlyFileName(FArchiveName), 1, MAX_PATH div 2) + '~';
ATempName := GetTempName(ExtractFilePath(FArchiveName) + ATempName) + '.tmp';
NewStream := TFileStreamEx.Create(ATempName, fmCreate or fmShareDenyWrite);
end;
end;
try {NewStream}
@ -2393,15 +2402,25 @@ begin
if (FStream is TMemoryStream) then
TMemoryStream(FStream).LoadFromStream(NewStream)
else begin
if FOwnsStream then begin
if FOwnsStream then
begin
{need new stream to write}
FreeAndNil(FStream);
FStream := TFileStreamEx.Create(FArchiveName,
fmOpenReadWrite or fmShareDenyWrite);
if CreateArchive then
NewStream := nil
else begin
FreeAndNil(FStream);
FreeAndNil(NewStream);
if (mbDeleteFile(FArchiveName) and mbRenameFile(ATempName, FArchiveName)) then
FStream := TFileStreamEx.Create(FArchiveName, fmOpenReadWrite or fmShareDenyWrite)
else
RaiseLastOSError;
end;
end
else begin
FStream.Size := 0;
FStream.Position := 0;
FStream.CopyFrom(NewStream, 0)
end;
FStream.Size := 0;
FStream.Position := 0;
FStream.CopyFrom(NewStream, 0)
end;
end;
@ -2416,7 +2435,8 @@ begin
DoArchiveSaveProgress( 100, Abort );
DoArchiveProgress( 100, Abort );
finally {NewStream}
NewStream.Free;
if (FStream <> NewStream) then
NewStream.Free;
end;
end;
{ -------------------------------------------------------------------------- }