2009-04-09 36 views
17

Máy khách TCP của tôi nhận được một hình ảnh trong một gói. Hình ảnh được nén bằng zlib. Nhiệm vụ là giải nén hình ảnh và đặt nó vào biểu mẫu.Lưu tập tin từ một byte [] trong C# NET 3.5

Tôi đang lập kế hoạch lưu hình ảnh đã nén vào thư mục hiện tại, giải nén và tải tệp giải nén trên biểu mẫu.

Sự cố đầu tiên đi kèm với việc lưu tệp (được nén) .Bộ lọc zlib có thể lưu nó giải nén.

Mã bên dưới tải tệp nén và lưu sau khi giải nén.

private void decompressFile(string inFile, string outFile) 
    { 
     System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create); 
     zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream); 
     System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);   
     try 
     { 
      CopyStream(inFileStream, outZStream); 
     } 
     finally 
     { 
      outZStream.Close(); 
      outFileStream.Close(); 
      inFileStream.Close(); 
     } 
    } 

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output) 
    { 
     byte[] buffer = new byte[2000]; 
     int len; 
     while ((len = input.Read(buffer, 0, 2000)) > 0) 
     { 
      output.Write(buffer, 0, len); 
     } 
     output.Flush(); 
    } 

Làm thế nào để chuyển mảng byte [] trực tiếp đến chức năng đó? Tôi đang lập kế hoạch để lưu nó dưới dạng nén và sau đó gọi hàm với vị trí của tệp nén, nhưng tôi không biết cách lưu tệp từ mảng byte [] cũng như cách để chuyển byte [] mảng làm tệp đầu vào.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn.

+0

tôi không hiểu là nơi bạn muốn vượt qua byte [] để? vào chức năng CopyStream? –

+0

Cũng trong trong khi ((len = input.Read (buffer, 0, 2000))> 0) { output.Write (buffer, 0, len); } bạn không phải điều chỉnh lại vị trí mà bạn muốn ghi bộ đệm? nó sẽ ghi đè lên từ vị trí 0 luôn. –

+1

Về chức năng CopyStream, nó là chính xác. Bạn luôn muốn ghi vào vị trí 0. Các tham số phụ sẽ điều chỉnh vị trí trong bộ đệm để sao chép từ đó. Nhưng chúng tôi luôn luôn sao chép bắt đầu từ vị trí 0 trong bộ đệm mỗi lần qua vòng lặp. Kết quả là, chúng tôi luôn muốn ghi vào đầu ra bắt đầu từ vị trí 0 trong bộ đệm. – Yuliy

Trả lời

79

Sử dụng phương thức tĩnh System.IO.File.WriteAllBytes (chuỗi đường dẫn, byte [] byte).

byte[] buffer = new byte[200]; 
File.WriteAllBytes(@"c:\data.dmp", buffer); 
+3

bạn quên thoát khỏi nhân vật của mình;). tham số phải là @ "c: \ data.dmp" hoặc "c: \\ data.dmp" –

+0

những gì về mã hóa ?? cho mẫu, đọc một tập tin (ANSI, UTF-8) để bù trừ, và sau đó ghi vào tên tập tin mới – Kiquenet

+3

Wow. Tại sao nó không phải lúc nào cũng dễ dàng như vậy? +1 – cbmeeks

1

Dán mảng byte bạn đã nhận được vào một MemoryStream và nén/giải nén nó ngay lập tức mà không cần sử dụng các tệp tạm thời.

5
public static void SaveFile(this Byte[] fileBytes, string fileName) 
{ 
    FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite); 
    fileStream.Write(fileBytes, 0, fileBytes.Length); 
    fileStream.Close(); 
} 
0

Bạn có thể thử mã này

private void t1() 
    { 
     FileStream f1 = new FileStream("C:\\myfile1.txt", FileMode.Open); 
     int length = Convert.ToInt16(f1.Length); 
     Byte[] b1 = new Byte[length]; 
     f1.Read(b1, 0, length); 
     File.WriteAllBytes("C:\\myfile.txt",b1); 
     f1.Dispose(); 
    } 
+0

Bạn quên hủy bỏ FileStream. – Noldorin

+2

Anirudh, quen với việc sử dụng câu lệnh 'sử dụng' thay thế. xem câu trả lời của Erich ở trên. –

3

Bên cạnh đó với những gì người khác đã nói, tôi cũng sẽ đề nghị bạn sử dụng 'sử dụng' khoản vì tất cả các đối tượng thực hiện IDisposable.

using(FileStream outFileStream = new ...) 
using(ZOutputStream outZStream = new ...) 
using(FileStream inFileStream = new ...) 
{ 
    CopyStream(inFileStream, outZStream); 
} 
Các vấn đề liên quan