2012-05-01 25 views
0

私は、URLからファイルをダウンロードする簡単なコードを書いています。このコードは、Windows 7で完璧に動作し、ファイルをすばやくダウンロードし、進行状況を示す進行状況バーを維持します。しかし、Windows XP SP2から同じコードを実行すると、.NET IOExceptionが生成されます。 、なぜそれが機能しないのかはわかりません。それは、同じ始まり正しく最初の読み取りを完了してから、ストリームから読み取るための第2の試みで、次の例外がスローされます:ダウンロードコードはWindows 7では動作しますが、XP SP2では動作しませんか?

System.IO.IOException: Unable to read data from the transport connection: An operation on a 
socket could not be performed because the system lacked sufficient buffer space or because a 
queue was full. ---> 

System.Net.Sockets.SocketException: An operation on a socket could not be 
performed because the system lacked sufficient buffer space or because a queue was full 
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 

at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
--- End of inner exception stack trace --- 
at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
at ServicePackChk.SrvPackChk.DownLoadServicePack(Boolean bWindowsXP) 
at ServicePackChk.SrvPackChk.CheckServicePackStatus() 
at ServicePackChk.Form1.Form1_Load(Object sender, EventArgs e) 
at System.Windows.Forms.Form.OnLoad(EventArgs e) 

CODE:

 Uri uri; 

     if (bWindowsXP) 
      uri = new Uri("http://download.microsoft.com/download/d/3/0/d30e32d8-418a-469d-b600-f32ce3edf42d/WindowsXP-KB936929-SP3-x86-ENU.exe"); 
     else 
      uri = null; 

     WebRequest req = WebRequest.Create(uri); 
     WebResponse resp = req.GetResponse(); 

     ProgBarForm pform = new ProgBarForm(); 

     updateEvent += new SrvPackChk.UpdateDownloaded(pform.UpdateProgBar); 

     Stream stream = resp.GetResponseStream(); 
     ArrayList alBytes = new ArrayList(); 
     int nLen = (int)resp.ContentLength; 


     pform.DownLoadSize = nLen; 

     pform.Show(); 

     byte[] byExe = new byte[nLen]; 

     bool bMoreToDownload = true; 

     FileStream fs = new FileStream(System.IO.Path.GetTempPath() + "XPSP3.exe", FileMode.Create); 

     MessageBox.Show("Saving File to " + System.IO.Path.GetTempPath() + "XPSP3.exe"); 

     while (bMoreToDownload) 
     { 
      Application.DoEvents(); 

      int nRead = 0; 

      nRead = stream.Read(byExe, 0, nLen); 

      nDownloaded += nRead; 

      updateEvent(nDownloaded); 

      if (nDownloaded == nLen) 
      { 
       bMoreToDownload = false; 
      } 

      fs.Write(byExe, 0, nRead); 
      fs.Flush(); 

      Application.DoEvents(); 
     } 

     stream.Close(); 

     fs.Close(); 
+0

'resp.ContentLength'バイト配列を割り当てる代わりに、チャンクを読み込みます。 –

答えて

1

あなたがダウンロードしたファイルは300メガバイト以上を持っていますストリームから1つを読み込もうとします。

ストリームをブロック単位で読み取る方がよい場合があります(例:4MByteブロック)。

+0

とにかくブロックの読み込み、私は全体の長さを求めるが、私はデータのチャンクを取得する、変数nRead = 78288は、XPでの最初の成功読書、その後の読み取り例外をスローするので、私はこの問題を確実に見ることができない? –

+0

次の読み取りのサイズはどのくらいですか?ストリームを読み込んだときに何が起こるかを見るために、nLenよりも小さな値を渡すことができます。 – thumbmunkeys

+0

2回目の読み取りは、それ以降の読み取りと同様に例外をスローします。私はnLen - nDownloadedを試しましたが、プログラムは読み込みが戻るのを待っていました。 –

関連する問題