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."); } }
private void addAndCheck(DownloadSpeedMonitor monitor, int seconds, int size, long speed) { DateTime time = beginTime.AddSeconds(seconds); monitor.Add(time, size); Assert.AreEqual(speed, monitor.Speed(time)); }
public DownloadInfo(DownloadProgressMonitor dpm, DownloadSpeedMonitor dsm, MultiPartDownload mpd, string src, string dst) { _dpm = dpm; _dsm = dsm; _mpd = mpd; Url = src; File = dst; }
/// <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; } }
void StopDownload() { speedMonitor?.DetachAll(); speedMonitor = null; dlSaver?.DetachAll(); dlSaver = null; download?.Stop(); download = null; requestBuilder = null; httpDlBuilder = null; rdlBuilder = null; dlChecker = null; httpDlBuilder = null; GC.Collect(); }
public void StartDownload() { Debugger.Log("start download: {0}", downloadUrl); var url = new Uri(downloadUrl); var requestBuilder = new SimpleWebRequestBuilder(); bool needDownload = false; long fileLength = 0; string path = Path.GetDirectoryName(localPath); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } using (FileStream fileStream = new FileStream(localPath, FileMode.OpenOrCreate, FileAccess.Write)) { fileLength = fileStream.Length; totalLength = requestBuilder.GetFileLength(downloadUrl); if (fileLength < totalLength) { needDownload = true; } } if (needDownload) { var dlChecker = new DownloadChecker(); var httpDlBuilder = new SimpleDownloadBuilder(requestBuilder, dlChecker); var timeForHeartbeat = 3000; var timeToRetry = 5000; var maxRetries = 8; var bufferSize = 2048; downloader = new ResumingDownload(url, bufferSize, fileLength, null, timeForHeartbeat, timeToRetry, maxRetries, httpDlBuilder); speedMonitor = new DownloadSpeedMonitor(128); speedMonitor.Attach(downloader); progressMonitor = new DownloadProgressMonitor(); progressMonitor.Attach(downloader); var dlSaver = new DownloadToFileSaver(localPath, OnGetFileWriteException); dlSaver.Attach(downloader); downloader.DownloadCompleted += OnCompleted; downloader.DownloadCancelled += OnCancelled; downloader.Start(); } else { OnCompleted(null); } }
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 void TestDownloadSpeedMonitor() { DownloadSpeedMonitor monitor = new DownloadSpeedMonitor(); Assert.AreEqual(0, monitor.Speed(beginTime)); addAndCheck(monitor, 0, 10, 0); addAndCheck(monitor, 1, 100, 100); addAndCheck(monitor, 2, 200, 150); addAndCheck(monitor, 3, 300, 200); for (int i = 4; i <= 10; i++) { addAndCheck(monitor, i, 200, 200); } addAndCheck(monitor, 11, 200, 210); addAndCheck(monitor, 12, 200, 210); addAndCheck(monitor, 13, 200, 200); for (int i = 14; i <= 1000; i++) { addAndCheck(monitor, i, 200, 200); } }
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."); } }
public void StartDownload(string DownloadUrl, string SavePath = null) { RemainingTime = DownloadSpeed = 0; AvrDownload = new List <int>() { 0 }; AvrTime = new List <long>(0) { 0 }; dlUri = new Uri(DownloadUrl); TempDirectoryName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, TempDirectoryName); FinishedDirectoryName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, FinishedDirectoryName); requestBuilder = new SimpleWebRequestBuilder(); dlChecker = new DownloadChecker(); httpDlBuilder = new SimpleDownloadBuilder(requestBuilder, dlChecker); rdlBuilder = new SDResumine(timeForHeartbeat, timeToRetry, maxRetries, httpDlBuilder); download = new MultiPartDownload(dlUri, bufferSize, numberOfParts, rdlBuilder, requestBuilder, dlChecker, null); download.DownloadCompleted += DownloadCompleted; download.DataReceived += DataReceived; download.DownloadStopped += DataStopped; download.DownloadCancelled += DataCancelled; download.DownloadStarted += DataStarted; download.DownloadError += DataError; progressMonitor = new DownloadProgressMonitor(); speedMonitor = new DownloadSpeedMonitor(128); speedMonitor.Attach(download); if (SavePath == null) { SavePath = Path.Combine(TempDirectoryName, Path.GetFileName(dlUri.ToString())); } dlSaver = new DownloadToFileSaver(SavePath, Path.Combine(FinishedDirectoryName, Path.GetFileName(dlUri.ToString()))); dlSaver.Attach(download); progressMonitor.Attach(download); download.Start(); }