2010-09-22 2 views
10

Phương pháp tốt nhất để chuyển đổi luồng thành một luồng tập tin bằng C#.Chuyển đổi một luồng thành một FileStream trong C#

Chức năng tôi đang làm việc trên có Luồng được truyền tới nó chứa dữ liệu đã tải lên và tôi cần có thể thực hiện các phương thức stream.ead(), stream.Seek() là các phương thức của loại FileStream.

Một dàn diễn viên đơn giản không hoạt động, vì vậy tôi yêu cầu trợ giúp ở đây.

+0

Tại sao không truyền tác phẩm? Loại đối tượng Stream đến của bạn là gì? –

+2

Thao tác vô lý. Nếu luồng không hỗ trợ 'Read/Seek' - thì việc truyền sẽ không giúp ích gì. – zerkms

Trả lời

18

ReadSeek là các phương pháp trên loại Stream, không chỉ FileStream. Nó chỉ là không phải mọi luồng đều hỗ trợ chúng. (Cá nhân tôi thích sử dụng số Position property qua số điện thoại Seek, nhưng chúng sẽ đun sôi xuống cùng một thứ.)

Nếu bạn muốn có dữ liệu trong bộ nhớ đổ nó vào một tệp, tại sao không chỉ đọc tất cả vào một MemoryStream ? Điều đó hỗ trợ tìm kiếm. Ví dụ:

public static MemoryStream CopyToMemory(Stream input) 
{ 
    // It won't matter if we throw an exception during this method; 
    // we don't *really* need to dispose of the MemoryStream, and the 
    // caller should dispose of the input stream 
    MemoryStream ret = new MemoryStream(); 

    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     ret.Write(buffer, 0, bytesRead); 
    } 
    // Rewind ready for reading (typical scenario) 
    ret.Position = 0; 
    return ret; 
} 

Sử dụng:

using (Stream input = ...) 
{ 
    using (Stream memory = CopyToMemory(input)) 
    { 
     // Seek around in memory to your heart's content 
    } 
} 

này cũng tương tự như việc sử dụng các phương pháp Stream.CopyTo giới thiệu trong .NET 4.

Nếu bạn thực sự muốn ghi vào hệ thống tập tin, bạn có thể làm một cái gì đó tương tự như lần đầu tiên ghi vào tập tin sau đó tua lại dòng ... nhưng sau đó bạn sẽ cần phải chăm sóc xóa nó sau đó, để tránh xả rác đĩa của bạn với các tập tin.