protected static void PopulateContextWithUploadableRanges(FileInfo vhdFile, UploadContext context, bool resume) { using (var vds = new VirtualDiskStream(vhdFile.FullName)) { IEnumerable <IndexRange> ranges = vds.Extents.Select(e => e.Range).ToArray(); var bs = new BufferedStream(vds); if (resume) { var alreadyUploadedRanges = context.DestinationBlob.GetPageRangesAsync() .ConfigureAwait(false).GetAwaiter().GetResult() .Select(pr => new IndexRange(pr.StartOffset, pr.EndOffset)); ranges = IndexRange.SubstractRanges(ranges, alreadyUploadedRanges); context.AlreadyUploadedDataSize = alreadyUploadedRanges.Sum(ir => ir.Length); } var uploadableRanges = IndexRangeHelper.ChunkRangesBySize(ranges, PageSizeInBytes).ToArray(); if (vds.DiskType == DiskType.Fixed) { var nonEmptyUploadableRanges = GetNonEmptyRanges(bs, uploadableRanges).ToArray(); context.UploadableDataSize = nonEmptyUploadableRanges.Sum(r => r.Length); context.UploadableRanges = nonEmptyUploadableRanges; } else { context.UploadableDataSize = uploadableRanges.Sum(r => r.Length); context.UploadableRanges = uploadableRanges; } } }
public IEnumerable <IndexRange> GetEmptyRanges() { var blobRange = new List <IndexRange> { IndexRange.FromLength(0, this.Length) }; return(IndexRange.SubstractRanges(blobRange, GetPageRanges())); }