예제 #1
0
        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;
                }
            }
        }
예제 #2
0
        public IEnumerable <IndexRange> GetEmptyRanges()
        {
            var blobRange = new List <IndexRange> {
                IndexRange.FromLength(0, this.Length)
            };

            return(IndexRange.SubstractRanges(blobRange, GetPageRanges()));
        }