AGB  ·  Datenschutz  ·  Impressum  







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

Datei mit TStream kopieren

Ein Thema von Antigo · begonnen am 21. Nov 2007 · letzter Beitrag vom 24. Nov 2007
Antwort Antwort
Seite 1 von 3  1 23      
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#1

Datei mit TStream kopieren

  Alt 21. Nov 2007, 18:38
Hi,
Ich möchte gern eine Datei per TFilestream einlesen und dann wiederrum per Tfilestream auch wieder speichern. Im Endeffekt möchte ich auf diese Weise eine Datei übers Netzwerk kopieren und damit bei einem Verbindungsabbruch nicht alles weg ist möchte ich die Datei stückchenweise rüberschicken.
Also Datei öffnen, die ersten XX Bytes lesen und auf der Netzwerkfreigabe speichern. Die nächsten XX Bytes lesen, speichern usw. Wenn jetzt die Verbindung abbricht mache ich nach wiederherstellung derselbigen einfach da weiter wo ich aufgehört habe. Soweit die Theorie.

Also hab ich mir gedacht ich definiere erstmal einen Puffer vom Typ Variant weil ich ja keine Ahnung hab was für Daten kommen und es mich ja auch nicht interessiert, ich muss es ja nur kurz zwischenspeichern. Als nächstes öffne ich einen Input und einen Output Stream.

Delphi-Quellcode:
var StreamIn, StreamOut:TStream;
   i,buffersize:integer;
   buffer:Variant;
begin
  buffersize:=strtoint(edit3.text);
  StreamIn := TFileStream.Create(edit1.text,fmOpenRead);
  StreamOut := TFileStream.Create(edit2.text, fmCreate);
so jetzt möchte ich solange immer wieder den puffer lesen und schreiben bis ich fertig bi
Delphi-Quellcode:
  for i:=1 to StreamIn.Size div buffersize do
  begin
    StreamIn.ReadBuffer(buffer,buffersize);
    StreamOut.WriteBuffer(buffer,buffersize);
  end;
  StreamIn.Free;
  Streamout.free;

Wenn ich das so mache kopiert er die datei einwandfrei (buffersize=1 erstmal) aber gibt folgende Fehlermeldung aus: Ungültiger Variant Typ.

Per Einzelanweisung hab ich dann herausgefunden, das der Fehler erst dann ausgegeben wird, wenn alles kopiert wurde, auch wenn ich bspw nur 10 bytes übertrage...
weiss jemand wo der fehler liegt? Ist der Ansatz an sich vielleicht schon kappes?

Dank schonmal im vorraus
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 18:43
Schau mal nach "CopyFrom"
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#3

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 18:46
Super, Ich danke dir
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#4

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 19:06
Jetzt hab ich doch noch ein Problem.

Und zwar scheint es mir so, dass er die vielen CopyFrom Aufträge zusammen fasst und dann gemeinsam verschickt. Ich hab jedenfalls mal einen 1 MB Puffer eingestellt und eine 20MB Datei über wlan kopiert. Nach jedem Copy From sollte er beep;en. Jetzt kommen allerdings direkt am Anfang jede menge beeps, dann werden die Intervalle zwischen den beeps etwas größer und das Programm steht still. Gucke ich mir jetzt den Netzwerk Traffic an hab ich volle Auslastung.
Ich möchte aber nicht alles sammeln und dann schicken, sondern eben Päckchenweise. Weiss jemand wie ich darauf warten kann, dass der eine CopyFrom Befehl abgearbeitet wurde? Erst dann will ich den nächsten starten (auch wenns Zeit kostet).
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#5

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 19:12
Also ich glaube du hast da noch nen bug drinnen ... zeig mal bissi code

Lies dir vorallem die hilfe über CopyFrom genau durch
Des ist glaub ich der wichtigste satz:
Zitat:
CopyFrom kopiert die in Count angegebene Anzahl Bytes aus dem in Source angegebenen Stream in den Stream. Dann verschiebt es die aktuelle Position um die in Count angegebene Anzahl Bytes und gibt die Anzahl der kopierten Bytes zurück.
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 19:12
Copyfrom arbeitet sicherlich nicht parallel. Was machst du denn genau mit WLAN?
Delphi-Quellcode:
var StreamIn, StreamOut:TStream;
begin

  StreamIn := TFileStream.Create(edit1.text,fmOpenRead);
  StreamOut := TFileStream.Create(edit2.text, fmCreate);

  StreamOut.CopyFrom(StreamIn,0);

  StreamIn.free;
  StreamOut.free;
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antigo

Registriert seit: 14. Mär 2005
274 Beiträge
 
#7

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 19:21
Ich mache genau das, was du gepostet hast, nur in Einzelschritten

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var StreamIn, StreamOut:TStream;
   i,buffersize:integer;
   buffer:Variant;
begin
  buffersize:=strtoint(edit3.Text);
  StreamIn := TFileStream.Create(edit1.text,fmOpenRead);
  StreamOut :=TFileStream.Create(edit2.text, fmCreate);


  for i:=1 to floor(StreamIn.Size / buffersize) do
  begin
    StreamOut.CopyFrom(StreamIn,buffersize);
    beep;

    //Status
    if i mod 4 = 0 then
    begin
      Progressbar1.Position:= 100*i*buffersize div StreamIn.Size;
      Application.ProcessMessages;
    end;
  end;
  
  //Rest der datei
  if StreamIn.Size mod buffersize > 0 then
    StreamOut.CopyFrom(StreamIn,0);

  StreamIn.Free;
  Streamout.free;

end;
Jedenfalls beept es wie gesagt am anfang ganz oft und die Progressbar schnellt nach vorne und dann gehts immer langsamer bis das Programm hängt...


Und zum WLAN: ich kopier einfach nur eine datei auf eine Netzwerkfreigabe, über wlan halt, welches sehr langsam ist (600kByte/s)
Michael
"How should I know if it works? That's what beta testers are for. I only coded it."
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 19:29
Mit dem letzten
StreamOut.CopyFrom(StreamIn,0);
kopierst du den ganzen Stream nochmal von vorn (das bedeutet die 0).

Aber was davor passiert weis ich auch nicht.
Probier es mal so, wie ich es getan habe. Klappt es dann?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 20:03
Sendest du selber über die Sockets?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 20:08
Zitat:
Sendest du selber über die Sockets?
Wenn er alles filebasiert macht, dann wohl über den Windows Netzwerk Client
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 13:12 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