unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Math, System.Hash, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;
type
TForm1 = class( TForm )
Memo1 : TMemo;
Button1 : TButton;
OpenDialog1 : TOpenDialog;
ProgressBar1 : TProgressBar;
procedure Button1Click( Sender : TObject );
procedure FormCreate( Sender : TObject );
private
{ Private declarations }
function GetChumMd5( const fName : string ) : string;
public
{ Public declarations }
end;
var
Form1 : TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.Button1Click( Sender : TObject );
var
fName : string;
begin
if OpenDialog1.Execute then
begin
fName := OpenDialog1.FileName;
// Edit1.Text := fName;
Memo1.Lines.Add( fName );
Memo1.Lines.Add( GetChumMd5( fName ) );
end;
end;
procedure TForm1.FormCreate( Sender : TObject );
begin
Memo1.Lines.Clear;
ProgressBar1.Min := 0;
ProgressBar1.Max := 100;
end;
function TForm1.GetChumMd5( const fName : string ) : string;
var
md5 : THashMD5;
fileStream : TFileStream;
buf : TBytes;
bufSize, i : Integer;
begin
md5 := THashMD5.Create;
fileStream := TFileStream.Create( fName, fmOpenRead );
try
fileStream.Position := 0;
bufSize := 1024 * 1024 ; // 1M 缓冲区大小
while fileStream.Position < fileStream.Size do
begin
if fileStream.Position + bufSize > fileStream.Size then
bufSize := fileStream.Size - fileStream.Position;
SetLength( buf, bufSize );
fileStream.ReadBuffer( Pointer( buf )^, bufSize );
md5.Update( buf, bufSize );
//
i := Trunc( ( fileStream.Position / fileStream.Size ) * 100 );
ProgressBar1.Position := i;
Application.ProcessMessages;
end;
Result := md5.HashAsString.ToUpper;
finally
fileStream.Free;
end;
end;
end.
在Delphi Berlin上测试通过。