private void LoadFromFolder(string folderPath)
            {
                var dirInfo  = new DirectoryInfo(folderPath);
                var items    = new List <GuidObject>();
                var settings = Serializer.Instance.State.Settings;

                var files = dirInfo.GetFiles("*.sav");

                foreach (var fileInfo in files)
                {
                    var path  = Utils.PathCombine(folderPath, fileInfo.Name);
                    var bytes = FileSystemCache.ReadAllBytes(path);
                    var item  = Serializer.Instance.Deserialize <GuidObject>(bytes, settings);
                    item.SetParentFolder(this);
                    lock (items)
                    {
                        items.Add(item);
                    }
                }
                JoinItems(items);

                foreach (var subDirInfo in dirInfo.GetDirectories())
                {
                    var subFolder = new Folder(subDirInfo.Name, this);
                    subFolder.LoadFromFolder(Utils.PathCombine(folderPath, subDirInfo.Name));
                    SubFolders[subDirInfo.Name] = subFolder;
                }
            }
            private void SaveToFolder(string folderPath, HashSet <string> oldFiles)
            {
                Utils.EnsureDirectory(folderPath);

                var flags = Serializer.Instance.State.Settings.Flags;

                var count = Items.Count;

                Parallel.ForEach(Items, (GuidObject item) =>
                {
                    var path     = Utils.PathCombine(folderPath, item.GetFileName() + ".sav");
                    var settings = new SerializationSettings(flags, item);
                    var bytes    = Serializer.Instance.Serialize(item, settings);
                    FileSystemCache.WriteAllBytes(path, bytes);

                    oldFiles.Remove(path.ToLowerInvariant());
                });

                foreach (var subFolder in SubFolders.Values)
                {
                    subFolder.SaveToFolder(Utils.PathCombine(folderPath, subFolder.Name), oldFiles);
                }
            }