2009-04-09 16 views
17

Il mio client TCP riceve un'immagine all'interno di un pacchetto. L'immagine viene compressa con zlib. L'attività è decomprimere l'immagine e inserirla nel modulo.Salva file da un byte [] in C# NET 3.5

Sto pianificando di salvare l'immagine compressa nella directory corrente, decomprimerla e caricare il file decompresso nel modulo.

Il primo problema viene fornito con il salvataggio del file (compresso). Lo zlib può salvarlo decompresso.

Il codice seguente carica il file compresso e lo salva dopo la decompressione.

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(); 
    } 

Come passare l'array byte [] direttamente a tale funzione? Sto pianificando di salvarlo come compresso e quindi di chiamare la funzione con la posizione del file compresso, ma non so né come salvare un file da una matrice di byte [] né come passare il byte [] array come file di input.

Qualsiasi aiuto sarà molto apprezzato.

Grazie.

+0

non ho capito come in cui si desidera passare il byte [] per? alla funzione CopyStream? –

+0

anche in while ((len = input.Read (buffer, 0, 2000))> 0) { output.Write (buffer, 0, len); } non è necessario regolare nuovamente la posizione in cui si desidera scrivere il buffer? scriveva sempre dalla posizione 0 sempre. –

+1

Per quanto riguarda la funzione CopyStream, è corretta. Si desidera sempre scrivere nella posizione 0. I parametri aggiuntivi determinano da dove nel buffer copiare. Ma copiamo sempre dall'inizio a 0 nel buffer ogni volta attraverso il ciclo. Di conseguenza, vogliamo sempre scrivere sull'output a partire dalla posizione 0 nel buffer. – Yuliy

risposta

79

Utilizzare il metodo statico System.IO.File.WriteAllBytes (percorso stringa, byte [] byte).

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

hai dimenticato di sfuggire ai tuoi personaggi;). il parametro dovrebbe essere @ "c: \ data.dmp" o "c: \\ data.dmp" –

+0

che dire della codifica ?? per esempio, leggere un file (ANSI, UTF-8) in bytearray e quindi scrivere nel nuovo nome file – Kiquenet

+3

Wow. Perché non può essere sempre così facile? +1 – cbmeeks

1

Attaccare l'array di byte ricevuto in un MemoryStream e comprimerlo/decomprimerlo al volo senza utilizzare file temporanei.

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

Si può provare questo codice

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

Stai dimenticando di disporre di FileStream. – Noldorin

+2

Anirudh, abituarsi a usare invece una istruzione 'using'. fare riferimento alla risposta di Erich, sopra. –

3

In aggiunta a ciò che chiunque altro ha già detto, vorrei anche suggerire di usare 'usando' clausole in quanto tutti quegli oggetti implementano IDisposable.

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