Una matrice di byte [] può essere scritta in un file in C #?


345

Sto provando a scrivere un Byte[]array che rappresenta un file completo in un file.

Il file originale dal client viene inviato tramite TCP e quindi ricevuto da un server. Il flusso ricevuto viene letto in un array di byte e quindi inviato per essere elaborato da questa classe.

Ciò serve principalmente per garantire che la ricezione TCPClientsia pronta per il flusso successivo e separare l'estremità di ricezione dall'estremità di elaborazione.

La FileStreamclasse non accetta un array di byte come argomento o un altro oggetto Stream (che consente di scrivere byte su di esso).

Sto mirando a ottenere l'elaborazione da un thread diverso dall'originale (quello con TCPClient).

Non so come implementarlo, cosa dovrei provare?

Risposte:


728

Basato sulla prima frase della domanda: "Sto cercando di scrivere un array Byte [] che rappresenta un file completo in un file."

Il percorso di minor resistenza sarebbe:

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

Documentato qui:

System.IO.File.WriteAllBytes - MSDN


40

Puoi usare un BinaryWriteroggetto.

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

Modifica: Ops, finallyho dimenticato la parte ... diciamo che è lasciato come esercizio per il lettore ;-)


Diciamo che ho ricevuto dati compressi e li ho decompressi in Byte []. È possibile creare nuovamente il file usando la funzione sopra? Qualche tutorial o demo online?
Cannon,

@buffer_overflow: è necessario comprimerlo prima se si desidera ripristinare il file originale.
Dai

2
BinaryWriterè usa e getta quindi dovrebbe probabilmente essere usato all'interno di un usingblocco. Ciò significherebbe anche che potresti probabilmente interrompere alcune delle chiamate extra poiché il codice sorgente mostra che esegue una pulizia durante lo smaltimento.
Jeff B


11

Puoi farlo usando System.IO.BinaryWriterquale prende uno Stream così:

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

7
Voglio solo aggiungere, dopo aver scritto aggiungi bw.flush e bw.close
dekdev

6
@dekdev: non ha senso chiamare Flush()prima Close()perché Close()arrossirà. Ancora meglio è usare una usingclausola che cancellerà anche la chiusura.
Tomas,

1
Non dimenticare di usare il Dispose;
vitor_gaudencio_oliveira,



1

Prova 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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.