Bisakah byte [] Array ditulis ke file dalam C #?

344

Saya mencoba menulis Byte[]array yang mewakili file lengkap ke file.

File asli dari klien dikirim melalui TCP dan kemudian diterima oleh server. Aliran yang diterima dibaca ke array byte dan kemudian dikirim untuk diproses oleh kelas ini.

Ini terutama untuk memastikan bahwa penerima TCPClientsiap untuk aliran berikutnya dan memisahkan ujung penerima dari ujung pemrosesan.

The FileStreamkelas tidak mengambil array byte sebagai argumen atau objek Streaming lain (yang tidak memungkinkan Anda untuk menulis byte untuk itu).

Saya bertujuan untuk mendapatkan pemrosesan yang dilakukan oleh utas yang berbeda dari aslinya (yang dengan TCPClient).

Saya tidak tahu bagaimana menerapkannya, apa yang harus saya coba?

Roberto Bonini
sumber

Jawaban:

728

Berdasarkan kalimat pertama dari pertanyaan: "Saya mencoba untuk menulis array Byte [] yang mewakili file lengkap ke file."

Jalan yang paling tidak tahan adalah:

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

Didokumentasikan di sini:

System.IO.File.WriteAllBytes - MSDN

Kev
sumber
40

Anda bisa menggunakan BinaryWriterobjek.

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

Sunting: Ups, lupa finallybagian ... katakanlah dibiarkan sebagai latihan untuk pembaca ;-)

Treb
sumber
Katakanlah, saya telah menerima data terkompresi, dan saya telah mendekompresnya ke Byte []. Apakah mungkin untuk membuat file kembali menggunakan fungsi di atas? Adakah tutorial atau demo online?
Cannon
@buffer_overflow: Anda harus mengompresnya terlebih dahulu jika Anda ingin mendapatkan file aslinya kembali. Lihatlah Pola Dekorator untuk kemungkinan implementasi: en.wikipedia.org/wiki/Decorator_pattern
Treb
2
BinaryWriterdapat digunakan jadi mungkin harus digunakan dalam usingblok. Itu juga berarti Anda mungkin dapat menghentikan beberapa panggilan ekstra karena kode sumber menunjukkan bahwa ia melakukan pembersihan saat membuang.
Jeff B
20

Ada metode statis System.IO.File.WriteAllBytes

Andrew Rollings
sumber
11

Anda dapat melakukan ini menggunakan System.IO.BinaryWriteryang membutuhkan Stream jadi:

var bw = new BinaryWriter(File.Open("path",FileMode.OpenOrCreate);
bw.Write(byteArray);
JoshBerke
sumber
7
Hanya ingin menambahkan, setelah menulis add bw.flush dan bw.close
dekdev
6
@dekdev: Tidak ada gunanya menelepon Flush()sebelumnya Close()karena Close()akan memerah. Bahkan lebih baik adalah menggunakan usingklausa yang juga akan flush'n'close.
Tomas
1
Jangan lupa untuk menggunakan Buang;
vitor_gaudencio_oliveira
6

Yap, mengapa tidak?

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

Coba 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
sumber