Byte [] Array สามารถเขียนไปยังไฟล์ใน C # ได้หรือไม่?


344

ฉันพยายามเขียน Byte[]อาร์เรย์ที่แสดงถึงไฟล์ที่สมบูรณ์ลงในไฟล์

ไฟล์ต้นฉบับจากไคลเอนต์จะถูกส่งผ่าน TCP และจากนั้นเซิร์ฟเวอร์จะได้รับ กระแสข้อมูลที่ได้รับจะถูกอ่านไปยังอาร์เรย์ไบต์แล้วส่งไปประมวลผลโดยชั้นนี้

นี่คือหลักเพื่อให้แน่ใจว่าการรับTCPClientพร้อมสำหรับกระแสถัดไปและแยกปลายการรับจากจุดสิ้นสุดการประมวลผล

FileStreamชั้นไม่ได้ใช้อาร์เรย์ไบต์เป็นอาร์กิวเมนต์หรือวัตถุอื่นสตรีม (ซึ่งไม่อนุญาตให้คุณเขียนไบต์ไป)

ฉันตั้งเป้าที่จะทำการประมวลผลโดยเธรดที่แตกต่างจากต้นฉบับ (อันที่มี TCPClient)

ฉันไม่ทราบวิธีการใช้สิ่งนี้ฉันควรลองทำอย่างไร

คำตอบ:


728

ตามประโยคแรกของคำถาม: "ฉันพยายามเขียนอาร์เรย์ Byte [] ที่เป็นตัวแทนของไฟล์ที่สมบูรณ์ไปยังไฟล์"

เส้นทางของความต้านทานน้อยที่สุดจะเป็น:

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

เอกสารที่นี่:

System.IO.File.WriteAllBytes - MSDN


40

คุณสามารถใช้BinaryWriterวัตถุ

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

แก้ไข:โอ๊ะลืมfinallyส่วน ... มาบอกว่ามันเหลือไว้สำหรับการออกกำลังกายสำหรับผู้อ่าน ;-)


ให้บอกว่าฉันได้รับข้อมูลที่ถูกบีบอัดและฉันได้แตกมันเป็นไบต์ [] เป็นไปได้ไหมที่จะสร้างไฟล์กลับโดยใช้ฟังก์ชั่นด้านบน? มีการสอนหรือการสาธิตออนไลน์หรือไม่
Cannon

@buffer_overflow: คุณจะต้องบีบอัดก่อนหากคุณต้องการรับไฟล์ต้นฉบับกลับมา ดูที่มัณฑนากรลวดลายสำหรับการนำไปใช้ที่เป็นไปได้: en.wikipedia.org/wiki/Decorator_pattern
Treb

2
BinaryWriterถูกทิ้งดังนั้นจึงควรใช้ภายในusingบล็อก นั่นก็หมายความว่าคุณอาจจะไม่ได้รับการโทรเพิ่มเติมเนื่องจากซอร์สโค้ดแสดงว่ามันทำการล้างข้อมูลบางอย่างในขณะที่กำลังกำจัด
Jeff B


11

คุณสามารถทำได้โดยSystem.IO.BinaryWriterใช้สตรีมเพื่อ:

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

7
เพียงต้องการเพิ่มหลังจากเขียนเพิ่ม bw.flush และ bw.close
dekdev

6
@dekdev: ไม่มีจุดในการโทรFlush()มาก่อนClose()ที่Close()จะล้าง ยิ่งไปกว่านั้นคือการใช้ส่วนusingคำสั่งซึ่งจะ flush'n'close
โทมัส

1
อย่าลืมที่จะใช้การกำจัด;
vitor_gaudencio_oliveira



1

ลอง 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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.