public bool Save(string folderPath) { bool result = false; Directory.CreateDirectory(folderPath); // next ID // root file // unnamed symbol counter (or calc) string libFileName = folderPath + Path.DirectorySeparatorChar + "Library.xml"; File.WriteAllText(libFileName, string.Empty); FileStream fs = new FileStream(libFileName, FileMode.OpenOrCreate); XmlTextWriter w = new XmlTextWriter(fs, System.Text.Encoding.UTF8); w.Formatting = Formatting.Indented; w.WriteStartElement("Library"); w.WriteElementString("LibraryIdCounter", definitionIdCounter.ToString()); w.WriteStartElement("LibraryItems"); foreach (uint key in items.Keys) { LibraryItem li = items[key]; w.WriteStartElement("Item"); w.WriteAttributeString("Id", li.Definition.Id.ToString()); w.WriteAttributeString("Type", li.Definition.GetType().ToString()); w.WriteAttributeString("Date", li.Date.ToString("u")); if (li.OriginalSourceId != 0) { w.WriteAttributeString("OriginalSourceId", li.OriginalSourceId.ToString()); } if (li.Definition.Name != null && li.Definition.Name != "") { w.WriteAttributeString("Name", li.Definition.Name); } if (li.LibraryPath != null && li.LibraryPath != "") { w.WriteAttributeString("LibraryPath", li.LibraryPath); } string dp = li.GetDataPath(); if (dp != null && dp != "") { w.WriteAttributeString("DataPath", dp); } w.WriteEndElement(); } w.WriteEndElement(); w.WriteEndElement(); w.Flush(); fs.Close(); // remove old defs foreach (uint key in removedPaths.Keys) { string[] paths = removedPaths[key].Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries); foreach (string subPath in paths) { string path = folderPath + System.IO.Path.DirectorySeparatorChar + subPath; if (File.Exists(path)) { File.Delete(path); } } } addedPaths.Clear(); removedPaths.Clear(); // now write actual library Items foreach (uint key in items.Keys) { LibraryItem li = items[key]; if (li.HasSaveableChanges) { li.Save(folderPath); } } hasSaveableChanges = false; return(result); }