2013-01-04 51 views
0

我想在Windows.Storage.Streams.DataReader類上實現名爲ReadToEnd的擴展方法。這應該基本上讀取流中的所有可用數據,如System.IO.StreamReader。StreamSocket DataReader ReadToEnd擴展方法

試圖使我的非兼容WinRT代碼移植儘可能簡單。

我不知道如何實現這個目標,或者甚至可能。

+1

'System.IO.Stream'沒有'ReadToEnd()'方法。你在談論'System.IO.TextReader.ReadToEnd()'嗎?另外爲什麼在你的問題標題中有'StreamSocket'?這與你的問題有什麼關係? –

+0

嗨達林。你是對的。相應的推薦問題。關於StreamSocket,我引用它,因爲您通常將DataReader與此結合使用。有希望的是,已經與StreamSocket一起工作過的開發人員會有一個解決方案,因爲他們可能做了類似的事情。 – c0D3l0g1c

+0

當你正在處理具有「ReadToEnd」操作的網絡流沒有任何意義。如果沒有更多數據可用,並且代碼將掛起,則來自套接字的讀取將會被阻止。通常當你處理套接字時,你正在使用一些基於TCP的協議,例如HTTP。每個協議都應該有一個方法來指定有多少數據可用於讀取,否則客戶端將不知道要讀取多少數據,並且如果他試圖讀取更多數據將會掛起。例如,在HTTP協議中,服務器通過「Content-Length」響應頭來表明這一點。 –

回答

0

管理寫給我的東西,我需要什麼。

internal static string ReadLine(this DataReader stream, ref int maxLength, Encoding encoding, char? termChar) 
{ 
    var maxLengthSpecified = maxLength > 0; 
    int i; 
    byte b = 0, b0; 
    var read = false; 
    using (var mem = new MemoryStream()) 
    { 
     while (true) 
     { 
      b0 = b; 
      i = stream.ReadByte(); 
      if (i == -1) break; 
      else read = true; 

      b = (byte)i; 
      if (maxLengthSpecified) maxLength--; 

      if (maxLengthSpecified && mem.Length == 1 && b == termChar && b0 == termChar) 
      { 
       maxLength++; 
       continue; 
      } 

      if (b == 10 || b == 13) 
      { 
       if (mem.Length == 0 && b == 10) 
       { 
        continue; 
       } 
       else break; 
      } 

      mem.WriteByte(b); 
      if (maxLengthSpecified && maxLength == 0) 
       break; 
     } 

     if (mem.Length == 0 && !read) return null; 
     return encoding.GetString(mem.ToArray(), 0, (int)mem.Length); 
    } 
}