public async Task UploadCrazy(string localFile, string remoteFileDirectory, int blockLength = 1) { TransmissionHelper transmissionHelper = new TransmissionHelper(); transmissionHelper.OnProgressHandler += (timeCost, plannedSpeed, downloadSpeed) => { this.OnProgressHandler?.Invoke(timeCost, plannedSpeed, downloadSpeed); }; try { if (!File.Exists(localFile)) { throw new WebDAVException($"{localFile} is not file."); } FileInfo fileInfo = new FileInfo(localFile); using (Stream stream = File.OpenRead(localFile)) { transmissionHelper.SetTotalLength(fileInfo.Length); List <Task> tasks = new List <Task>(); long step = (1L << 20) * blockLength; // 2^10 * 2^10 == 1MB var blockCount = Math.Ceiling(fileInfo.Length * 1.0 / step); string id = Guid.NewGuid().ToString("N"); transmissionHelper.Start(); Console.WriteLine($"Start upload ! total length{fileInfo.Length}"); for (int i = 0; i < blockCount; i++) { long start = i * step; long end = (i + 1) * step - 1; if ((fileInfo.Length - 1) < end) { end = fileInfo.Length - 1; } int stepStream = (int)(end - start + 1); byte[] buffer = new byte[stepStream]; stream.Seek(start, SeekOrigin.Begin); await stream.ReadAsync(buffer, 0, stepStream); tasks.Add(UploadPartial(transmissionHelper, new MemoryStream(buffer), remoteFileDirectory, start, end, stream.Length)); } await Task.Run(() => Task.WaitAll(tasks.ToArray())); } transmissionHelper.Stop(); Console.WriteLine($"End uplaod ! Enjoy yourself !"); } catch (Exception ex) { transmissionHelper.Stop(); throw ex; } }
/// <summary> /// MutilateThread Download /// </summary> /// <param name="remoteFile">file url</param> /// <param name="localFileDirectory">local dic</param> /// <param name="blockLength">N MB</param> /// <returns></returns> public async Task DownloadCrazy(Item remoteFile, DirectoryInfo localFileDirectory, int blockLength = 1) { TransmissionHelper transmissionHelper = new TransmissionHelper(); transmissionHelper.OnProgressHandler += (timeCost, plannedSpeed, downloadSpeed) => { this.OnProgressHandler?.Invoke(timeCost, plannedSpeed, downloadSpeed); }; try { if (remoteFile == null || remoteFile.IsCollection || remoteFile.ContentLength == null) { throw new WebDAVException("remoteFile is nil or collection"); } long?contentLength = remoteFile.ContentLength.Value; if (contentLength == null) { throw new WebDAVException("Response content is nil"); } else { transmissionHelper.SetTotalLength(remoteFile.ContentLength.Value); } List <Task> tasks = new List <Task>(); long step = (1L << 20) * blockLength; // 2^10 * 2^10 == 1MB var blockCount = Math.Ceiling(remoteFile.ContentLength.Value * 1.0 / step); string id = Guid.NewGuid().ToString("N"); transmissionHelper.Start(); Console.WriteLine($"Start download ! total length{remoteFile.ContentLength.Value}"); for (int i = 0; i < blockCount; i++) { long start = i * step; long end = (i + 1) * step - 1; if ((remoteFile.ContentLength.Value - 1) < end) { end = remoteFile.ContentLength.Value - 1; } tasks.Add(DownloadPartial(id + i, transmissionHelper, remoteFile.Href, start, end, step)); } await Task.Run(() => Task.WaitAll(tasks.ToArray())); transmissionHelper.Stop(); Console.WriteLine("Files is merging ...."); using (FileStream fileOut = new FileStream(Path.Combine(localFileDirectory.FullName.TrimEnd('/') + "/" + remoteFile.DisplayName.TrimStart('/')), FileMode.Create)) { for (int i = 0; i < blockCount; i++) { using (FileStream fileStream = new FileStream($"{id + i}.dat", FileMode.Open)) { await fileStream.CopyToAsync(fileOut); } File.Delete($"{id + i}.dat"); Console.WriteLine($"{i} is OK"); } } Console.WriteLine($"End download ! Enjoy yourself !"); } catch (Exception ex) { transmissionHelper.Stop(); throw ex; } }