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?

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


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


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


11

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

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

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



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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.