2009-04-09 351 views
17

Mi cliente TCP recibe una imagen de una imagen packet.The se comprime con la tarea dentro zlib.The es descomprimir la imagen y ponerla en el formulario.Guardar archivo de un byte [] en C# NET 3.5

tengo la intención de guardar la imagen comprimida en el directorio actual, descomprimirlo y cargar el archivo descomprimido en el formulario.

El primer problema viene con guardar el archivo (comprimido) .El zlib puede guardarlo descomprimido.

El código siguiente carga el archivo comprimido y lo guarda después de la descompresión.

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

¿Cómo pasar la matriz byte [] directamente a esa función? Estoy planeando guardarlo como comprimido y luego llamar a la función con la ubicación del archivo comprimido, pero no sé cómo guardar un archivo de una matriz de bytes [] ni una forma de pasar el byte [] array como el archivo de entrada.

Cualquier ayuda será muy apreciada.

Gracias.

+0

yo no entiendo como la que desea pasar el byte [] para? a la función CopyStream? –

+0

También en while ((len = input.Read (buffer, 0, 2000))> 0) { output.Write (buffer, 0, len); } ¿no tiene que volver a ajustar la ubicación en la que desea escribir el búfer? escribiría más desde la ubicación 0 siempre. –

+1

Con respecto a la función CopyStream, es correcta. Siempre desea escribir en la ubicación 0. Los parámetros adicionales gobiernan en qué parte del búfer se debe copiar. Pero siempre copiamos comenzando en la ubicación 0 en el búfer cada vez que pasa el bucle. Como resultado, siempre queremos escribir en la salida comenzando desde la ubicación 0 en el búfer. – Yuliy

Respuesta

79

Utilice los System.IO.File.WriteAllBytes static void (String path, [] bytes bytes) método.

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

olvidaste escapar de tus personajes;). El parámetro debe ser @ "c: \ data.dmp" o "c: \\ data.dmp" –

+0

¿Qué ocurre con la codificación? para la muestra, lea un archivo (ANSI, UTF-8) para bytearray, y luego escriba al nuevo nombre de archivo – Kiquenet

+3

Wow. ¿Por qué no siempre puede ser tan fácil? +1 – cbmeeks

1

palillo de la matriz de bytes que ha recibido en un MemoryStream y comprimir/descomprimir sobre la marcha sin necesidad de utilizar archivos temporales.

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

Puede probar este código

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

Olvidaste eliminar el FileStream. – Noldorin

+2

Anirudh, acostúmbrese a usar una declaración 'using' en su lugar. consulte la respuesta de Erich, arriba. –

3

Además de lo que todos los demás ya se ha dicho, Me gustaría también sugieren que utilice 'usando' cláusulas ya que todos esos objetos implementan IDisposable.

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