¿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?

Roberto Bonini
fuente

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

Kev
fuente
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 ;-)

Treb
fuente
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
20

Hay un método estático System.IO.File.WriteAllBytes

Andrew Rollings
fuente
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);
JoshBerke
fuente
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
6

Sí, ¿por qué no?

fs.Write(myByteArray, 0, myByteArray.Length);
Mehrdad Afshari
fuente
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;
}
PatsonLeaner
fuente