![]() |
Streams haben "alte Daten"
Hi...
Ich wollte mich mal näher mit Steams auseinandersetzen (hier mit TFilestream) und hab da ein Phänomenbeobachtet, dass ich mir vielleicht sogar erklären kann, jedoch nicht wirklich beheben. Ich lade mehrer Dateien aus unserem IntraNet und speichere sie lokal. Da ich die Daten so "roh" nicht benutzen kann speichere ich sie als "foo.dat" ab, öffne sie an einer anderen Stelle wieder um den einstiegspunkt für meine Kopierroutine zu suchen und kopiere von einem TFileStream in einen anderen, der die Datei auch gleich so benennt, wie diese heissen soll. Danach lösche ich "foo.dat" wieder. Dieser Vorgang wiederholt sich in einer Schleife mehrmals mit unterschiedlichen Dateien. Nun zu meinem Phänomen: Beim zweiten Durchlauf steht in der variablen foo exakt der text der ersten datei, nicht der der neuen, aktuellen Datei... Warum? Bissel Code:
Delphi-Quellcode:
Ich denke mir, dass der Reservierte Platz nicht wieder überschrieben wird, kann das sein? Was kann ich dagegen tun? Ich möchte nochmal anmerken, dass ich noch nicht soooo viel mit Streams gearbeitet hab. Vielleicht auch ein echt dummer fehler von mir...
procedure TForm1.getfile(Host, Source, FileName, Destination: String);
type TFooBytes = array of Byte; var Foo: TFooBytes; ReadStream, WriteStream: TFilestream; i: Integer; Buffer: String; read, found: Boolean; begin {.. Download der Datei und speichern in foo.dat ..} ReadStream:=TFilestream.Create(Destination+'foo.dat', fmOpenRead); setlength(Foo, 25); // in den ersten 25 Zeichen entscheidet sich ob die Datei so gültig ist oder nicht ReadStream.Read(Foo[0], 25); {.. Buffer ermitteln ..} if not found then begin ReadStream.Free; Deletefile(Destination+'foo.dat'); exit; end; Buffer:=trim(Buffer); WriteStream:=TFilestream.Create(Destination+FileName, fmCreate); ReadStream.Seek(ReadStream.Size-StrToInt(Buffer), soFromBeginning); WriteStream.CopyFrom(ReadStream, StrToInt(Buffer)); WriteStream.Free; ReadStream.Free; Deletefile(Destination+'foo.dat'); end; Danke schonmal Toni |
Re: Streams haben "alte Daten"
Gib den Filestream auch mal wieder frei, wenn du damit fertig bist. Ich nehme stark an, dass er noch mit den Daten arbeitet, auf die das FileStream Objekt im Speicher noch verweist.
Ups, hast du ja. Setz den Zeiger besser mit FreeAndNIl noch mal explizit auf nil. |
Re: Streams haben "alte Daten"
FreeAndNil gibt der TFilestream nicht her, oder täsche ich mich???
Hab einiges rumgetestet, hat allerdings nichts verändert. |
Re: Streams haben "alte Daten"
FreeAndNil ist eine Prozedur, guck doch mal in der Hilfe.
|
Re: Streams haben "alte Daten"
Zitat:
*edit* Warum kommt dieser rote Kasten nur wann er will? |
Re: Streams haben "alte Daten"
:oops: Hätte schwören können, dass es ne Methode ist - bin schon ganz wusig :roteyes: ...
Okay... hat nix gebracht... |
Re: Streams haben "alte Daten"
Zitat:
Unter Last wird es Dir auf verschiedenen Windows-Versionen immer wieder passieren, dass nach einem DeleteFile() die Datei noch nicht gelöscht ist obwohl die API-Funktion wieder zurückkehrt. ps: schreibe Dir am besten eine Klasse welche alle drei Pfade kennt (IntraNet, Temp, Ziel) und die Kopieraktionen ausführt. |
Re: Streams haben "alte Daten"
Schlägt DeleteFile eventuell fehl und du arbeitest immer mit der gleichen Datei?
|
Re: Streams haben "alte Daten"
Nö, im debugger genau nachvollzogen... In Foo.Dat steht genau was es soll...
[Edit] Ich hab auch nach dem Löschen der Datei eine Fehlermeldung ausgeben lassen falls die Datei dann doch noch existiert und sie nie gesehen...[/Edit] |
Re: Streams haben "alte Daten"
Hast Du schon den Rückgabewert von TFileStream.Read überprüft?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 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