2011-10-19 81 views
6

我做了一些快速的方法來從流中寫入文件,但尚未完成。我收到這個例外,我找不到原因:無法讀取超過流末尾

Unable to read beyond the end of the stream 

有沒有人可以幫我調試它?

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; 
} 

非常感謝!

回答

5

不是一個真正的回答你的問題,但這種方法也能像這樣簡單的這麼多:

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); 
    } 
} 

請注意,我也去掉了返回值,因爲它的幾乎沒用,因爲在你的代碼中,只有1個返回語句

除此之外,你對流執行一個長度檢查,但許多流不支持檢查長度。

至於你的問題,你首先檢查流是否在其結束。如果不是,則讀取4個字節。這是問題。假設你有一個6字節的輸入流。首先檢查流是否在其結尾。答案是否定的,因爲剩下6個字節。您讀取4個字節並再次檢查。當然,答案仍然是否定的,因爲剩下2個字節。現在你讀了另外4個字節,但是因爲只有2個字節,所以當然失敗了。 (readInt32讀取下4個字節)。

+0

令人驚歎,像你說的那麼簡單!非常感謝 :-) – TomShreds

1

您正在做while(pos <長度),length是流的實際長度(以字節爲單位)。因此,您正在有效地計算流中的字節數,然後嘗試讀取很多整數(這是不正確的)。因爲Int32是4個字節,所以你可以把長度設爲stream.Length/4。

0

嘗試

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

我假定輸入流中有僅整數(Int32)已。你需要測試PeekChar()方法,

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

請注意,這根本沒有效率。 'PeekChar'實際上會保存主流中的當前位置,讀取一個int,然後再次設置位置! –

0

在通過二進制閱讀器讀取流之後,流的位置在最後,必須將位置設置爲零「stream.position = 0;」