/// <returns>New ETag</returns>
        private string WriteToStream(MetadataPrefixStream stream, object item, Type type, IDataSerializer serializer = null)
        {
            byte[] result;
            using (var resultStream = new MemoryStream())
            {
                (serializer ?? _defaultSerializer).Serialize(item, resultStream, type);
                result = resultStream.ToArray();
            }

            stream.Seek(0, SeekOrigin.Begin);
            stream.Write(result, 0, result.Length);
            stream.SetLength(result.Length);
            stream.Seek(0, SeekOrigin.Begin);
            return(stream.WriteNewETag());
        }
        private string WriteToStream(MetadataPrefixStream stream, Stream item)
        {
            byte[] result;
            using (var resultStream = new MemoryStream())
            {
                item.Position = 0;
                item.CopyTo(resultStream);
                result = resultStream.ToArray();
            }

            stream.Seek(0, SeekOrigin.Begin);
            stream.Write(result, 0, result.Length);
            stream.SetLength(result.Length);
            stream.Seek(0, SeekOrigin.Begin);
            return(stream.WriteNewETag());
        }
        public Maybe <Stream> GetBlobStream(string containerName, string blobName, out string etag)
        {
            var path = Path.Combine(_root, containerName, blobName);

            try
            {
                var file = new FileInfo(path);
                if (!file.Exists)
                {
                    etag = null;
                    return(Maybe <Stream> .Empty);
                }

                using (var stream = file.OpenRead())
                    using (var epStream = new MetadataPrefixStream(stream))
                    {
                        etag = epStream.ReadETag();
                        int length = (int)epStream.Length;
                        epStream.Seek(0, SeekOrigin.Begin);
                        var    returnStream = new MemoryStream(length);
                        byte[] buffer       = new byte[8192];
                        int    bytesRead    = 1;
                        while (length > 0 && bytesRead > 0)
                        {
                            bytesRead = epStream.Read(buffer, 0, Math.Min(length, buffer.Length));
                            returnStream.Write(buffer, 0, bytesRead);
                            length -= bytesRead;
                        }
                        returnStream.Position = 0;
                        return(new Maybe <Stream>(returnStream));
                    }
            }
            catch (FileNotFoundException)
            {
                etag = null;
                return(Maybe <Stream> .Empty);
            }
            catch (DirectoryNotFoundException)
            {
                etag = null;
                return(Maybe <Stream> .Empty);
            }
        }