2009-08-13 20 views
2

Ich arbeite gerade an einem Programm, das Dateien per FTP überträgt. Ich sende die Dateien binär, weil ich mit ASCII keine Sonderzeichen senden kann.Wie kann ich meinen BinaryWriter optimieren?

Hier ist meine Zeit Code:

using(BinaryReader bReader = new BinaryReader(srcStream)) 
    using (BinaryWriter bWriter = new BinaryWriter(destStream)) 
    { 
     Byte[] readBytes = new Byte[1024]; 
     for(int i = 0; i < bReader.BaseStream.Length; i += 1024) 
     { 
      readBytes = bReader.ReadBytes(1024); 
      bWriter.Write(readBytes); 
     } 
    } 

Meine Probleme mit diesem Code sind:

  1. Es funktioniert wirklich langsam, ist es eine Möglichkeit, zu optimieren?
  2. Die Art und Weise, wie ich nach EOF (EndOfFile) frage, scheint sehr seltsam zu sein, gibt es eine andere Eleganz Option?

Thanks a lot: D

+0

Nach der Implementierung der Lösung von Jon und Gbegen geschrieben, bekomme ich immer eine Fehlermeldung „Request nicht genommen“. – Camal

Antwort

9

Warum verwenden Sie Binary und Binary alle an? Warum fragst du immer wieder nach der Länge? Hier ist eine Methode, die ich ein paar Mal jetzt geschrieben habe:

public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[8192]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 
} 

dass ein 8K-Puffer verwendet, aber Sie können das natürlich ändern. Oh, und es wiederverwendet den Puffer, anstatt jedes Mal ein neues Byte-Array zu erstellen, was Ihr Code tun wird :) (Sie müssen das Byte-Array nicht zum Anfang zuweisen - Sie könnten readBytes an dem Punkt deklariert haben Der Anruf an bReader.ReadBytes.)

+1

Das erste, danke Jon. Aber jetzt bin ich sehr verwirrt: D Ich bin ziemlich neu in der Arbeit mit Streams und ich dachte, ich kann nur mit BinaryWriter im Binärmodus schreiben. So Streams bekam auch Methoden Lesen/Schreiben. Und ich habe etwas gelernt: D Aber nur für den Fall, dass eine Datei eine Größe von "0" hat, aber ich möchte diese Datei auch übertragen. Wenn das für mich funktioniert? – Camal

+0

Das wird gut funktionieren, ja - der erste Aufruf von Read wird 0 zurückgeben, und Sie werden die Schleife beenden. BinaryReader/BinaryWriter sind Dienstprogrammklassen zum Lesen und Schreiben von Grundelementen usw. über Streams. Streams selbst sind nur binäre Quellen und Ziele für Daten - die andere Sache, die sie umgibt, sind StreamReader/StreamWriter, die Text decodieren/kodieren. –

+0

Ich würde immer noch gerne wissen, warum 'BinaryWriter.BaseStream' super langsam ist. Soll es nicht nur ein Stream-Feld zurückgeben, das vom Konstruktor gespeichert wurde? –

2

Ich denke, dass Ihre Leistungsprobleme von zwei Orten kommen. Sie rufen bReader.BaseStream.Length jedes Mal durch die Schleife und Ihr Aufruf an bReader.ReadBytes() reserviert jedes Mal ein neues Byte-Array.

Ich denke auch nicht, dass die Binary und Binary notwendig ist, da Sie nicht ihre Funktionen zum Lesen und Schreiben Typen werden unter Verwendung von anderen als Byte-Arrays, die in dem zugrunde liegenden Strom durch Stream.Read() und Stream.Write() bereits unterstützt werden.

ich dies als tun würde:

byte [] buffer = new byte[1024]; 
int bytesRead; 
while ((bytesRead = srcStream.Read(buffer, 0, buffer.Length)) != 0) 
{ 
    dstStream.Write(buffer, 0, bytesRead); 
}