(Gast)
n/a Beiträge
|
Re: FileClose und CloseFile schliesst Datei nicht?
28. Jul 2005, 19:07
Zur Zeit kann ich dir nur mit Assignfile dienen, die anderen habe ich nicht gesichert.
Delphi-Quellcode:
function TMD5Form.FileScan(const FileName: String): String;
const MAX_Buffer = 2048;
var AFile: File;
var i, ActSize, FSize, BufferSize, Blocks, Last: Integer;
var Buffer: Array[1..MAX_Buffer] of Byte; // Datenpuffer
var Context: MD5Context;
var Dig: MD5Digest;
var f, c: Extended;
begin
c := 0;
ActSize := 0;
if FileExists(FileName) then
begin
AssignFile(AFile, FileName);
FileMode := fmOpenRead or fmShareDenyNone;
{$i-}
Reset(AFile, 1);
{$i+}
if IOResult = 0 then
begin // Datei konnte geöffnet werden
MD5Init(Context);
try
FSize := FileSize(AFile); // Dateigröße in Byte
if FSize <> 0 then
begin
Panel.Visible := True;
OKBtn.Enabled := False;
UserEdit.Enabled := False;
Blocks := FSize div MAX_Buffer; // Anzahl max. Blöcke
Last := FSize mod MAX_Buffer; // Größe des Rest-Puffer
if Last <> 0 then
inc(Blocks); // sofern, unser Restpuffer ungleich 0 Byte groß ist, wird unsere Blockvariable um 1 erhöht
f := 100 / Blocks;
for i := 0 to Blocks -1 do // Blöcke einlesen
begin
if CancelProcess then
Break;
Seek(AFile, ActSize); // Start-Position in Byte (wird von Block zu Block angepasst)
inc(ActSize, MAX_Buffer);
if ActSize <= FSize then
BufferSize := MAX_Buffer else
BufferSize := Last;
c := c + f;
ProgressBar.Position := Round(c);
Application.ProcessMessages;
BlockRead(AFile, Buffer[1], BufferSize);
MD5Update(Context, @Buffer, BufferSize);
end;
end;
finally
CloseFile(AFile);
Panel.Visible := False;
OKBtn.Enabled := True;
UserEdit.Enabled := True;
end;
if CancelProcess then
Result := '' else
begin
MD5Final(Context, Dig);
Result := MD5Print(Dig);
end;
end;
end;
end;
|
|
Zitat
|