Ejemplo n.º 1
0
        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.");
            }
        }
Ejemplo n.º 2
0
        /// <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;
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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.");
            }
        }
Ejemplo n.º 5
0
        /// <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;
            }
        }