public static void RestoreDownloadConnection(DownloadInfo info) { try { var file = $"{info.Folder}\\{info.Name}"; if (!File.Exists(file)) { return; } using (var s = File.OpenWrite(file)) { if (s.Length != info.TotalLoad) { return; } info.LoadState = LoadState.Starting; if (!info.IsVkd) { var executor = new DownloadExecutor(); executor.ProgressChanged += info.ProgressChangedHandler; info.LoadStop += () => { executor.Stop = true; }; info.LoadState = LoadState.Loading; executor.Download(s, info.Src, info.TotalLoad); info.LoadState = LoadState.Finished; return; } var links = new List <string>(); using (var ms = new MemoryStream()) { new DownloadExecutor().Download(ms, info.Src); using (var sr = new StreamReader(ms)) while (!sr.EndOfStream) { links.Add(sr.ReadLine()); } } var part = (int)(info.TotalLoad / PartSize); var vkdEx = new DownloadExecutor(); vkdEx.ProgressChanged += info.ProgressChangedHandler; info.LoadStop += () => { vkdEx.Stop = true; }; info.LoadState = LoadState.Loading; vkdEx.Download(s, links[part], info.TotalLoad % PartSize); for (var i = part + 1; i < links.Count; i++) { vkdEx = new DownloadExecutor(); vkdEx.ProgressChanged += info.ProgressChangedHandler; info.LoadStop += () => { vkdEx.Stop = true; }; vkdEx.Download(s, links[i]); } info.LoadState = LoadState.Finished; } } catch (Exception) { info.LoadState = LoadState.Error; } }
public static void Download(string src, string folder) { // если идет загрузка этого файла - выходим. lock (DownloadLocker) if (Downloads.Any(o => o.Src == src && o.Folder == folder && o.LoadState < LoadState.Finished)) { return; } var download = new DownloadInfo(src, folder); AddToDownloads(download); download.Name = GetFileName(download); if (!download.IsVkd) { GetFileSize(download); try { using (var s = File.Create(folder.FixFolder() + download.Name)) { var executor = new DownloadExecutor(); executor.ProgressChanged += download.ProgressChangedHandler; download.LoadState = LoadState.Loading; download.LoadStop += () => { executor.Stop = true; }; executor.Download(s, download.Src); download.LoadState = LoadState.Finished; } } catch (Exception) { download.LoadState = LoadState.Error; } } else { var links = GetFileContent(download.Src) .Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries) .ToList(); download.TotalSize = GetFileSize(links); var loaded = (long)0; var partFile = PreparePartFile(download.Name, download.Folder); download.LoadState = LoadState.Loading; try { using (var stream = File.Create(partFile)) { foreach (var link in links) { var executor = new DownloadExecutor(); var loaded1 = loaded; executor.ProgressChanged += (bytes, time) => download.ProgressChangedHandler(loaded1 + bytes, time); download.LoadStop += () => { executor.Stop = true; }; loaded += executor.Download(stream, link); } } File.Move(partFile, download.Folder.FixFolder() + GetFileName(download)); download.LoadState = LoadState.Finished; } catch (Exception) { download.LoadState = LoadState.Error; } } }