Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Streams haben "alte Daten" (https://www.delphipraxis.net/48632-streams-haben-alte-daten.html)

Tonic1024 28. Jun 2005 12:12


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:
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;
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...


Danke schonmal

Toni

Luckie 28. Jun 2005 12:15

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.

Tonic1024 28. Jun 2005 12:32

Re: Streams haben "alte Daten"
 
FreeAndNil gibt der TFilestream nicht her, oder täsche ich mich???

Hab einiges rumgetestet, hat allerdings nichts verändert.

Luckie 28. Jun 2005 12:34

Re: Streams haben "alte Daten"
 
FreeAndNil ist eine Prozedur, guck doch mal in der Hilfe.

Treffnix 28. Jun 2005 12:35

Re: Streams haben "alte Daten"
 
Zitat:

Zitat von Tonic1024
FreeAndNil gibt der TFilestream nicht her, oder täsche ich mich???

Da täuscht du dich. FreeAndNil ist eine Funktion, die nichts anderes macht als .Free aufzurufen und danach den Zeiger auf nil zu setzen. Obs allerdings was bringt weiss ich auch nicht....

*edit* Warum kommt dieser rote Kasten nur wann er will?

Tonic1024 28. Jun 2005 12:40

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...

NicoDE 28. Jun 2005 12:41

Re: Streams haben "alte Daten"
 
Zitat:

Zitat von Tonic1024
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.

Nimm keinen hart-codierten Dateinamen für die temporäre Datei (sondern dynamische Dateinamen, die WinAPI bietet GetTempPath/GetTempFileName).
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.

Luckie 28. Jun 2005 12:42

Re: Streams haben "alte Daten"
 
Schlägt DeleteFile eventuell fehl und du arbeitest immer mit der gleichen Datei?

Tonic1024 28. Jun 2005 12:44

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]

NicoDE 28. Jun 2005 12:50

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.
Seite 1 von 2  1 2      

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