¿Se puede escribir una matriz Byte [] en un archivo en C #?


344

Estoy tratando de escribir una Byte[]matriz que represente un archivo completo en un archivo.

El archivo original del cliente se envía a través de TCP y luego lo recibe un servidor. El flujo recibido se lee en una matriz de bytes y luego se envía para ser procesado por esta clase.

Esto es principalmente para garantizar que la recepción TCPClientesté lista para la siguiente secuencia y separe el extremo receptor del final del procesamiento.

La FileStreamclase no toma una matriz de bytes como argumento u otro objeto Stream (que sí le permite escribir bytes).

Mi objetivo es que el procesamiento sea realizado por un hilo diferente del original (el que tiene el TCPClient).

No sé cómo implementar esto, ¿qué debo probar?

Respuestas:


728

Basado en la primera oración de la pregunta: "Estoy tratando de escribir una matriz Byte [] que represente un archivo completo en un archivo".

El camino de menor resistencia sería:

File.WriteAllBytes(string path, byte[] bytes)

Documentado aquí:

System.IO.File.WriteAllBytes - MSDN


40

Puedes usar un BinaryWriterobjeto.

protected bool SaveData(string FileName, byte[] Data)
{
    BinaryWriter Writer = null;
    string Name = @"C:\temp\yourfile.name";

    try
    {
        // Create a new stream to write to the file
        Writer = new BinaryWriter(File.OpenWrite(Name));

        // Writer raw data                
        Writer.Write(Data);
        Writer.Flush();
        Writer.Close();
    }
    catch 
    {
        //...
        return false;
    }

    return true;
}

Editar: Vaya, olvidé la finallyparte ... digamos que se deja como ejercicio para el lector ;-)


Digamos que recibí datos comprimidos y los descomprimí en Byte []. ¿Es posible volver a crear el archivo usando la función anterior? ¿Algún tutorial o demostración en línea?
Cañón

@buffer_overflow: primero deberá comprimirlo si desea recuperar el archivo original. Eche un vistazo al patrón Decorator para una posible implementación: en.wikipedia.org/wiki/Decorator_pattern
Treb

2
BinaryWriteres desechable, por lo que probablemente debería usarse dentro de un usingbloque. Eso también significa que probablemente podría dejar algunas de las llamadas adicionales, ya que el código fuente muestra que hace un poco de limpieza mientras se deshace.
Jeff B


11

Puedes hacer esto usando el System.IO.BinaryWriterque toma un Stream para:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);

77
Solo quiero agregar, después de escribir add bw.flush y bw.close
dekdev

66
@dekdev: No tiene sentido llamar Flush()antes, Close()ya que Close()se vaciará. Aún mejor es usar una usingcláusula que también vaciará y cerrará.
Tomás

1
No olvides usar el Dispose;
vitor_gaudencio_oliveira



1

Prueba BinaryReader:

/// <summary>
/// Convert the Binary AnyFile to Byte[] format
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static byte[] ConvertANYFileToBytes(HttpPostedFileBase image)
{
    byte[] imageBytes = null;
    BinaryReader reader = new BinaryReader(image.InputStream);
    imageBytes = reader.ReadBytes((int)image.ContentLength);
    return imageBytes;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.