2011-11-28 34 views
6

Mã của tôi là thế này:C# Đúc MemoryStream để FileStream

byte[] byteArray = Encoding.ASCII.GetBytes(someText); 
MemoryStream stream = new MemoryStream(byteArray); 
StreamReader reader = new StreamReader(stream); 
FileStream file = (FileStream)reader.BaseStream; 

Sau đó tôi đang sử dụng file.Name.

tôi nhận được một InvalidCastException: nó sẽ hiển thị sau

Không thể cast đối tượng của loại 'System.IO.MemoryStream' gõ 'System.IO.FileStream'.

Tôi đọc ở đâu đó rằng tôi chỉ cần thay đổi FileStream thành Luồng. Tôi có nên làm gì khác không?

+3

Cách tiếp cận này sai. Bạn đang cố gắng đạt được điều gì? – Snowbear

+4

Không rõ bạn muốn làm gì. Một 'MemoryStream' chắc chắn không thể được đưa vào một' FileStream', và trong khi bạn có thể truyền tới 'Stream', lớp đó không có thuộc tính' .Name'. Bạn đang cố gắng làm gì? Bạn theo tên nào? –

Trả lời

16

A MemoryStream không được liên kết với tệp và không có khái niệm về tên tệp. Về cơ bản, bạn không thể làm điều đó.

Bạn chắc chắn không thể truyền giữa chúng; bạn chỉ có thể ném lên trên xuống dưới - không nghiêng sang một bên; để hình dung:

 Stream 
      | 
    --------------- 
    |    | 
FileStream MemoryStream 

Bạn có thể cast một MemoryStream đến một Stream trivially, và một Stream đến một MemoryStream qua một loại kiểm tra; nhưng không bao giờ là FileStream đến MemoryStream. Điều đó giống như nói một con chó là một con vật, và một con voi là một con vật, vì vậy chúng ta có thể đúc một con chó cho một con voi.

Bạn thể lớp con MemoryStream và thêm một tài sản Name (mà bạn cung cấp giá trị cho), nhưng vẫn sẽ không có tương đồng giữa một FileStreamYourCustomMemoryStream, và FileStream không thực hiện một giao diện từ trước đến nhận được Name; do đó người gọi sẽ phải rõ ràng xử lý cả hai cách riêng biệt hoặc sử dụng kiểu gõ vịt (có thể thông qua dynamic hoặc phản chiếu).

Tùy chọn khác (có lẽ dễ dàng hơn) có thể là: ghi dữ liệu của bạn vào tệp tạm thời; sử dụng một số FileStream từ đó; sau đó (sau) xóa tệp.

3

Thao tác này không thể thực hiện được. Cả hai số FileStreamMemoryStream đều có nguồn gốc từ Stream, vì vậy chúng là các loại anh chị em. Nói chung, trong trường hợp sau:

public class A { } 
public class B : A { } 
public class C : A { } 

Không thể truyền B đến C hoặc ngược lại. Không có mối quan hệ "là-a" giữa B và C.

4

Bạn có thể so sánh Stream với động vật, MemoryStream với chú chó và FileStream với mèo. Mặc dù một con chó là một con vật, và một con mèo là một con vật, một con chó chắc chắn không phải là một con mèo.

Nếu bạn muốn sao chép dữ liệu từ một luồng này sang luồng khác, bạn sẽ cần phải tạo cả hai luồng, đọc từ một luồng và ghi vào luồng kia.