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?

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


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


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


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

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



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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.