![]() |
Delphi-Version: 7
FileStream to Buffer
Hallo,
Ich habe folgenden Code der schon tut was er soll. Die Funktion HashBuf erwartet einen Buffer und meine Daten kommen aus einem Stream. Ist der Code so in Ordnung oder gibt es andere (bessere) Methoden?
Code:
Grüsse,
procedure TForm1.Button7Click(Sender: TObject);
var DestStr : String; FStream : TFileStream; Size : Integer; Buffer : TBytes; begin FStream := TFileStream.Create(Edit3.Text,fmOpenRead); Size := FStream.Size; SetLength(Buffer, Size); FStream.ReadBuffer(Pointer(Buffer)^, Size); HashBuf( HASH_SHA256, Buffer , Size , DestStr ); Edit2.Text := DestStr; FStream.Free; end; Hans-Peter |
AW: FileStream to Buffer
Hallo Hans-Peter,
es ist wichtig, den PositionsZeiger des Streams vor dem Lesen immer auf die Startposition zu setzen:
Delphi-Quellcode:
Sonst fängt es bei einer undefinierten (zufälligen) Position an, zu lesen.
FStream.Position:= 0;
Gruß, Andreas |
AW: FileStream to Buffer
Hallo,
Danke für den Hinweiss. Sonst ist die Methode die richtige? Grüsse, Hans-Peter |
AW: FileStream to Buffer
Delphi-Quellcode:
ist hier nicht nötig, da nur einmal gelesen wird und zu Beginn, nach dem Create, die Position immer auf 0 steht. (außer beim Append)
Position:=0;
Ja, geht so, so lange die Datei klein genug ist und immer in deinen virtuellen Speicher (2 GB) passt, sonst muß der Buffer kleiner sein und die Datei stückchenweise eingelesen werden. Warum hast du keinen Ressourcenschutzblock verbaut? Und ansonsten gibt es auch Streams, welche direkt einen "Buffer" eingebaut haben, wie z.B. TMemoryStream und TBytesStream (ich glaub erst ab D2009 oder so).
Delphi-Quellcode:
Und wie immer die Frage, warum so ein altes Delphi?
// falls man HashBuf auch mit einem Pointer füttern kann, anstatt TBytes
FStream := TMemoryStream.Create; try FStream.LoadFromFile(Edit3.Text); HashBuf(HASH_SHA256, FStream.Memory, FStream.Size, DestStr); Edit2.Text := DestStr; finally FStream.Free; end; Denn ![]()
Delphi-Quellcode:
.
Edit2.Text := THashSHA2.GetHashStringFromFile(Edit3.Text);
|
AW: FileStream to Buffer
Hallo,
Nochmal Danke für den Tip. >>Warum hast du keinen Ressourcenschutzblock verbaut? Das hatte ich gestern auch schon nachträglich eingebaut. Den TMemorystream-Tip finde ich dann auch noch viel eleganter als meinen Code. Werde testen ob die Hash Funktion das unterstützt. D7 ist notwendig weil es um die Pflege eines umfangreichen Alt-Systems handelt, welches nicht mehr umgetellt werden soll/kann. Tot-gesagte leben halt länger! ;-) Grüsse, Hans-Peter |
AW: FileStream to Buffer
Hallo,
>>Den TMemorystream-Tip finde ich dann auch noch viel eleganter als meinen Code. Werde testen ob die Hash Funktion das unterstützt. Hat funktioniert! ;-) Grüsse, Hans-Peter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz