Пример #1
0
        private static async Task DownloadFileAsync(DownloadOption option)
        {
            var output = option.Output ?? "";

            output = Path.GetFullPath(output);

            Console.WriteLine($"Download url = {option.Url}");
            Console.WriteLine($"Output = {output}");

            try
            {
                var loggerFactory = LoggerFactory.Create(builder => { });

                var logger = loggerFactory.CreateLogger <SegmentFileDownloader>();

                using var progress = new FileDownloadSpeedProgress();

                progress.ProgressChanged += (sender, downloadProgress) =>
                {
                    Console.Clear();

                    Console.WriteLine($"Download url = {option.Url}");
                    Console.WriteLine($"Output = {output}");

                    Console.WriteLine();

                    Console.WriteLine(
                        $"Process {downloadProgress.DownloadProcess} {downloadProgress.DownloadSpeed}");

                    foreach (var downloadSegment in downloadProgress.DownloadProgress.GetCurrentDownloadSegmentList())
                    {
                        Console.WriteLine(downloadSegment);
                    }
                };

                var file = new FileInfo(output);
                var url  = option.Url;
                var segmentFileDownloader = new SegmentFileDownloader(url, file, logger, progress);

                await segmentFileDownloader.DownloadFileAsync();

                //finished = true;
            }
            catch (Exception e)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(e);
                Console.ResetColor();
            }
        }
Пример #2
0
        public async void AddDownloadFile()
        {
            var url  = AddFileDownloadViewModel.CurrentDownloadUrl;
            var file = AddFileDownloadViewModel.CurrentDownloadFilePath;

            var logger = _loggerFactory.CreateLogger <SegmentFileDownloader>();

            using var progress = new FileDownloadSpeedProgress();

            file = Path.GetFullPath(file);

            var downloadFileInfo = new DownloadFileInfo()
            {
                FileName    = Path.GetFileName(file),
                AddedTime   = DateTime.Now.ToString(),
                DownloadUrl = url,
                FilePath    = file
            };

            DownloadFileInfoList.Add(downloadFileInfo);

            progress.ProgressChanged += (sender, downloadProgress) =>
            {
                downloadFileInfo.DownloadSpeed   = downloadProgress.DownloadSpeed;
                downloadFileInfo.FileSize        = downloadProgress.FileSize;
                downloadFileInfo.DownloadProcess = downloadProgress.DownloadProcess;
            };

            _ = DownloadFileListManager.WriteDownloadedFileListToFileAsync(DownloadFileInfoList.ToList());

            var segmentFileDownloader = new SegmentFileDownloader(url, new FileInfo(file), logger, progress,
                                                                  sharedArrayPool: SharedArrayPool, bufferLength: FileDownloaderSharedArrayPool.BufferLength);

            CurrentSegmentFileDownloader = segmentFileDownloader;
            await segmentFileDownloader.DownloadFileAsync();

            // 下载完成逻辑
            progress.Stop();

            downloadFileInfo.DownloadSpeed   = "";
            downloadFileInfo.DownloadProcess = "完成";
            downloadFileInfo.IsFinished      = true;

            _ = DownloadFileListManager.WriteDownloadedFileListToFileAsync(DownloadFileInfoList.ToList());

            // 后续优化多任务下载的时候的回收
            _ = Task.Delay(TimeSpan.FromSeconds(3))
                .ContinueWith(_ => ((FileDownloaderSharedArrayPool)SharedArrayPool).Clean());
        }