Kann ein Byte [] Array in eine Datei in C # geschrieben werden?

344

Ich versuche, ein Byte[]Array, das eine vollständige Datei darstellt, in eine Datei zu schreiben .

Die Originaldatei vom Client wird über TCP gesendet und dann von einem Server empfangen. Der empfangene Stream wird in ein Byte-Array gelesen und dann zur Verarbeitung durch diese Klasse gesendet.

Dies dient hauptsächlich dazu, sicherzustellen, dass der Empfang TCPClientfür den nächsten Stream bereit ist, und das Empfangsende vom Verarbeitungsende zu trennen.

Die FileStreamKlasse verwendet kein Byte-Array als Argument oder ein anderes Stream-Objekt (mit dem Sie Bytes darauf schreiben können).

Ich möchte, dass die Verarbeitung von einem anderen Thread als dem Original (dem mit dem TCPClient) durchgeführt wird.

Ich weiß nicht, wie ich das implementieren soll. Was soll ich versuchen?

Roberto Bonini
quelle

Antworten:

728

Basierend auf dem ersten Satz der Frage: "Ich versuche, ein Byte [] -Array zu schreiben, das eine vollständige Datei in eine Datei darstellt."

Der Weg des geringsten Widerstands wäre:

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

Hier dokumentiert:

System.IO.File.WriteAllBytes - MSDN

Kev
quelle
40

Sie können ein BinaryWriterObjekt verwenden.

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

Edit: Ups, habe den finallyTeil vergessen ... sagen wir mal, er bleibt als Übung für den Leser ;-)

Treb
quelle
Nehmen wir an, ich habe komprimierte Daten empfangen und sie in Byte [] dekomprimiert. Ist es möglich, die Datei mit der obigen Funktion zurück zu erstellen? Irgendein Tutorial oder eine Demo online?
Kanone
@buffer_overflow: Sie müssten es zuerst komprimieren, wenn Sie die Originaldatei zurückerhalten möchten.
Werfen
2
BinaryWriterist wegwerfbar und sollte daher wahrscheinlich innerhalb eines usingBlocks verwendet werden. Das würde auch bedeuten, dass Sie wahrscheinlich einige der zusätzlichen Anrufe weglassen könnten, da der Quellcode anzeigt, dass beim Entsorgen eine Bereinigung durchgeführt wird.
Jeff B
20

Es gibt eine statische Methode System.IO.File.WriteAllBytes

Andrew Rollings
quelle
11

Sie können dies tun, indem Sie System.IO.BinaryWritereinen Stream verwenden, also:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);
JoshBerke
quelle
7
Ich möchte nur hinzufügen, nach dem Schreiben hinzufügen bw.flush und bw.close
dekdev
6
@dekdev: Es gibt keinen Punkt in Berufung Flush()vor Close()wie Close()spült. Noch besser ist es, eine usingKlausel zu verwenden , die auch spült und schließt.
Tomas
1
Vergessen Sie nicht, die Entsorgung zu verwenden.
vitor_gaudencio_oliveira
6

Ja, warum nicht?

fs.Write(myByteArray, 0, myByteArray.Length);
Mehrdad Afshari
quelle
1

Probieren Sie BinaryReader aus:

/// <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
quelle