AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Datei übertragen per BlockRead/Write
Thema durchsuchen
Ansicht
Themen-Optionen

Datei übertragen per BlockRead/Write

Ein Thema von iaby · begonnen am 20. Jun 2003 · letzter Beitrag vom 24. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#1

Datei übertragen per BlockRead/Write

  Alt 20. Jun 2003, 16:47
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
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#2
  Alt 20. Jun 2003, 20: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
  Mit Zitat antworten Zitat
Tiefflieger

Registriert seit: 20. Mai 2003
18 Beiträge
 
Delphi 6 Personal
 
#3
  Alt 20. Jun 2003, 21:53
hab zwar kein plan von delphi in verbindung mit internet, aber strings sind doch ein array of char...?
Irren ist menschlich.
Aber wenn man richtig Mist bauen will, braucht man einen Computer.

Dan Rather, CBS-Fernsehreporter
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4
  Alt 20. Jun 2003, 21:57
Wo willst Du was in welcher Weise wofür wohin hinschicken Und wo ist der Fehler?
Gruß
Hansa
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 20. Jun 2003, 21: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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6
  Alt 20. Jun 2003, 22:12
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 20. Jun 2003, 22: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#8
  Alt 21. Jun 2003, 09: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 21. Jun 2003, 15: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#10
  Alt 21. Jun 2003, 17: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
  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 00:24 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