Mảng Byte [] có thể được ghi vào một tệp trong C # không?


344

Tôi đang cố gắng viết ra một Byte[]mảng thể hiện một tập tin hoàn chỉnh thành một tập tin.

Tệp gốc từ máy khách được gửi qua TCP và sau đó được máy chủ nhận. Luồng nhận được đọc đến một mảng byte và sau đó được gửi để được xử lý bởi lớp này.

Điều này chủ yếu là để đảm bảo rằng việc nhận TCPClientđã sẵn sàng cho luồng tiếp theo và tách đầu cuối nhận khỏi kết thúc xử lý.

Các FileStreamlớp không mất một mảng byte như một cuộc tranh cãi này hay cách khác đối tượng Stream (mà cho phép bạn ghi byte để nó).

Tôi đang hướng đến việc xử lý được thực hiện bởi một luồng khác với luồng gốc (luồng có TCPClient).

Tôi không biết làm thế nào để thực hiện điều này, tôi nên thử làm gì?

Câu trả lời:


728

Dựa trên câu đầu tiên của câu hỏi: "Tôi đang cố gắng viết ra một mảng Byte [] đại diện cho một tệp hoàn chỉnh vào một tệp."

Con đường ít kháng cự nhất sẽ là:

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

Tài liệu ở đây:

System.IO.File.WriteAllBytes - MSDN


40

Bạn có thể sử dụng một BinaryWriterđối tượng.

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

Chỉnh sửa: Rất tiếc, quên finallyphần ... giả sử nó còn lại như một bài tập cho người đọc ;-)


Hãy nói rằng, tôi đã nhận được dữ liệu nén và tôi đã giải nén nó thành Byte []. Có thể tạo lại tập tin bằng cách sử dụng chức năng trên? Bất kỳ hướng dẫn hoặc demo trực tuyến?
Pháo

@buffer_overflow: Bạn sẽ cần phải nén nó trước nếu bạn muốn lấy lại tệp gốc. Hãy xem Mẫu trang trí để triển khai có thể: en.wikipedia.org/wiki/Decorator_potype
Treb

2
BinaryWriterlà dùng một lần nên có lẽ nên được sử dụng trong một usingkhối. Điều đó cũng có nghĩa là bạn có thể có thể bỏ một số cuộc gọi thêm vì mã nguồn cho thấy rằng nó thực hiện một số dọn dẹp trong khi xử lý.
Jeff B


11

Bạn có thể làm điều này bằng cách sử dụng System.IO.BinaryWriterluồng này để:

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

7
Chỉ muốn thêm, sau khi viết thêm bw.flush và bw.close
dekdev

6
@dekdev: Không có điểm nào trong việc gọi Flush()trước Close()như Close()sẽ tuôn ra. Thậm chí tốt hơn là sử dụng một usingmệnh đề cũng sẽ tuôn ra.
Tomas

1
Đừng quên sử dụng Vứt bỏ;
vitor_gaudencio_oliveira



1

Hãy thử 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.