public static void Main() { bool useDownloadSpeedThrottling = false; // Please insert an URL of a large file here, otherwise the download will be finished too quickly to really demonstrate the functionality. var url = new Uri("http://yourdomain.com/yourfile.zip"); var file = new System.IO.FileInfo("yourfile.zip"); var requestBuilder = new SimpleWebRequestBuilder(); var dlChecker = new DownloadChecker(); var httpDlBuilder = new SimpleDownloadBuilder(requestBuilder, dlChecker); var timeForHeartbeat = 3000; var timeToRetry = 5000; var maxRetries = 5; var resumingDlBuilder = new ResumingDownloadBuilder(timeForHeartbeat, timeToRetry, maxRetries, httpDlBuilder); List <DownloadRange> alreadyDownloadedRanges = null; var bufferSize = 4096; var numberOfParts = 4; var maxRetryDownloadParts = 2; var download = new MultiPartDownload(url, bufferSize, numberOfParts, resumingDlBuilder, requestBuilder, dlChecker, alreadyDownloadedRanges, maxRetryDownloadParts); var speedMonitor = new DownloadSpeedMonitor(maxSampleCount: 128); speedMonitor.Attach(download); var progressMonitor = new DownloadProgressMonitor(); progressMonitor.Attach(download); if (useDownloadSpeedThrottling) { var downloadThrottling = new DownloadThrottling(maxBytesPerSecond: 200 * 1024, maxSampleCount: 128); downloadThrottling.Attach(download); } var dlSaver = new DownloadToFileSaver(file); dlSaver.Attach(download); download.DownloadCompleted += OnCompleted; download.DownloadCancelled += OnDownloadCancelled; download.DownloadStopped += OnDownloadStopped; download.Start(); while (!finished) { Thread.Sleep(1000); var alreadyDownloadedSizeInBytes = progressMonitor.GetCurrentProgressInBytes(download); var totalDownloadSizeInBytes = progressMonitor.GetTotalFilesizeInBytes(download); var currentSpeedInBytesPerSecond = speedMonitor.GetCurrentBytesPerSecond(); var currentProgressInPercent = progressMonitor.GetCurrentProgressPercentage(download) * 100; var alreadyDownloadedSizeInKiB = (alreadyDownloadedSizeInBytes / 1024); var totalDownloadSizeInKiB = (totalDownloadSizeInBytes / 1024); var currentSpeedInKiBPerSecond = (currentSpeedInBytesPerSecond / 1024); var remainingTimeInSeconds = currentSpeedInBytesPerSecond == 0 ? 0 : (totalDownloadSizeInBytes - alreadyDownloadedSizeInBytes) / currentSpeedInBytesPerSecond; Console.WriteLine( "Progress: " + currentProgressInPercent + "% " + "(" + alreadyDownloadedSizeInKiB + " of " + totalDownloadSizeInKiB + " KiB)" + " Speed: " + currentSpeedInKiBPerSecond + " KiB/sec." + " Remaining time: " + remainingTimeInSeconds + " sec."); } }
/// <summary> /// Update Downlaoder /// </summary> /// <param name="downloadurl">file url to download</param> public void DownloadUpdate() { bool useDownloadSpeedThrottling = false; var file = new FileInfo(Path.GetFileName(DownloadUrl.ToString())); var requestBuilder = new SimpleWebRequestBuilder(); var dlChecker = new DownloadChecker(); var httpDlBuilder = new SimpleDownloadBuilder(requestBuilder, dlChecker); var timeForHeartbeat = 3000; var timeToRetry = 5000; var maxRetries = 25; var resumingDlBuilder = new ResumingDownloadBuilder(timeForHeartbeat, timeToRetry, maxRetries, httpDlBuilder); List <DownloadRange> alreadyDownloadedRanges = null; var bufferSize = 4096; var numberOfParts = 4; var download = new MultiPartDownload(DownloadUrl, bufferSize, numberOfParts, resumingDlBuilder, requestBuilder, dlChecker, alreadyDownloadedRanges); var speedMonitor = new DownloadSpeedMonitor(maxSampleCount: 50000); speedMonitor.Attach(download); var progressMonitor = new DownloadProgressMonitor(); progressMonitor.Attach(download); if (useDownloadSpeedThrottling) { var downloadThrottling = new DownloadThrottling(maxBytesPerSecond: 200 * 10024, maxSampleCount: 1288); downloadThrottling.Attach(download); } var dlSaver = new DownloadToFileSaver(file); dlSaver.Attach(download); download.DownloadCompleted += OnCompleted; download.Start(); while (!DownloadFinished) { var alreadyDownloadedSizeInBytes = progressMonitor.GetCurrentProgressInBytes(download); var totalDownloadSizeInBytes = progressMonitor.GetTotalFilesizeInBytes(download); var currentSpeedInBytesPerSecond = speedMonitor.GetCurrentBytesPerSecond(); var currentProgressInPercent = progressMonitor.GetCurrentProgressPercentage(download) * 100; var alreadyDownloadedSizeInKiB = (alreadyDownloadedSizeInBytes / 1024); var totalDownloadSizeInKiB = (totalDownloadSizeInBytes / 1024); var currentSpeedInKiBPerSecond = (currentSpeedInBytesPerSecond / 1024); var remainingTimeInSeconds = currentSpeedInBytesPerSecond == 0 ? 0 : (totalDownloadSizeInBytes - alreadyDownloadedSizeInBytes) / currentSpeedInBytesPerSecond; DownloaderProgress.Progress = currentProgressInPercent; DownloaderProgress.DownlaodedSize = alreadyDownloadedSizeInKiB; DownloaderProgress.TotalSize = totalDownloadSizeInKiB; DownloaderProgress.Speed = currentSpeedInKiBPerSecond; DownloaderProgress.RemainingTime = remainingTimeInSeconds; } }
public DownloadInfo StartDownload(string src, string dst) { var url = new Uri(src); var file = new System.IO.FileInfo(dst); var requestBuilder = new SimpleWebRequestBuilder(); var dlChecker = new DownloadChecker(); var httpDlBuilder = new SimpleDownloadBuilder(requestBuilder, dlChecker); var rdlBuilder = new ResumingDownloadBuilder(3000, 5000, 5, httpDlBuilder); var download = new MultiPartDownload(url, 4096, 4, rdlBuilder, requestBuilder, dlChecker, null); var dlSaver = new DownloadToFileSaver(file); var speedMonitor = new DownloadSpeedMonitor(128); var info = new DownloadInfo(progressMonitor, speedMonitor, download, src, dst); speedMonitor.Attach(download); progressMonitor.Attach(download); dlSaver.Attach(download); download.DownloadCompleted += (x) => OnCompleted(x, info); download.Start(); return(info); }
public static void Main() { // Please insert an URL of a large file here, otherwise the download will be finished too quickly to really demonstrate the functionality. var url = new Uri("https://raw.githubusercontent.com/Toqe/Downloader/master/README.md"); var file = new System.IO.FileInfo("README.md"); var requestBuilder = new SimpleWebRequestBuilder(); var dlChecker = new DownloadChecker(); var httpDlBuilder = new SimpleDownloadBuilder(requestBuilder, dlChecker); var timeForHeartbeat = 3000; var timeToRetry = 5000; var maxRetries = 5; var resumingDlBuilder = new ResumingDownloadBuilder(timeForHeartbeat, timeToRetry, maxRetries, httpDlBuilder); List <DownloadRange> alreadyDownloadedRanges = null; var bufferSize = 4096; var numberOfParts = 4; var download = new MultiPartDownload(url, bufferSize, numberOfParts, resumingDlBuilder, requestBuilder, dlChecker, alreadyDownloadedRanges); var speedMonitor = new DownloadSpeedMonitor(maxSampleCount: 32); speedMonitor.Attach(download); var progressMonitor = new DownloadProgressMonitor(); progressMonitor.Attach(download); var dlSaver = new DownloadToFileSaver(file); dlSaver.Attach(download); download.DownloadCompleted += OnCompleted; download.Start(); while (!finished) { Thread.Sleep(1000); Console.WriteLine( "Progress: " + (progressMonitor.GetCurrentProgressPercentage(download) * 100) + "% " + "(" + (progressMonitor.GetCurrentProgressInBytes(download) / 1024) + " of " + (progressMonitor.GetTotalFilesizeInBytes(download) / 1024) + " KiB)" + " Speed: " + (speedMonitor.GetCurrentBytesPerSecond() / 1024) + " KiB/sec."); } }
/// <summary> /// Downloads the response of an HTTP request and saves it as a file. /// </summary> /// <param name="url">The URL of the request.</param> /// <param name="container">The cookie container used to store cookies in the connection.</param> /// <param name="file">The file the data is written to.</param> /// <param name="progress">A progress object used to report the progress of the operation.</param> /// <param name="cancellationToken">A cancelation token that can be used to cancel the operation.</param> public static async Task DownloadFileAsync(Uri url, CookieContainer container, FileInfo file, IProgress <double> progress, CancellationToken cancellationToken) { try { if (ServicePointManager.DefaultConnectionLimit <= 4) { ServicePointManager.DefaultConnectionLimit = 5; } var requestBuilder = new SimpleWebRequestBuilder(null); var dlChecker = new DownloadChecker(); var rdlBuilder = new ResumingDownloadBuilder(3000, 5000, 5, new SimpleDownloadBuilder(requestBuilder, dlChecker)); System.Collections.Generic.List <DownloadRange> range = null; var download = new MultiPartDownload(url, 65536, 3, rdlBuilder, requestBuilder, dlChecker, range); SemaphoreSlim signal = new SemaphoreSlim(0, 1); bool Complete = false; double getDownloadPercent(MultiPartDownload downloads) { long downloaded = 0; long filesize = 0; foreach (var a in downloads.AlreadyDownloadedRanges) { downloaded += a.End - a.Start; filesize = (a.End > filesize) ? a.End : filesize; } foreach (var a in downloads.ToDoRanges) { filesize = (a.End > filesize) ? a.End : filesize; } filesize = filesize + 1; return(Convert.ToDouble(downloaded) / Convert.ToDouble(filesize)); } void Download_DataReceived(Toqe.Downloader.Business.Contract.Events.DownloadDataReceivedEventArgs args) { if (cancellationToken.IsCancellationRequested) { download.Stop(); return; } progress.Report(getDownloadPercent(download)); } void Download_Completed(Toqe.Downloader.Business.Contract.Events.DownloadEventArgs args) { Complete = true; } download.DataReceived += Download_DataReceived; download.DownloadCompleted += Download_Completed; var dlSaver = new DownloadToFileSaver(file); dlSaver.Attach(download); void threadedDownload() { download.Start(); ManualResetEventSlim mres = new ManualResetEventSlim(false); Random RND = new Random(); for (int wait = 0; wait < RND.Next(55, 80); wait++) { mres.Wait(1000); if (Complete) { signal.Release(); return; } } while (true) { range = download.AlreadyDownloadedRanges; download.Stop(); download = new MultiPartDownload(url, 65536, 3, rdlBuilder, requestBuilder, dlChecker, range); download.DataReceived += Download_DataReceived; download.DownloadCompleted += Download_Completed; dlSaver.Attach(download); download.Start(); for (int wait = 0; wait < RND.Next(40, 80); wait++) { mres.Wait(1000); if (Complete || download.ToDoRanges.Count == 0) { download.Stop(); signal.Release(); return; } } } } Thread th = new Thread(new ThreadStart(threadedDownload)); th.Start(); await signal.WaitAsync(); dlSaver.DetachAll(); Complete = true; if (th.ThreadState == ThreadState.Running) { th.Abort(); } return; } catch (TaskCanceledException) { if (file.Exists) { file.Delete(); } } catch (Exception) { if (file.Exists) { file.Delete(); } throw; } try { var handler = new HttpClientHandler(); if (container != null) { handler.CookieContainer = container; handler.UseCookies = true; } using (var client = new HttpClient(handler, true)) { client.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgent); HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellationToken); response.EnsureSuccessStatusCode(); using (Stream data = await response.Content.ReadAsStreamAsync()) { long?fileSize = response.Content.Headers.ContentLength; if (file.Directory?.Exists == false) { file.Directory.Create(); } using (Stream fs = file.OpenWrite()) { byte[] buffer = new byte[8192]; int byteCount; do { byteCount = await data.ReadAsync(buffer, 0, buffer.Length, cancellationToken); if (byteCount > 0) { await fs.WriteAsync(buffer, 0, byteCount, cancellationToken); } if (fileSize.HasValue) { progress.Report((double)fs.Length / fileSize.Value); } } while (byteCount > 0); } } progress.Report(1); } } catch (TaskCanceledException) { if (file.Exists) { file.Delete(); } } catch (Exception) { if (file.Exists) { file.Delete(); } throw; } }