mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-28 10:02:14 +00:00
UPD: Speed up zip-archive creation/modification
This commit is contained in:
parent
20a738b799
commit
465990f1da
1 changed files with 30 additions and 10 deletions
|
|
@ -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;
|
||||
{ -------------------------------------------------------------------------- }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue