获取文件MD5值

来源:互联网 发布:淘宝网点不开旺旺 编辑:程序博客网 时间:2024/04/29 23:33
unit Unit1;interfaceuses  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上测试通过。
0 0
原创粉丝点击