2011-10-19 25 views
6

Tôi đã thực hiện một số phương pháp nhanh để viết tệp từ luồng nhưng chưa hoàn thành. Tôi nhận được ngoại lệ này và tôi không thể tìm thấy lý do:Không thể đọc ngoài phần cuối luồng

Unable to read beyond the end of the stream 

Có ai có thể giúp tôi gỡ lỗi không?

public static bool WriteFileFromStream(Stream stream, string toFile) 
{ 
    FileStream fileToSave = new FileStream(toFile, FileMode.Create); 
    BinaryWriter binaryWriter = new BinaryWriter(fileToSave); 

    using (BinaryReader binaryReader = new BinaryReader(stream)) 
    { 
     int pos = 0; 
     int length = (int)stream.Length; 

     while (pos < length) 
     { 
      int readInteger = binaryReader.ReadInt32(); 

      binaryWriter.Write(readInteger); 

      pos += sizeof(int); 
     } 
    } 

    return true; 
} 

Cảm ơn rất nhiều!

Trả lời

5

Không thực sự là một câu trả lời cho câu hỏi của bạn, nhưng phương pháp này có thể đơn giản hơn rất nhiều như thế này:

public static void WriteFileFromStream(Stream stream, string toFile) 
{ 
    // dont forget the using for releasing the file handle after the copy 
    using (FileStream fileToSave = new FileStream(toFile, FileMode.Create)) 
    { 
     stream.CopyTo(fileToSave); 
    } 
} 

Lưu ý rằng tôi cũng loại bỏ các giá trị trả về từ trước đến nay khá nhiều từ vô dụng trong mã của bạn, chỉ có 1 câu lệnh return

Ngoài ra, bạn thực hiện kiểm tra Độ dài trên luồng nhưng nhiều luồng không hỗ trợ kiểm tra Độ dài.

Đối với vấn đề của bạn, trước tiên bạn hãy kiểm tra xem luồng có ở cuối mục hay không. Nếu không, bạn đọc 4 byte. Đây là vấn đề. Giả sử bạn có luồng đầu vào là 6 byte. Trước tiên, bạn kiểm tra xem luồng có ở cuối mục hay không. Câu trả lời là không có kể từ khi có 6 byte còn lại. Bạn đọc 4 byte và kiểm tra lại. Ofcourse câu trả lời là vẫn không có kể từ khi có 2 byte còn lại. Bây giờ bạn đã đọc 4 byte khác nhưng mã nguồn không thành công vì chỉ có 2 byte. (readInt32 đọc 4 byte tiếp theo).

+0

Tuyệt vời, đơn giản hơn nhiều như bạn đã nói! Cảm ơn rất nhiều :-) – TomShreds

1

Bạn đang làm trong khi (pos < chiều dài) và độ dài là độ dài thực tế của luồng theo byte. Vì vậy, bạn đang đếm các byte trong luồng một cách hiệu quả và sau đó cố gắng đọc nhiều số int đó (không chính xác). Bạn có thể mất nhiều thời gian để được stream.Length/4 vì Int32 là 4 byte.

0

thử

int length = (int)binaryReader.BaseStream.Length; 
2

Tôi đoán rằng input stream có ints chỉ (Int32). Bạn cần phải kiểm tra phương pháp PeekChar(),

while (binaryReader.PeekChar() != -1) 
{ 
    int readInteger = binaryReader.ReadInt32(); 
    binaryWriter.Write(readInteger);   
} 
+0

lưu ý rằng điều này không hiệu quả chút nào. 'PeekChar' sẽ thực sự lưu vị trí hiện tại từ luồng chính, đọc một int, và một lần nữa thiết lập vị trí! –

0

Sau khi đọc luồng của trình đọc nhị phân vị trí của luồng ở cuối, bạn phải đặt vị trí thành 0 "stream.position = 0;"

Các vấn đề liên quan