2009-04-09 3 views
17

Mein TCP-Client empfängt ein Bild innerhalb eines Pakets. Das Bild wird mit zlib komprimiert. Die Aufgabe besteht darin, das Bild zu dekomprimieren und es in das Formular einzufügen.Datei aus einem Byte speichern [] in C# NET 3.5

Ich plane, das komprimierte Bild im aktuellen Verzeichnis zu speichern, entpacken Sie es und die entpackte Datei auf dem Formular zu laden.

Das erste Problem kommt die Datei mit dem Speichern (komprimiert) .Die zlib kann es dekomprimiert speichern.

Der folgende Code lädt die komprimierte Datei und speichert sie nach der Dekomprimierung.

private void decompressFile(string inFile, string outFile) 
    { 
     System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); 
     zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream); 
     System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);   
     try 
     { 
      CopyStream(inFileStream, outZStream); 
     } 
     finally 
     { 
      outZStream.Close(); 
      outFileStream.Close(); 
      inFileStream.Close(); 
     } 
    } 

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output) 
    { 
     byte[] buffer = new byte[2000]; 
     int len; 
     while ((len = input.Read(buffer, 0, 2000)) > 0) 
     { 
      output.Write(buffer, 0, len); 
     } 
     output.Flush(); 
    } 

Wie die byte [] Array dieser Funktion direkt passieren? Ich plane, es als komprimiert zu speichern und dann die Funktion mit dem Speicherort der komprimierten Datei aufzurufen, aber ich weiß weder, wie eine Datei aus einem byte [] -Array gespeichert wird, noch eine Möglichkeit, das Byte [] zu übergeben Array als Eingabedatei.

Jede Hilfe wird sehr geschätzt.

Danke.

+0

Ich verstehe nicht, wie, wo Sie die byte [] zu übergeben möchten? zur CopyStream-Funktion? –

+0

Auch in while ((len = input.Read (Puffer, 0, 2000))> 0) { output.Write (Puffer, 0, len); } müssen Sie den Speicherort, an den Sie den Puffer schreiben möchten, nicht erneut anpassen? Es würde immer von Ort 0 schreiben. –

+1

In Bezug auf die CopyStream-Funktion ist es korrekt. Sie möchten immer auf Position 0 schreiben. Die zusätzlichen Parameter bestimmen, wo im Puffer kopiert werden soll. Aber wir kopieren immer über die Position 0 im Puffer jedes Mal durch die Schleife. Als Ergebnis wollen wir immer in die Ausgabe schreiben, beginnend mit der Position 0 im Puffer. – Yuliy

Antwort

79

Mit static void System.IO.File.WriteAllBytes (string Pfad, byte [] bytes) Methode.

byte[] buffer = new byte[200]; 
File.WriteAllBytes(@"c:\data.dmp", buffer); 
+3

hast du vergessen, deinen Charakter zu entkommen;). Parameter sollte @ "c: \ data.dmp" oder "c: \\ data.dmp" sein –

+0

was ist mit Codierung? für Beispiel, lesen Sie eine Datei (ANSI, UTF-8) zu Bytearray, und schreiben Sie dann in neuen Dateinamen – Kiquenet

+3

Wow. Warum kann es nicht immer so einfach sein? +1 – cbmeeks

1

-Stick des Byte-Array, das Sie in ein MemoryStream empfangen und komprimieren/dekomprimieren es on the fly ohne temporäre Dateien.

5
public static void SaveFile(this Byte[] fileBytes, string fileName) 
{ 
    FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite); 
    fileStream.Write(fileBytes, 0, fileBytes.Length); 
    fileStream.Close(); 
} 
0

Sie diesen Code

versuchen
private void t1() 
    { 
     FileStream f1 = new FileStream("C:\\myfile1.txt", FileMode.Open); 
     int length = Convert.ToInt16(f1.Length); 
     Byte[] b1 = new Byte[length]; 
     f1.Read(b1, 0, length); 
     File.WriteAllBytes("C:\\myfile.txt",b1); 
     f1.Dispose(); 
    } 
+0

Sie vergessen, den FileStream zu entsorgen. – Noldorin

+2

Anirudh, gewöhne dich daran, stattdessen eine using-Anweisung zu verwenden. Siehe oben Erichs Antwort. –

3

Zusätzlich zu dem, was alle anderen schon gesagt hat, würde ich schlage vor, Sie auch alle ‚mit‘ Klauseln verwenden, da diese Objekte IDisposable implementieren.

using(FileStream outFileStream = new ...) 
using(ZOutputStream outZStream = new ...) 
using(FileStream inFileStream = new ...) 
{ 
    CopyStream(inFileStream, outZStream); 
}