私は、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();
'resp.ContentLength'バイト配列を割り当てる代わりに、チャンクを読み込みます。 –