// Download file bytes from the HTTP response stream private void DownloadFile() { HttpWebRequest webRequest = null; HttpWebResponse webResponse = null; Stream responseStream = null; ThrottledStream throttledStream = null; MemoryStream downloadCache = null; speedUpdateCount = 0; recentAverageRate = 0; if (downloadRates.Count > 0) { downloadRates.Clear(); } try { if (this.IsBatch && !this.BatchUrlChecked) { CheckBatchUrl(); if (this.HasError) { this.RaiseDownloadCompleted(); return; } this.BatchUrlChecked = true; } if (!TempFileCreated) { // Reserve local disk space for the file CreateTempFile(); this.TempFileCreated = true; } this.lastStartTime = DateTime.UtcNow; if (this.Status == DownloadStatus.Waiting) { this.Status = DownloadStatus.Downloading; } // Create request to the server to download the file webRequest = (HttpWebRequest)WebRequest.Create(this.Url); webRequest.Method = "GET"; if (this.ServerLogin != null) { webRequest.PreAuthenticate = true; webRequest.Credentials = this.ServerLogin; } else { webRequest.Credentials = CredentialCache.DefaultCredentials; } if (this.Proxy != null) { webRequest.Proxy = this.Proxy; } else { webRequest.Proxy = WebRequest.DefaultWebProxy; } // Set download starting point webRequest.AddRange(DownloadedSize); // Get response from the server and the response stream webResponse = (HttpWebResponse)webRequest.GetResponse(); responseStream = webResponse.GetResponseStream(); // Set a 5 second timeout, in case of internet connection break responseStream.ReadTimeout = 5000; // Set speed limit long maxBytesPerSecond = 0; if (Settings.Default.EnableSpeedLimit) { maxBytesPerSecond = (long)((Settings.Default.SpeedLimit * 1024) / DownloadManager.Instance.ActiveDownloads); } else { maxBytesPerSecond = ThrottledStream.Infinite; } throttledStream = new ThrottledStream(responseStream, maxBytesPerSecond); // Create memory cache with the specified size downloadCache = new MemoryStream(this.MaxCacheSize); // Create 1KB buffer byte[] downloadBuffer = new byte[this.BufferSize]; int bytesSize = 0; CachedSize = 0; int receivedBufferCount = 0; // Download file bytes until the download is paused or completed while (true) { if (SpeedLimitChanged) { if (Settings.Default.EnableSpeedLimit) { maxBytesPerSecond = (long)((Settings.Default.SpeedLimit * 1024) / DownloadManager.Instance.ActiveDownloads); } else { maxBytesPerSecond = ThrottledStream.Infinite; } throttledStream.MaximumBytesPerSecond = maxBytesPerSecond; SpeedLimitChanged = false; } // Read data from the response stream and write it to the buffer bytesSize = throttledStream.Read(downloadBuffer, 0, downloadBuffer.Length); // If the cache is full or the download is paused or completed, write data from the cache to the temporary file if (this.Status != DownloadStatus.Downloading || bytesSize == 0 || this.MaxCacheSize < CachedSize + bytesSize) { // Write data from the cache to the temporary file WriteCacheToFile(downloadCache, CachedSize); this.DownloadedSize += CachedSize; // Reset the cache downloadCache.Seek(0, SeekOrigin.Begin); CachedSize = 0; // Stop downloading the file if the download is paused or completed if (this.Status != DownloadStatus.Downloading || bytesSize == 0) { break; } } // Write data from the buffer to the cache downloadCache.Write(downloadBuffer, 0, bytesSize); CachedSize += bytesSize; receivedBufferCount++; if (receivedBufferCount == this.BufferCountPerNotification) { this.RaiseDownloadProgressChanged(); receivedBufferCount = 0; } } // Update elapsed time when the download is paused or completed ElapsedTime = ElapsedTime.Add(DateTime.UtcNow - lastStartTime); // Change status if (this.Status != DownloadStatus.Deleting) { if (this.Status == DownloadStatus.Pausing) { this.Status = DownloadStatus.Paused; UpdateDownloadDisplay(); } else if (this.Status == DownloadStatus.Queued) { UpdateDownloadDisplay(); } else { this.CompletedOn = DateTime.UtcNow; this.RaiseDownloadCompleted(); } } } catch (Exception ex) { // Show error in the status this.StatusString = "Ошибка: " + ex.Message; this.HasError = true; this.RaiseDownloadCompleted(); } finally { // Close the response stream and cache, stop the thread if (responseStream != null) { responseStream.Close(); } if (throttledStream != null) { throttledStream.Close(); } if (webResponse != null) { webResponse.Close(); } if (downloadCache != null) { downloadCache.Close(); } if (DownloadThread != null) { DownloadThread.Abort(); } } }
// Download file bytes from the HTTP response stream private void DownloadFile() { HttpWebRequest webRequest = null; HttpWebResponse webResponse = null; Stream responseStream = null; ThrottledStream throttledStream = null; MemoryStream downloadCache = null; speedUpdateCount = 0; recentAverageRate = 0; if (downloadRates.Count > 0) downloadRates.Clear(); try { if (this.IsBatch && !this.BatchUrlChecked) { CheckBatchUrl(); if (this.HasError) { this.RaiseDownloadCompleted(); return; } this.BatchUrlChecked = true; } if (!TempFileCreated) { // Reserve local disk space for the file CreateTempFile(); this.TempFileCreated = true; } this.lastStartTime = DateTime.UtcNow; if (this.Status == DownloadStatus.Waiting) this.Status = DownloadStatus.Downloading; // Create request to the server to download the file webRequest = (HttpWebRequest)WebRequest.Create(this.Url); webRequest.Method = "GET"; if (this.ServerLogin != null) { webRequest.PreAuthenticate = true; webRequest.Credentials = this.ServerLogin; } else { webRequest.Credentials = CredentialCache.DefaultCredentials; } if (this.Proxy != null) { webRequest.Proxy = this.Proxy; } else { webRequest.Proxy = WebRequest.DefaultWebProxy; } // Set download starting point webRequest.AddRange(DownloadedSize); // Get response from the server and the response stream webResponse = (HttpWebResponse)webRequest.GetResponse(); responseStream = webResponse.GetResponseStream(); // Set a 5 second timeout, in case of internet connection break responseStream.ReadTimeout = 5000; // Set speed limit long maxBytesPerSecond = 0; if (Settings.Default.EnableSpeedLimit) { maxBytesPerSecond = (long)((Settings.Default.SpeedLimit * 1024) / DownloadManager.Instance.ActiveDownloads); } else { maxBytesPerSecond = ThrottledStream.Infinite; } throttledStream = new ThrottledStream(responseStream, maxBytesPerSecond); // Create memory cache with the specified size downloadCache = new MemoryStream(this.MaxCacheSize); // Create 1KB buffer byte[] downloadBuffer = new byte[this.BufferSize]; int bytesSize = 0; CachedSize = 0; int receivedBufferCount = 0; // Download file bytes until the download is paused or completed while (true) { if (SpeedLimitChanged) { if (Settings.Default.EnableSpeedLimit) { maxBytesPerSecond = (long)((Settings.Default.SpeedLimit * 1024) / DownloadManager.Instance.ActiveDownloads); } else { maxBytesPerSecond = ThrottledStream.Infinite; } throttledStream.MaximumBytesPerSecond = maxBytesPerSecond; SpeedLimitChanged = false; } // Read data from the response stream and write it to the buffer bytesSize = throttledStream.Read(downloadBuffer, 0, downloadBuffer.Length); // If the cache is full or the download is paused or completed, write data from the cache to the temporary file if (this.Status != DownloadStatus.Downloading || bytesSize == 0 || this.MaxCacheSize < CachedSize + bytesSize) { // Write data from the cache to the temporary file WriteCacheToFile(downloadCache, CachedSize); this.DownloadedSize += CachedSize; // Reset the cache downloadCache.Seek(0, SeekOrigin.Begin); CachedSize = 0; // Stop downloading the file if the download is paused or completed if (this.Status != DownloadStatus.Downloading || bytesSize == 0) { break; } } // Write data from the buffer to the cache downloadCache.Write(downloadBuffer, 0, bytesSize); CachedSize += bytesSize; receivedBufferCount++; if (receivedBufferCount == this.BufferCountPerNotification) { this.RaiseDownloadProgressChanged(); receivedBufferCount = 0; } } // Update elapsed time when the download is paused or completed ElapsedTime = ElapsedTime.Add(DateTime.UtcNow - lastStartTime); // Change status if (this.Status != DownloadStatus.Deleting) { if (this.Status == DownloadStatus.Pausing) { this.Status = DownloadStatus.Paused; UpdateDownloadDisplay(); } else if (this.Status == DownloadStatus.Queued) { UpdateDownloadDisplay(); } else { this.CompletedOn = DateTime.UtcNow; this.RaiseDownloadCompleted(); } } } catch (Exception ex) { // Show error in the status this.StatusString = "Error: " + ex.Message; this.HasError = true; this.RaiseDownloadCompleted(); } finally { // Close the response stream and cache, stop the thread if (responseStream != null) { responseStream.Close(); } if (throttledStream != null) { throttledStream.Close(); } if (webResponse != null) { webResponse.Close(); } if (downloadCache != null) { downloadCache.Close(); } if (DownloadThread != null) { DownloadThread.Abort(); } } }