Autor Beitrag
hitmiccs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Mo 29.12.08 18:59 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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:
ausblenden 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
ausblenden Delphi-Quelltext
1:
x := StringReplace(x, '#$D#$A'#13#10, [rfReplaceAll]);					

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.


Zuletzt bearbeitet von JayEff am Fr 02.01.09 03:12, insgesamt 3-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 02.01.09 03:07 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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):

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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