Datei kopieren mit variabler Paketgrösse
-
Hallo Forum-Nutzer
Ich denke, mein Problem ist in wenigen Zeilen Code gelöst. Nur
bin ich leider newbie und hab mich schon halb zu tode gegooglet - und bin nicht fündig geworden.Benötigt wird eine Kopier-Routine, welche ein binäres File
von A nach B kopiert. Dazu muss die Paket-Grösse definiert
werden können (in Bytes, z.B. 128Bytes).Also etwa in diesen Strukturen:
until EOF
if exist file1 then resume
read(file1, 128Bytes), write(file2, 128bytes), delay(100ms)
usw.Zusätzlich muss ein Delay (in ms) zwischen den Lese- bzw. Schreib-
vorgängen definiert werden können (z.B. 100ms)Folglich würden 1280 Bytes/s (100ms * 10 * 128Bytes) von A nach B übertragen.
Eine Resume-Funktion muss vorhanden sein, wenn ein Transfer abbricht, dann mit der Grösse der schon kopierten Partei als Variable für z.B. ein fseek auf dem Original File weitertransferiert werden kann.
Folgende Parameter müssen über die Kommandozeile aufgerufen werden können:
-sourcefile; -destinationfile; -msGAP -PacketsizeIch wäre wirklich um eure Unterstützung sehr dankbar!
Gruss aus der Schweiz
Martin
-
Hallo,
das hoert sich mir sehr nach Hausaufgaben an. I.d.R. machen wir hier aber keine
Hausaufgaben fuer andere. Was hast du denn schon gemacht? Welchen Code hast
du bereits geschrieben?Eine delay-Funktion gibt es in Standard-C++ meines Wissens nach nicht, hier
muesstest du dir was eigenes basteln oder auf eine entsprechende Funktion,
welche unter deinem OS bereitgestellt wird, zurueckgreifen.Ansonsten hast du mit deinem Pseudocode doch schon hervorragend gezeigt, wie
du vorgehen musst. Den Resume zu machen, duefte nicht so schwer sein, wenn
ein Transfer abbricht, dann gibt die Laenge des Destinationfile dir an, ab
welchem Offset du im Sourcefile "resumen" musst.Schau dir mal in der Doku deiner Wahl die Klassen ofstream, ifstream und/oder
fstream an. Die bieten dir alles, was du fuer dein Problem benoetigst (ausser
das mit dem Delay).Vielleicht Postest du mal, was du schon hast.
mfg
v R
-
Hi V.R.
Erstmal vielen Dank für die prompte Antwort. Das mit den 'Hausaufgaben' verstehe ich natürlich voll und ganz.
Ich habe das ganze in VBScript eigentlich schon ganz toll hinbekommen (bis auf die einte Sache: Nur habe ich das Problem, dass wenn ich beim Resume zum Offset vom Source-File gehen möchte, dass er mir über die 64kbit Leitung bis zum gewünschten Offset hin sämtliche Bytes liest und discardet. Somit ist bei einigen MB die Leitung zu für den restlichen Traffic. So dachte ich mir, dass C++ dies anders handelt und bei einem fseek oder ähnlich nicht zuerst das ganze File durchwühlt bzw. in Memory überträgt - ist diese Annahme von mir korrekt? Wie gesagt, das ist meine Entscheidungsfrag für das Problem überhaupt, ob es den lösbar ist!
In C++ Code kann ich leider noch nichts aufweisen, denn seit zwei Tagen bring ich es bereits hin Files lesen und schreiben.
Vielen Dank schon im Vorraus für die Antwort
Martin
-
Also den Offset, an welchem du mit dem Lesen erneut beginnen musst, den kann
dir nur der Client liefern, sprich die hast du ja auf jeden Fall. Gehen wir mal
ein kleines Beispiel durch:Wir haben zwei Clients A und B. Datei xyz wird uebertragen:
A ----xyz----> B
Es sind 200byte uebertragen wurden, durch irgendwas unglueckliches, wurde
die Verbindung zurueckgesetzt. Nun baust du die Verbindung erneut auf, es
wird festgestellt, dass du die Datei bereits auf der Festplatte hast. Um
nun Client A mitteilen zu koennen, ab wo er dir die Daten liefern soll, musst
du deine Datei oeffnen und an das Ende springen. Dann liesst du die Anzahl
Bytes aus, welche sich bereits in der Datei befinden, diese sind auch gleich
deinem Offset, welche du dem Client A uebermitteln musst.Um die Dateigroesse zu erfahren, kannst du folgenden Code nutzen:
std::ofstream fileOut("xyz"); fileOut.seekp(std::ios_base::end, 0); //ans ende der datei springen std::basic_ostream::pos_type offset = fileOut.tellp(); //groesse der datei
ab offset + 1 muss Client A nun in der Datei weiterlesen und dir die Daten
zuschicken. Das Positionieren innerhalb der Datei, geschiet auf dem Client
A, dazu muss nichts ueber die Leitung uebertragen werden.mfg
v R
-
Re v.R.
Du hast den Nagel direkt auf den Kopf getroffen. Es ging mir um die Antwort auf die Frage, ob beim Setzen des Offset's sämtliche Bytes bis zum gwünschten Offset erneut übertragen werden müssen (ist in VBScript wie gesagt leider der Fall).
Danke für das Snippet mit der FileGrösse, das hatte ich jedoch bereits als Code gefunden.
Vermutlich jedoch werde ich am ganzen Syntax scheitern und die 'Aufgabe' sterben lassen müssen, da ich einfach zu viel Zeit benötigen würde. Schade, aber trotzdem vielen Dank für die Hilfe!
Grüsse aus der Schweiz
Martin
-
Naja, die Syntax wird wohl weniger das Problem sein. Du benoetigst halt noch
die Netzwerk-API deines OS, damit du die Datei auch uebertragen kannst.Kann man denn mit VBScript nicht auch innerhalb einer Datei einen "Lesezeiger"
positionieren?mfg
v R
-
virtuell Realisticer schrieb:
Naja, die Syntax wird wohl weniger das Problem sein. Du benoetigst halt noch
die Netzwerk-API deines OS, damit du die Datei auch uebertragen kannst.Kann man denn mit VBScript nicht auch innerhalb einer Datei einen "Lesezeiger"
positionieren?mfg
v RZum erste Abschnitt: Also jetzt verstehe ich die Aussage nicht mehr. Wird beim durchführen eines Fileseek (z.B. auf einer Datei an einem gemappten Laufwerk) wirklich keine Daten übermittelt? Wenn ich auf die entfernte Datei einen fseek mache vielleicht auf das fünfte MB der Datei?
Zum zweiten Abschnitt:
In VBScript geht das schon, der Zähler läuft auch schön mit wenn man entsprechend Bytes rausliest.
Nur beim Resume ist das Problem; Willst Du einen Zähler setzen (eben z.B. auf eine entfernte Datei an einer dünnen Leitung), dann gibt es zwei Varianten. Du liest die entsprechenden Bytes bis zum gewünschten Offset aus und ignorierst diese (sämtliche Bytes werden so übertragen) oder
[jetzt wirds STRANGE!]
du benutzt die Funktion 'Skip', das den Zeiger an ein bestimmtes Offset setzt. NUR das Problem dabei ist, dass dieses Skip gar kein Skip ist, sondern eine verar***ung -> denn es werden bis zum Offset sämtliche Bytes nochmals ausgelesen.Ui, ist meine Formulierung noch verständlich ? Sorry ich habe mich da so tief reingebeugt und bin echt am Boden zerstört über dieses Problem. Und wenn Du mir jetzt noch sagst, dass mit C++ es auch so ist, dann bin ich noch zerstörter.. 8-/
Ich hoffe ganz fest auf eine positive Antwort
lg
Martin
-
Hallo,
also ich habe das mal grad mit einer 33MB Datei ausprobiert, die auf einem
anderen Rechner freigegeben ist. Dabei werden die Daten _nicht_ komplett
uebertragen und ich konnte ohne Probleme an das Ende der Datei positionieren +
einen Text schreiben.Das dabei nicht alle Daten uebertragen wurden, kann ich definitiv sagen, denn
33MB sind nicht mal eben in 1 sek. uebertragen.Also eine durchaus Positive Anwort, wuerd ich mal sagen
mfg
v R
-
Super für den Test
Tip: Du könntest den Perfmon (vorausgesetzt ist ein MS Rechner) laufen lassen (Network / Bytes/s), dann siehst Du exakt was übertragen wurde beim Zielsystem.
Ich werde glaub doch noch nicht ganz aufgeben und weiter code zusammen 'würgen', bis es denn den Wünschen entspricht.
Könnten wir einen kleinen Deal machen? Ich bin extrem Stark in VB und ASP. Wenn Du mal Unterstützung in diesen Gebieten benötigst könnte ich Dir bestimmt weiterhelfen. Natürlich bin um Deine Hilfe bei meinem Problem sehr froh und dankbar.
btw: ich werde voraussichtlich erst morgen oder so wieder im Forum sein können.
Gruss
Martin