2008-12-19 41 views
264

Tôi đang cố gắng viết ra một mảng Byte[] đại diện cho tệp hoàn chỉnh cho tệp.Có thể một Byte [] Array được ghi vào một tập tin trong C#?

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 đi để được xử lý bởi lớp này.

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

Lớp FileStream không lấy mảng byte làm đối số hoặc đối tượng Luồng khác (cho phép bạn ghi byte vào đối số).

Tôi đang nhắm đến việc xử lý được thực hiện bởi một chuỗi khác với bản gốc (một chủ đề có TCPClient).

Tôi không biết cách triển khai điều này, tôi nên thử gì?

Trả lời

586

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 Byte [] array đại diện cho một tập tin hoàn chỉnh vào một tập tin"

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

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

dự liệu ở đây:

System.IO.File.WriteAllBytes - MSDN

5

Đúng, tại sao không?

fs.Write(myByteArray, 0, myByteArray.Length); 
33

Bạn có thể sử dụng một đối tượng 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; 
} 

Edit: Rất tiếc, quên phần finally ... cho phép nói nó là trái như một bài tập cho người đọc ;-)

+0

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

+0

@buffer_overflow: Bạn 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í để có thể triển khai: http://en.wikipedia.org/wiki/Decorator_pattern – Treb

+0

gotch ya. Cảm ơn. – Cannon

9

Bạn có thể làm điều này bằng System.IO.BinaryWriter mà mất một Stream vậy:

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

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

+4

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

+0

Đừng quên sử dụng Dispose; –

15

có một phương pháp tĩnh System.IO.File.WriteAllBytes

-2
public ActionResult Document(int id) 
    { 
     var obj = new CEATLMSEntities().LeaveDocuments.Where(c => c.Id == id).FirstOrDefault(); 
     string[] stringParts = obj.FName.Split(new char[] { '.' }); 
     string strType = stringParts[1]; 
     Response.Clear(); 
     Response.ClearContent(); 
     Response.ClearHeaders(); 
     Response.AddHeader("content-disposition", "attachment; filename=" + obj.FName); 
     var asciiCode = System.Text.Encoding.ASCII.GetString(obj.Document); 
     var datas = Convert.FromBase64String(asciiCode.Substring(asciiCode.IndexOf(',') + 1)); 
     //Set the content type as file extension type 
     Response.ContentType = strType; 
     //Write the file content 
     this.Response.BinaryWrite(datas); 
     this.Response.End(); 
     return new FileStreamResult(Response.OutputStream, obj.FType); 
    } 
+0

xin vui lòng xem xét thêm một chút giải thích cho đoạn mã :-) – kleopatra

+0

Bạn có thể cải thiện câu trả lời bằng cách thêm một số mô tả cho nó. – Alexey

+0

Điều này có vẻ giống như một đoạn mã ASP.Net? Cấp nó chuyển đổi văn bản thành một mảng byte và sau đó ghi nó vào luồng. Không thực sự trả lời câu hỏi ban đầu của tôi tho. –

0

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; 
} 
Các vấn đề liên quan