/// <inheritdoc/>
        public async Task <StorageObject> Create(string containerName, string objectName, IDictionary <string, string> metadata, Stream content, int numberOfSegments, string segmentsContainer)
        {
            containerName.AssertIsNotNullOrEmpty("containerName", "Cannot create a large storage object with a null or empty container name.");
            objectName.AssertIsNotNullOrEmpty("objectName", "Cannot create a large storage object with a null or empty name.");
            metadata.AssertIsNotNull("metadata", "Cannot create a large storage object with null metadata.");
            content.AssertIsNotNull("content", "Cannot create a large storage object with null content.");
            segmentsContainer.AssertIsNotNullOrEmpty("segmentsContainer", "Cannot  create a large object with a null or empty segments container name.");

            if (numberOfSegments <= 0)
            {
                throw new ArgumentException("Cannot create a large object with zero or less segments.", "numberOfSegments");
            }

            var segmentFolder = await this.GetSegmentsFolder(segmentsContainer, objectName);

            var chunkSize           = this.GetChunkSize(content.Length, numberOfSegments);
            var lastSegmentAndId    = this.GetLastSegmentIdAndName(segmentFolder);
            var lastSegmentId       = lastSegmentAndId.Key;
            var lastSegmentFullName = string.Format("{0}/{1}", objectName, lastSegmentAndId.Value);
            var offset = lastSegmentId * chunkSize;

            if (lastSegmentId > 0)
            {
                //we should drop the last segment (as it's very possible it was corrupted)
                await StorageClient.DeleteStorageObject(segmentsContainer, lastSegmentFullName);
            }

            //Seek to the correct location based on whatever segments have been uploaded, if any
            content.Seek(offset, SeekOrigin.Begin);

            while (content.Position < content.Length)
            {
                //If the remaining data in the stream is less then the chunk size, reset the chunk size to the remaining data size.
                if ((content.Length - content.Position) < chunkSize)
                {
                    chunkSize = (content.Length - content.Position);
                }

                await CreateSegment(content, chunkSize, objectName, lastSegmentId, metadata, segmentsContainer);

                lastSegmentId++;
            }

            var segments = await StorageClient.GetStorageFolder(segmentsContainer, objectName);

            return(await CreateLargeObjectManifest(containerName, objectName, metadata, segments.Objects, segmentsContainer));
        }