AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Streams haben "alte Daten"

Ein Thema von Tonic1024 · begonnen am 28. Jun 2005 · letzter Beitrag vom 28. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#1

Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:12
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
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:15
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:32
FreeAndNil gibt der TFilestream nicht her, oder täsche ich mich???

Hab einiges rumgetestet, hat allerdings nichts verändert.
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:34
FreeAndNil ist eine Prozedur, guck doch mal in der Hilfe.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#5

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:35
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?
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:40
Hätte schwören können, dass es ne Methode ist - bin schon ganz wusig ...

Okay... hat nix gebracht...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:42
Schlägt DeleteFile eventuell fehl und du arbeitest immer mit der gleichen Datei?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#9

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:44
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]
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#10

Re: Streams haben "alte Daten"

  Alt 28. Jun 2005, 11:50
Hast Du schon den Rückgabewert von TFileStream.Read überprüft?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz