Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Datei übertragen per BlockRead/Write (https://www.delphipraxis.net/5834-datei-uebertragen-per-blockread-write.html)

iaby 20. Jun 2003 15:47


Datei übertragen per BlockRead/Write
 
hallo zusammen!

zuerst mal wieso:
ich will eine datei übers netz übertragen, allerdings langsam, damit im hintergrund noch schön ein CS-Server laufen kann(ohne Lag!). deshalb will ich das so umständlich machen!
bis jetzt hab ich das immer mir readln/writeln gemacht, da kann ich aber nur textfiles mit schreiben, da bei den anderen dateien das "enter" zu spät oder gar nicht kommt, und die zeile somit zu lange ist!
deshalb wollte ich die datei nun in kleinen stücken übertrage. lokal hat das auch schon geklappt, allerdings im netz nich (I/O fehler). ich hab von den befehlen keinen plan!, denke aber, dass ich noch mehr informationen übertragen muss!
hier mal das beispiel aus der delphi-hilfe, das ich für server/client umgeschrieben habe:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var FromF, ToF: file;
    NumRead, NumWritten: Integer;
    Buf: array[1..2048] of Char;
begin
if OpenDialog1.Execute then    { Display Open dialog box }
  begin
  AssignFile(FromF, OpenDialog1.FileName);
  Reset(FromF, 1);   { Record size = 1 }
  if SaveDialog1.Execute then     { Display Save dialog box}
    begin
    AssignFile(ToF, SaveDialog1.FileName);   { Open output file }
    Rewrite(ToF, 1);   { Record size = 1 }
    Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
       + ' bytes...');
    repeat
      BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
      BlockWrite(ToF, Buf, NumRead, NumWritten);
    until (NumRead = 0) or (NumWritten <> NumRead);
    CloseFile(FromF);
    CloseFile(ToF);
    end;
  end;
end;
ich denke, dass ich auch das "NumRead" übertragen muss, oder?
bloß wie soll ich das machen, oder brauch ich es gar nicht?
der server soll nun also lesen, dann verschicken(als string!) und der client schreibt das dann wieder in eine datei. kann mir da jemand helfen?
ich wäre euch suuuper dankbar, weil ich da echt grad verzweifle :(
gruss,
iaby

iaby 20. Jun 2003 19:49

oder könnt ihr mir sagen, wie ich den array of char (als string versendet) wieder in einen array of char umwandeln kann? das würde mir glaube ich auch schon viel helfen!
der array wird soviel ich gesehen hab in mehrere strings verteilt, die ich dann alle einzeln empfange
gruss

Tiefflieger 20. Jun 2003 20:53

hab zwar kein plan von delphi in verbindung mit internet, aber strings sind doch ein array of char...? :?:

Hansa 20. Jun 2003 20:57

Wo willst Du was in welcher Weise wofür wohin hinschicken :?: Und wo ist der Fehler?

Christian Seehase 20. Jun 2003 20:58

Moin iaby,

zu den Block Befehlen fällt mir leider auch kein rechter Tip ein, da ich schon seit langem für so etwas TFileStream benutze, aber könntest Du das nicht auch mit den Indys machen?

Hansa 20. Jun 2003 21:12

Zitat:

Zitat von Tiefflieger
hab zwar kein plan von delphi in verbindung mit internet, aber strings sind doch ein array of char...? :?:

So ungefähr, aber nicht ganz. Das Längenbyte ist der Unterschied.

Christian Seehase 20. Jun 2003 21:15

Moin Hansa,

das Längenbyte gibt's nur bei den ShortStrings bis maximal 255 Byte Länge. Die üblichen HugeStrings haben vor den Daten noch ein 32 Bit grosses Längenfeld (integer) und davor einen 4 Byte grossen Referenzzähler.

iaby 21. Jun 2003 08:39

dasa problem ist, dass wenn ich ein textfile einlese, dass so aussieht
Code:
Zeile1
Zeile2
Zeile3
Zeile4
...
und das als string verschicke, bekomme ich am client nacheinander zeile1, dann zeile2, zeile3, ...
ich will allerdings alle eingelesenen zeilen auf einmal, auch wenn sie durch ein "enter" getrennt sind!
oder kann mir jemand sagen, wie ich dann nur zeile eins schreiben kann?
ich habs mal so probiert
Code:
BlockWrite(file, msg, length(msg), NumWritten)
funktioniert allerdings nicht :(
gruss

Christian Seehase 21. Jun 2003 14:25

Moin iaby,

mit TFileStream sähe das z.B. so aus:

Delphi-Quellcode:
var
  fs  : TFileStream;
  sBuf : string;

begin
  fs := TFileStream.Create('Pfad und Name der zu lesenden Datei', fmOpenRead);
  try
    // Platz reservieren
    sBuf := StringOfChar(#32,fs.Size);
    // Datei einlesen
    fs.Read(sBuf[1],fs.Size);
  finally
    FreeAndNil(fs);
  end;
  fs := TFileStream.Create('Pfad und Name der zu schreibenden Datei',fmCreate or fmOpenWrite);
  try
    fs.Write(sBuf[1],length(sBuf));
  finally
    FreeAndNil(fs);
  end;
end;
Sollte die Datei gross sein, kann man auch zwei Filestreams benutzen, und dann "häppchenweise" lesen und schreiben.

iaby 21. Jun 2003 16:23

sieht einfacher aus als das andere, abe wie gesagt, sollen die dateien langsam übertragen werden(zb nach jeder zeile sleep(5))

ich glaube mir ist zur zeit auch schon gut damit geholfen, wenn ich weiß, wie ich einen ganz normalen string(der glaube ich durch ein return abgeschlossen ist) per blockwrite schreiben kann. bei mir kommt da immer nur nicht darstellbare zeichen raus!
also so irgend etwas:
Code:
blockwrite(datei, zeile, length(zeile));
dieses beispiel geht allerdings nicht!
kann mir da jemand helfen, dürfte ja eigentlich nicht schwer sein, einen string zu schreiben!?
gruss,
iaby


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.
Seite 1 von 2  1 2      

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