Entwickler-Ecke

Internet / Netzwerk - txt Datei von Server laden und auslesen ohne zu speichern


hitmiccs - Mo 29.12.08 18:59
Titel: txt Datei von Server laden und auslesen ohne zu speichern
Hallo Freunde,

ich hab ein mittlegroßes Problem mit dem laden und auslesen einer Textdatei von meinem Server. Folgendes will ich gerne verwirklichen:

- Datei wird geladen
- Datei wird NICHT auf der Festplatte des Benutzers zwischengespeichert sondern ->
- der Inhalt der Datei wird in eine Variable (?) geladen und dann wie eine echte Datei ausgelesen

Herunterladen tue ich die Datei derzeit mit URLDownloadToFile, was sie mir aber auf dem PC speichert. Da ich aber umgehen will, dass der Ablauf des Programms an irgendwelchen Schreibvorgängen hängt, wollte ich die Datei jetzt nur in den Speichern laden, ohne sie auf die HDD zu schreiben und dann weiter damit arbeiten.

Wie kann ich das machen?

Grüße,
hitmiccs


jaenicke - Mo 29.12.08 19:02

Nimm TIdHttp, als Parameter der Methode Get kannst du einen Stream angeben, in den das Ergebnis geschrieben werden soll, also z.B. einen TMemoryStream.


hitmiccs - Fr 02.01.09 02:56

Hallo und erstmal ein frohes Neues an alle hier!

Ich habe das mit dem Stream versucht, allerdings hatte ich vorher noch nie was mit Streams gemacht, so steh ich auch jetzt etwas auf dem Schlauch.

Ich habe den Inhalt der Txt-Datei nicht in einen Stream sondern per Http.Get in einen String geschrieben, also per


Quelltext
1:
2:
3:
var str_variable: string;

str_variable := HTTP.Get('http://www.urlundsoweiter.de/list.txt');


Diese Txt-Datei enthält einige Zeilen mit Zeilenumbrüchen, die dann in dem String wie folgt dargestellt werden:

Eintrag1#$D#$AEintrag2#$D#$AEintrag3 und so weiter

Das dies die Steuercodes für Carriage Return und Line Feed sind, hab ich inzwischen rausgefunden. Was ich allerdings nicht rausgefunden habe, wenn ich den String verändert habe, will ich ihn auch wieder hochladen und die exisitierende Datei dabei überschreiben.

Mein String sieht also nach der Änderung wieder aus wie oben und hat den neuen Eintrag angehängt - jetzt will ich das ganze per http://FTP.Put wieder hochschieben. Dabei brauche ich aber einen Stream, der den String beinhaltet.

Wie bekomme ich den String also in den Stream um ihn so hochladen zu können?
Ich habe versuch mit


Quelltext
1:
2:
3:
str_stream: TStream

str_stream := str_stream.Create(str_variable)


einen Stream zu erzeugen - das passiert auch scheinbar ohne Fehler, nur leider scheint im Stream nicht genau der String enthalten zu sein, da der neue String nicht so aussieht wie gewünscht.

Was mache ich falsch?


JayEff - Fr 02.01.09 03:06

3 Dinge:
a) du benutzt keine [delphi][/delphi] tags.
b) nimm doch einen TStringStream
c) du musst der variable eine Instanz der klasse zuweisen, nicht sich selbst:

Delphi-Quelltext
1:
aStream := TStringStream.Create('asd');                    

;)

edit: was genau heißt "nicht wie gewünscht" hier?
user profile iconhitmiccs hat folgendes geschrieben Zum zitierten Posting springen:
nur leider scheint im Stream nicht genau der String enthalten zu sein, da der neue String nicht so aussieht wie gewünscht.


Sollen die #$D#$A wieder eine neue zeile sein? Dafür hilft

Delphi-Quelltext
1:
x := StringReplace(x, '#$D#$A'#13#10, [rfReplaceAll]);                    


jaenicke - Fr 02.01.09 03:07


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  MyData: TMemoryStream;
begin
  ...
  MyData := TMemoryStream.Create;
  HTTP.Get('http://www.urlundsoweiter.de/list.txt', MyData);
  
  // Jetzt was mit den Daten machen...
  MyData.Position := 0;
  ...

  MyData.Free;
Wo ist da das Problem? ;-)
Fehlerbehandlung usw. hab ich mal weggelassen.


Yogu - Sa 03.01.09 00:32

Wenn du noch nichts mit Streams gemacht hast, dann hilft dir vielleicht folgender Ansatz (basierend auf user profile iconjaenickes Code):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  MyData: TMemoryStream;
  FileAsStr: String;
begin
  ...
  MyData := TMemoryStream.Create;
  try
    HTTP.Get('http://www.urlundsoweiter.de/list.txt', MyData);
  
    // An den Anfang der Datei gehen
    MyData.Position := 0;

    // Die Größe der String-Variable setzen
    SetLength(FileAsStr, MyData.Size);

    // Den Stream im String speichern
    MyData.Read(PChar(FileAsStr)^, Length(FileAsstr));
  finally
    MyData.Free;
  end;
end;

Fehlerbehandlung usw. hab ich mal ansatzweise hinzugefügt ;)


hitmiccs - Sa 03.01.09 01:15

Okay, ich danke euch. Ich habe mit den Streams etwas gespielt und es hat dann funktioniert :) Kann geschlossen werden.

Gruß,
hitmiccs