private Buffer LoadBuffer(long position)
        {
            bool isLast = false;

            if (position + bufferSize >= Length)
            {
                position = Math.Max(0, Length - bufferSize);
                isLast   = true;
            }
            var range = new CloudStorageResourceRange(position, Math.Min(bufferSize, Length - position));

            Console.WriteLine($"Seekable stream requesting byte range at {range.Offset} length {range.Length}");

            var objReq = Task.Run(() => { return(_CloudStorage.GetObjectStreamAsync(_ResourceName, range)); }).Result;

            var ms = new MemoryStream((int)range.Length);

            objReq.CopyTo(ms);

            return(new Buffer()
            {
                Position = position,
                Data = ms,
                BytesAvail = ms.Length,
                IsLast = isLast
            });
        }
        public async Task <Stream> OpenAsync()
        {
            var range = new CloudStorageResourceRange(OffsetOfCompressedData, CompressedLength);

            Console.WriteLine($"Cloud zip archive entry requesting byte range at {range.Offset} length {range.Length}");

            var resp = await _CloudStorage.GetObjectStreamAsync(_ResourceName, range);

            return(GetDataDecompressor(resp));
        }
示例#3
0
        /// <summary>
        /// Get Object
        /// </summary>
        /// <param name="resource"></param>
        /// <param name="range">(optional)</param>
        /// <returns></returns>
        public async Task <Stream> GetObjectStreamAsync(
            ICloudStorageResourceName resource, CloudStorageResourceRange range = null)
        {
            Stream stream = null;

            if (resource is S3CloudStorageResourceName s3resource)
            {
                var req = new GetObjectRequest {
                    BucketName = s3resource.Name, Key = s3resource.ObjectKey
                };

                if (range != null)
                {
                    req.ByteRange = new ByteRange(range.Offset, range.Offset + range.Length - 1);
                }

                var objectResponse = await S3Client.GetObjectAsync(req);

                stream = objectResponse.ResponseStream;
            }

            return(stream);
        }