![]() |
TFileStream - irgendwie raff ichs net
moin Jungs,
also ich versuche per TFileStream eine Datei einzulesen und wieder zu speichern (ich will später dann noch eine Verschlüsselungsroutine dazusetzten, das kommt dann aber in einen eigenen Thread). Jetzt mach ich das so:
Delphi-Quellcode:
so nur irgendwie kommt manchmal ne Zugriffsverletzung bei Adresse irgendwas oder die Datei wird erstellt nur nichts kopert (0 KB);
function Kopiere(Input,Output: string) : string;
var fs,dest : TFileStream; Buffer : Byte; begin fs := TFileStream.Create(Input, fmReadOnly); fs.Read(Buffer, fs.size); try dest := TFileStream.Create(Output, fmCreate); dest.Write(Buffer, sizeof(Buffer)); finally FreeAndNil(fs); FreeAndNil(dest); end; end; Was hab ich da falsch gemacht ? Ich sitze jetzt schon seit gestern Abend daran das gibts doch net. Hat jemand ein Tut wo alles über Streams(Memory,File,u.s.w.) steht ? Danke !!!! cu Predator |
Re: TFileStream - irgendwie raff ichs net
Delphi-Quellcode:
so solltes gehn.
var
InPutS, OutPutS: TFileStream; Mode: Word; begin InPutS := TFileStream.Create(InPut, fmOpenRead or fmShareDenyNone); if not FileExists(OutPut) then Mode := fmCreate else Mode := fmOpenWrite; OutPutS := TFileStream.Create(OutPut, Mode or fmShareDenyNone); try OutPutS.Position := 0; OutPutS.CopyFrom(InPutS, 0); // Kopiert InPut Datei nach OutPut; // restliche verarbeitung von OutPutS finally OutPutS.Free; InPutS.Free; end; end; mfG mirage228 |
Re: TFileStream - irgendwie raff ichs net
Das reine Kopieren auf eine Schlag nützt ihm nichts, wenn er noch was dazwischen hängen will.
Delphi-Quellcode:
Buffer ist als Pointer deklariert. BlockSize ist eien Konstante, die angibt wie vile jewals gelesen werden soll. Ich habe sie mit 1024 initialisiert.
GetMem(Buffer, 1024);
try // as long as we have not reached the end of the source stream while (SrcStream.Position < SrcStream.Size) do begin // how much to read if SrcStream.Size - SrcStream.Position > BlockSize then Len := BlockSize else Len := SrcStream.Size - SrcStream.Position; // read into the buffer SrcStream.ReadBuffer(Buffer^, Len); // encode the buffer EncodeBuffer(Buffer^, Buffer^, len); // write the buffer DestStream.WriteBuffer(Buffer^, Len); end; finally // clean up the buffer FreeMem(Buffer); end; Das EncodeBuffer ist aus Hagen Reddmanns DEC, dürfte dich erstmal nicht interessieren. |
Re: TFileStream - irgendwie raff ichs net
@Luckie
was ist jetzt wenn ich nicht nur 1024 KB einlesen will sondern die ganze Datei ? z.b: ein 10 MB großes File ? Und wie man ja so schön sagt : Aus Fragen lernt man also:
Delphi-Quellcode:
Was wird da genau gemacht ?
try
// as long as we have not reached the end of the source stream while (SrcStream.Position < SrcStream.Size) do begin // how much to read if SrcStream.Size - SrcStream.Position > BlockSize then Len := BlockSize else Len := SrcStream.Size - SrcStream.Position; // read into the buffer
Delphi-Quellcode:
Was ist der unterschied zwischen readBuffer und Read bzw. WriteBuffer und Write ?
SrcStream.ReadBuffer(Buffer^, Len);
Danke im Voraus. |
Re: TFileStream - irgendwie raff ichs net
Moin Predator,
Antwort auf Frage 1: das ganze ist eine Schleife, die solange 1024er Blöcke verschlüsselt, bis nix mehr von der datei das ist (wenn weniger als 1024 übrig sind, dann nimmt der den Rest) |
Re: TFileStream - irgendwie raff ichs net
Ich dachte der Code ist mit den Kommentaren selbst erklärend. Aber gut.
Als erstes reservieren wir 1024 Byte Speicher. Dann kommt die Schleife, die so lange läuft, bis der Dateizeiger am Ende der Quelldatei angekommen ist. In der Schleife werden 1024 Blöcke gelesen, verschlüssel und wieder geschrieben. Da es nun sein kann, dass die Quelldateigröße kein Vielfaches von 1024 ist, ziehen wir von der Größe der Quelldatei die aktuelle Position ab und kucken so, ob noch 1024 Byte gelesen werden können. Ist dies der Fall werden 1024 Byte gelesen, wenn nicht nur noch so viel, wie übrig ist. |
Re: TFileStream - irgendwie raff ichs net
@Luckie
ich hab den Code jetzt mal in meinen angepasst. Müsste so richtig sien oder ?
Delphi-Quellcode:
hab jetzt mal schnell copy,paste ohne Formatierung kopiert.
function Kopiere(Input, Output: string) : string;
const BlockSize = 1024; var fs: TFileStream; Buffer: Pointer; Len: Integer; dest: TFileStream; begin fs := TFileStream.Create(Input, fmOpenRead); dest := TFileStream.Create(Output, fmCreate); GetMem(Buffer, 1024); try while (fs.Position < fs.Size) do begin if fs.Size - fs.Position > BlockSize then Len := BlockSize else Len := fs.Size - fs.Position; fs.ReadBuffer(Buffer^, Len); dest.WriteBuffer(Buffer^, Len); end; finally FreeMem(Buffer); end; end; Trotzdem ist das File 0 KB. |
Re: TFileStream - irgendwie raff ichs net
sorry hat sich schon erledigt.
der hatte mein Testfile überschrieben beim Fehler deswegen war output auch 0 KB bin ich blöd :wall: :wall: Gibt es irgendwo ein Tutorial bzw. Referenzen zum DEC vom Herrn Reddmann ? |
Re: TFileStream - irgendwie raff ichs net
In dem Thread:
![]() |
Re: TFileStream - irgendwie raff ichs net
ok danke nochwas:
wie kann ich jetzt z.B. am Anfang und ende das noch einfügen ? [START CODE] [END CODE] ??? Habs mit dest.Write versucht aber dann ist der rest nicht komplett. Danke im voraus. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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 by Thomas Breitkreuz