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 2 von 3     12 3      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 20:34
Warum geht dir beim Kopieren was verloren? Du kopierts doch und verschiebst nicht. Und warum Variant als Datentyp für den Buffer? Nimm doch ein Byte-Array oder PByte.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antigo

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

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 21:33
Zitat von sirius:
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?
Oh das mit der 0 war tatsächlich sinnlos. Jetzt siehts so aus:

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

    //Status
    Progressbar1.Position:= 100*i*buffersize div StreamIn.Size;
    label2.caption:=inttostr(i*buffersize) +' / '+ inttostr(Streamin.Size);
    Application.ProcessMessages;
  end;

  if StreamIn.Size mod buffersize > 0 then
    StreamOut.CopyFrom(StreamIn,StreamIn.size mod buffersize);
das kopieren an sich funktioniert generell ja auch, nur läuft es halt nicht so ab wie ich mir das vorstelle.



Zitat von sirius:
Zitat:
Sendest du selber über die Sockets?
Wenn er alles filebasiert macht, dann wohl über den Windows Netzwerk Client
jo so siehts aus



Zitat von Luckie:
Warum geht dir beim Kopieren was verloren? Du kopierts doch und verschiebst nicht. Und warum Variant als Datentyp für den Buffer? Nimm doch ein Byte-Array oder PByte.
Wie kommst du auf verlieren? Hab ich das irgendwo geschrieben?

Warum Variant? Naja aus Ahnungslosigkeit wie mans richtig macht

Aber der buffer ist durch das CopyFrom ja sowieso weggefallen.


Nochmal zu meinem Problem:
Kopiert wird alles vernünftig, nur hab ich wiegesagt den Eindruck, dass das ganze asynchron abläuft, so wie als wenn man etwas über sockets sendet und da zu schnell sachen hintereinander abschickt. Dann werden die ja auch zusammen gefasst.

Eigentlich sollte es halt so sein, dass nach und nach kleine Pakete verschickt werden und die Progressbar nach meinem oben geposteten Quellcode halbwegs gleichmäßig durchlaufen sollte, und der Kopiervorgang auch beendet sein sollte, sobald die Progressbar durch ist. Das ist aber nicht der Fall. Nachdem diese durchgelaufen ist, hängt das Programm und der Netzwerkmonitor (STRG+Alt+Entf unter WinXP) zeigt noch max. Traffic an. Das geht noch einige sek. so weiterm bis die Übertragung dann tatsächlich abgeschlossen ist. sehr merkwürdig das ganze.
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
 
#13

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 21:37
Zitat:
Nachdem diese durchgelaufen ist, hängt das Programm und der Netzwerkmonitor (STRG+Alt+Entf unter WinXP) zeigt noch max. Traffic an. Das geht noch einige sek. so weiterm bis die Übertragung dann tatsächlich abgeschlossen ist. sehr merkwürdig das ganze.
Das liegt daran:
Zitat:
Mit dem letzten
StreamOut.CopyFrom(StreamIn,0);
kopierst du den ganzen Stream nochmal von vorn (das bedeutet die 0).
Du darfst da nicht 0 übergeben, sondern, das was tatsächlich noch kopiert werden muss (irgendwie Stream.Size-Stream.Position)

Und der Rest dürfte problemlos klappen.
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
 
#14

Re: Datei mit TStream kopieren

  Alt 21. Nov 2007, 21:45
den Fehler hab ich ja bereits eingesehen und korrigiert:

Delphi-Quellcode:
  if StreamIn.Size mod buffersize > 0 then
    StreamOut.CopyFrom(StreamIn,StreamIn.size mod buffersize);
Wenn sich also die Dateigröße nicht komplett in n buffersize große Pakte einteilen lässt (was ja sehr wahrscheinlich ist), dann wird zum schluss noch ein kleineres Paket mit dem Rest verschickt. Das sollte aber weniger als eine Sekunde dauern bei der kleinen Buffer größe die ich gewählt habe und keine 10 sek.

Bei meiner Beispieldatei mit 23510720 Byte und einer Puffergröße von 1024 Byte werden damit im letzten schwung 23510720 mod 1024=704 Byte übertragen. Trotzdem muss ich 10 sek warten bis der darunterstehende code die Progressbar auf 100 bringt...
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 Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Datei mit TStream kopieren

  Alt 22. Nov 2007, 08:42
Zitat von Antigo:
Wie kommst du auf verlieren? Hab ich das irgendwo geschrieben?
Zitat von Antigo:
und damit bei einem Verbindungsabbruch nicht alles weg ist
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antigo

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

Re: Datei mit TStream kopieren

  Alt 22. Nov 2007, 10:36
Zitat von Luckie:
Zitat von Antigo:
Wie kommst du auf verlieren? Hab ich das irgendwo geschrieben?
Zitat von Antigo:
und damit bei einem Verbindungsabbruch nicht alles weg ist
Naja ich hab das Problem ständig. Mein WLAN ist nicht so superstabil und gibt gerade dann mal für eine sek. den Geist auf, wenn eine 300MB Datei grad zu 98% übertragen ist (im lokalen Netzwerk).
Wenn ich dann mit den Windows Funktionen am kopieren war, passiert ganz einfach folgendes: Alles ist weg. Und das möchte ich eben verhindern.
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
 
#17

Re: Datei mit TStream kopieren

  Alt 22. Nov 2007, 18:03
Ich krieg das Problem nicht gelöst. Wollte es jetzt nochmal mit Buffer Variablen und den Read und Write Funktionen versuchen. Ausserdem wollte ich jetzt das das von lucki empfohlene Byte Array als Speicher nutzen.

Delphi-Quellcode:
var StreamIn, StreamOut:TStream;
   i,buffersize:integer;
   buffer:array of Byte;
begin
  buffersize:=strtoint(edit3.Text);
  StreamIn := TFileStream.Create(edit1.text,fmOpenRead);
  StreamOut :=TFileStream.Create(edit2.text, fmCreate);

  setlength(buffer,buffersize);
  for i:=1 to floor(StreamIn.Size / buffersize) do
  begin
    StreamIn.Read(buffer,buffersize);
    StreamOut.Write(buffer,buffersize);

    //Status
    Progressbar1.Position:= 100*i*buffersize div StreamIn.Size;
    label2.caption:=inttostr(i*buffersize) +' / '+ inttostr(Streamin.Size);
    Application.ProcessMessages;
  end;

 { if StreamIn.Size mod buffersize > 0 then
    StreamOut.CopyFrom(StreamIn,StreamIn.size mod buffersize); }


  Progressbar1.Position:=100;
  label2.caption:=inttostr(StreamIn.size) +' / '+ inttostr(Streamin.Size);


  StreamIn.Free;
  Streamout.free;

end;
Da schmeisst mich der Compiler aber nach dem ersten Schreibversuch mit einer Zugriffsverletzung raus. Kann jemand helfen?
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
 
#18

Re: Datei mit TStream kopieren

  Alt 22. Nov 2007, 18:11
nimm mal buffer[0] in den Read und Erite Methoden.
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
 
#19

Re: Datei mit TStream kopieren

  Alt 22. Nov 2007, 18:20
jo das funktioniert, auch wenn ich nicht verstehe warum.
Leider hilft das ganze bei meinem Problem überhaupt nicht. Die Schleife wird durchgegangen, die Progressbar geht auf fast 100% und die Anzeige im Label geht auf einen Wert der knapp unter StreamIn.Size / StreamIn.Size liegt. Dann dauerts eine Weile und erst DANN wird der darauf folgende Code
Delphi-Quellcode:
 Progressbar1.Position:=100;
  label2.caption:=inttostr(StreamIn.size) +' / '+ inttostr(Streamin.Size);


  StreamIn.Free;
  Streamout.free;
ausgeführt. Die Übertragung geht bis zu diesem Zeitpunkt weiter. Also ich kann mir das echt nicht erklären. Nach meinen Verständnis dürfte die for Schleife erst dann weitergehen (i erhöhen; von vorne anfangen), wenn der Buffer übertragen und geschrieben wurde. Demenstprechend müsste alles geschrieben sein, wenn die Statusbar auf 100% ist (den kleinen Rest der nicht in buffersize aufgeht hab ich absichtlich mal weggelassen).

Hat noch jemand eine Idee was man versuchen könnte? Gäbs sonst eine andere Methode ausser Streams, eine Datei stückcheinweise zu übertragen/speichern/kopieren?

danke schonmal
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
 
#20

Re: Datei mit TStream kopieren

  Alt 22. Nov 2007, 18:32
Nicht wirklich.

Die delphieigenen Funktionen:
-assignfile
-resetfile
-rewrite
-closefile
arbeiten wie TFileStream / THandleStream sehr direkt über die WinAPI-Funktionen CreateFile, WriteFile, ReadFile und SetFilePointer
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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