UPD: Optimize verify checksum operation

This commit is contained in:
Alexander Koblov 2025-10-03 22:24:51 +03:00
commit 24c8539069
3 changed files with 66 additions and 24 deletions

View file

@ -43,7 +43,7 @@ type
var Special: boolean; var FG, BG: TColor);
private
procedure AddHeader(const aText: String; aCount: Integer; aColor: TColor);
procedure ProcessResult(const aResult: TDynamicStringArray;
procedure ProcessResult(const aResult: TStringList;
const aText: String; aColor: TColor);
protected
procedure CMThemeChanged(var Message: TLMessage); message CM_THEMECHANGED;
@ -69,15 +69,15 @@ begin
seCheckSumVerify.Lines.BeginUpdate;
try
seCheckSumVerify.Lines.AddObject(rsCheckSumVerifyGeneral, TObject(PtrInt(clWindowText)));
aTotalCount:= Length(VerifyResult.Success) + Length(VerifyResult.ReadError) +
Length(VerifyResult.Broken) + Length(VerifyResult.Missing);
aTotalCount:= VerifyResult.Success.Count + VerifyResult.ReadError.Count +
VerifyResult.Broken.Count + VerifyResult.Missing.Count;
// Add header information
AddHeader(rsCheckSumVerifyTotal, aTotalCount, clWindowText);
AddHeader(rsCheckSumVerifySuccess, Length(VerifyResult.Success), Ord(lmtSuccess));
AddHeader(rsCheckSumVerifyMissing, Length(VerifyResult.Missing), Ord(lmtError));
AddHeader(rsCheckSumVerifyBroken, Length(VerifyResult.Broken), Ord(lmtError));
AddHeader(rsCheckSumVerifyReadError, Length(VerifyResult.ReadError), Ord(lmtError));
AddHeader(rsCheckSumVerifySuccess, VerifyResult.Success.Count, Ord(lmtSuccess));
AddHeader(rsCheckSumVerifyMissing, VerifyResult.Missing.Count, Ord(lmtError));
AddHeader(rsCheckSumVerifyBroken, VerifyResult.Broken.Count, Ord(lmtError));
AddHeader(rsCheckSumVerifyReadError, VerifyResult.ReadError.Count, Ord(lmtError));
// Add broken files
ProcessResult(VerifyResult.Broken, rsCheckSumVerifyBroken, Ord(lmtError));
@ -135,16 +135,16 @@ begin
seCheckSumVerify.Lines.AddObject(#32 + aText + #32 + IntToStr(aCount), TObject(PtrInt(aColor)));
end;
procedure TfrmCheckSumVerify.ProcessResult(const aResult: TDynamicStringArray;
procedure TfrmCheckSumVerify.ProcessResult(const aResult: TStringList;
const aText: String; aColor: TColor);
var
I: Integer;
begin
if Length(aResult) > 0 then
if aResult.Count > 0 then
begin
seCheckSumVerify.Lines.Add(EmptyStr);
seCheckSumVerify.Lines.AddObject(aText, TObject(PtrInt(aColor)));
for I:= Low(aResult) to High(aResult) do
for I:= 0 to aResult.Count - 1 do
begin
seCheckSumVerify.Lines.AddObject(#32 + aResult[I], TObject(PtrInt(aColor)));
end;

View file

@ -272,7 +272,7 @@ begin
except
on EFileNotFound do
begin
AddString(FResult.Missing, FileName);
FResult.Missing.Add(FileName);
end
else
begin
@ -484,13 +484,13 @@ begin
sFileName:= ExtractDirLevel(FFullFilesTree.Path, aFile.Path) + aFile.Name;
if (CheckSumCalc(aFile, sCheckSum) = False) then
AddString(FResult.ReadError, sFileName)
FResult.ReadError.Add(sFileName)
else
begin
if (CompareText(sCheckSum, ExpectedChecksum) = 0) then
AddString(FResult.Success, sFileName)
FResult.Success.Add(sFileName)
else
AddString(FResult.Broken, sFileName);
FResult.Broken.Add(sFileName);
end;
end;

View file

@ -17,11 +17,17 @@ type
TCalcCheckSumOperationMode = (checksum_calc, checksum_verify);
TVerifyChecksumResult = record
Success: TDynamicStringArray;
Broken: TDynamicStringArray;
Missing: TDynamicStringArray;
ReadError: TDynamicStringArray;
{ TVerifyChecksumResult }
TVerifyChecksumResult = class
public
Broken: TStringList;
Success: TStringList;
Missing: TStringList;
ReadError: TStringList;
public
constructor Create;
destructor Destroy; override;
end;
TFileSourceCalcChecksumOperationStatistics = record
@ -56,6 +62,7 @@ type
FAlgorithm: THashAlgorithm;
FOneFile, FSeparateFolder: Boolean;
FOpenFileAfterOperationCompleted: Boolean;
procedure SetMode(AValue: TCalcCheckSumOperationMode);
protected
FResult: TVerifyChecksumResult;
@ -83,7 +90,7 @@ type
function GetDescription(Details: TFileSourceOperationDescriptionDetails): String; override;
function RetrieveStatistics: TFileSourceCalcChecksumOperationStatistics;
property Mode: TCalcCheckSumOperationMode read FMode write FMode;
property Mode: TCalcCheckSumOperationMode read FMode write SetMode;
property Algorithm: THashAlgorithm read FAlgorithm write FAlgorithm;
property OneFile: Boolean read FOneFile write FOneFile;
property SeparateFolder: Boolean read FSeparateFolder write FSeparateFolder;
@ -97,6 +104,27 @@ implementation
uses
uDCUtils, uLng, uShowForm;
{ TVerifyChecksumResult }
constructor TVerifyChecksumResult.Create;
begin
Broken:= TStringList.Create;
Success:= TStringList.Create;
Missing:= TStringList.Create;
ReadError:= TStringList.Create;
end;
destructor TVerifyChecksumResult.Destroy;
begin
inherited Destroy;
Broken.Free;
Success.Free;
Missing.Free;
ReadError.Free;
end;
{ TFileSourceCalcChecksumOperation }
constructor TFileSourceCalcChecksumOperation.Create(
aTargetFileSource: IFileSource;
var theFiles: TFiles;
@ -135,10 +163,9 @@ destructor TFileSourceCalcChecksumOperation.Destroy;
begin
inherited Destroy;
if Assigned(FStatisticsLock) then
FreeAndNil(FStatisticsLock);
if Assigned(FFiles) then
FreeAndNil(FFiles);
FreeAndNil(FStatisticsLock);
FreeAndNil(FResult);
FreeAndNil(FFiles);
end;
function TFileSourceCalcChecksumOperation.GetDescription(Details: TFileSourceOperationDescriptionDetails): String;
@ -173,6 +200,21 @@ begin
end;
end;
procedure TFileSourceCalcChecksumOperation.SetMode(
AValue: TCalcCheckSumOperationMode);
begin
if FMode <> AValue then
begin
if (AValue = checksum_calc) then
FreeAndNil(FResult)
else if (AValue = checksum_verify) then
begin
FResult:= TVerifyChecksumResult.Create;
end;
FMode:= AValue;
end;
end;
function TFileSourceCalcChecksumOperation.GetID: TFileSourceOperationType;
begin
Result := fsoCalcChecksum;