private static void SerializeFolder(string path, BuildFolder folder) { var xmlFolder = new XmlBuildFolder { Version = BuildVersion.ToString(), IsExpanded = folder.IsExpanded, Builds = folder.Builds.Select(b => b.Name).ToList() }; Directory.CreateDirectory(path); XmlSerializationUtils.SerializeToFile(xmlFolder, Path.Combine(path, BuildFolderFileName)); }
/// <summary> /// Serializes the given build. /// </summary> /// <remarks> /// Folders have to be serialized right after being changed to update parent information in time. /// /// The folder builds are moved to has to be serialized before their old folder. /// </remarks> public void SerializeBuild(IBuild build) { string oldName; _names.TryGetValue(build, out oldName); var name = build.Name; _names[build] = name; var path = PathFor(build, true); var oldPath = path.Remove(path.Length - SerializationUtils.EncodeFileName(name).Length) + SerializationUtils.EncodeFileName(oldName); var poeBuild = build as PoEBuild; if (poeBuild != null) { SerializeBuild(path, poeBuild); if (oldName != null && oldName != name) { File.Delete(oldPath + BuildFileExtension); } } else { if (oldName != null && oldName != name) { Directory.Move(oldPath, path); } var folder = (BuildFolder)build; // Move builds that are in folder.Builds but have _parents set to another folder // from their old folder to this one. foreach (var b in folder.Builds) { BuildFolder parent; _parents.TryGetValue(b, out parent); if (_markedForDeletion.ContainsKey(b) || (parent != null && parent != folder)) { var isBuild = b is PoEBuild; var extension = isBuild ? BuildFileExtension : ""; string old; if (_markedForDeletion.ContainsKey(b)) { old = _markedForDeletion[b]; _markedForDeletion.Remove(b); } else { old = PathFor(b, true) + extension; } var newPath = Path.Combine(path, SerializationUtils.EncodeFileName(_names[b]) + extension); if (old == newPath) { continue; } if (isBuild) { File.Move(old, newPath); } else { Directory.Move(old, newPath); } } } // Mark builds that have folder as _parents entry but are no longer in folder.Builds. // These will either be moved when their new folder is saved or deleted when Delete is called. // Skip unsaved builds (those are not contained in _names) foreach (var parentsEntry in _parents) { var b = parentsEntry.Key; if (parentsEntry.Value != folder || !_names.ContainsKey(b) || folder.Builds.Contains(b)) { continue; } var extension = b is PoEBuild ? BuildFileExtension : ""; _markedForDeletion[b] = PathFor(b, true) + extension; } var xmlFolder = new XmlBuildFolder { Version = BuildVersion.ToString(), IsExpanded = folder.IsExpanded, Builds = folder.Builds.Select(b => b.Name).ToList() }; Directory.CreateDirectory(path); SerializationUtils.XmlSerialize(xmlFolder, Path.Combine(path, BuildFolderFileName)); } // Just recreate these. Easier than handling all edge cases. InitParents(); }
private static void SerializeFolder(string path, BuildFolder folder) { var xmlFolder = new XmlBuildFolder { Version = BuildVersion.ToString(), IsExpanded = folder.IsExpanded, Builds = folder.Builds.Select(b => b.Name).ToList() }; Directory.CreateDirectory(path); SerializationUtils.XmlSerializeToFile(xmlFolder, Path.Combine(path, BuildFolderFileName)); }