private CompressedBlobStoreSection CreateFolderStructure(StringKeySequence baseName = default(StringKeySequence))
        {
            var folder = new CompressedBlobStoreSection(baseName, mArchive);

            var childFolderKeys =
                from entry in mEntries

                where entry.Path.Segments.Length == baseName.Segments.Length + 1

                let m1                   = baseName.IsEmpty && entry.Path.Segments.Length == 1
                                  let m2 = baseName.Segments.Select((k, i) => entry.Path.Segments[i].Equals(k)).All(x => x)

                                           where m1 || m2
                                           select entry.Path;

            foreach (var key in childFolderKeys)
            {
                folder.AddChildFolder(key.Segments.Last(), CreateFolderStructure(key));
            }

            var elementKeys = new List <StringKey>(

                from entry in mEntries
                where baseName.Equals(entry.Path)
                select entry.Key);

            foreach (var element in elementKeys)
            {
                folder.AddElement(element);
            }

            return(folder);
        }
        public override IBlobStore GetChildStore(StringKey childStorageKey, bool?isReadOnly = null)
        {
            if (!mChildFolders.ContainsKey(childStorageKey.Normalize()))
            {
                var childStore = new CompressedBlobStoreSection(mThisFolderName.Concat(childStorageKey), mArchive);

                AddChildFolder(childStorageKey, childStore);

                return(childStore);
            }

            return(mChildFolders[childStorageKey.Normalize()]);
        }
        private CompressedBlobStore([NotNull] ZipArchive archive, [NotNull] IList <CompressedBlobStoreEntryInfo> entries)
        {
            if (archive == null)
            {
                throw new ArgumentNullException(nameof(archive));
            }
            if (entries == null)
            {
                throw new ArgumentNullException(nameof(entries));
            }

            mArchive    = archive;
            mEntries    = entries;
            mRootFolder = CreateFolderStructure();
        }
        internal void AddChildFolder(StringKey key, [NotNull] CompressedBlobStoreSection folder)
        {
            if (folder == null)
            {
                throw new ArgumentNullException(nameof(folder));
            }

            if (mChildFolders.ContainsKey(key.Normalize()))
            {
                mChildFolders[key.Normalize()] = folder;
                return;
            }

            mChildFolders.Add(key.Normalize(), folder);
            mOriginalChildFolderNames.Add(key);
        }