public static void SaveRecentProjects(XmlHelper xh)
        {
            for (var i = 0; i < int.MaxValue; i++)
            {
                var nodeName = string.Format("ProjectPath{0}", i + 1);
                var value = xh.GetNodeValue(nodeName);

                if (value.Equals(string.Empty))
                {
                    break;
                }

                xh.RemoveNode(nodeName);
            }

            for (var i = 0; i < Warehouse.Warehouse.Instance.RecentProjects.Count; i++)
            {
                var nodeName = string.Format("ProjectPath{0}", i + 1);
                xh.AppendNode("RecentProjects", nodeName);
                xh.SetNodeValue(nodeName, Warehouse.Warehouse.Instance.RecentProjects[i]);
            }
        }
        private static void InitializeDefaultAppSettings(XmlHelper xmlHelper)
        {
            xmlHelper.AppendNode(string.Empty, "AppSettings");

            xmlHelper.AppendNode("AppSettings", "Environment");
            xmlHelper.AppendNode("Environment", "RecentProjects");

            xmlHelper.AppendNode("Environment", "InitialDirectory");
            xmlHelper.AppendNode("Environment", "ShowInvalidCourseDialog");

            xmlHelper.AppendNode("AppSettings", "Saving");
            xmlHelper.AppendNode("Saving", "AutosavingInterval");

            xmlHelper.AppendNode("AppSettings", "Appearance");
            xmlHelper.AppendNode("Appearance", "WindowState");
            xmlHelper.AppendNode("Appearance", "Left");
            xmlHelper.AppendNode("Appearance", "Top");
            xmlHelper.AppendNode("Appearance", "Width");
            xmlHelper.AppendNode("Appearance", "Height");

            xmlHelper.SetNodeValue("InitialDirectory", Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
            xmlHelper.SetNodeValue("ShowInvalidCourseDialog", "True");

            xmlHelper.SetNodeValue("AutosavingInterval", 0.ToString());

            xmlHelper.SetNodeValue("WindowState", FormWindowState.Maximized.ToString());
            xmlHelper.SetNodeValue("Left", 0.ToString());
            xmlHelper.SetNodeValue("Top", 0.ToString());
            xmlHelper.SetNodeValue("Width", 0.ToString());
            xmlHelper.SetNodeValue("Height", 0.ToString());
        }
        public void Log(Exception exception)
        {
            lock (this)
            {
                var path = Path.Combine(Application.StartupPath, exceptionDirectory);

                if (!Directory.Exists(path))
                {
                    // Операция может вызвать исключение.
                    Directory.CreateDirectory(path);
                }

                path = Path.Combine(path, string.Concat(Guid.NewGuid().ToString(), ".xml"));

                var xmlHelper = new XmlHelper();
                xmlHelper.AppendNode(string.Empty, "ExceptionInfo");
                xmlHelper.AppendNode("ExceptionInfo", "ProductName");
                xmlHelper.AppendNode("ExceptionInfo", "ProductVersion");
                xmlHelper.AppendNode("ExceptionInfo", "Date");
                xmlHelper.AppendNode("ExceptionInfo", "ComputerName");
                xmlHelper.AppendNode("ExceptionInfo", "UserName");
                xmlHelper.AppendNode("ExceptionInfo", "OS");
                xmlHelper.AppendNode("ExceptionInfo", "Culture");
                xmlHelper.AppendNode("ExceptionInfo", "Resolution");
                xmlHelper.AppendNode("ExceptionInfo", "SystemUpTime");
                xmlHelper.AppendNode("ExceptionInfo", "AppUpTime");
                xmlHelper.AppendNode("ExceptionInfo", "TotalMemory");
                xmlHelper.AppendNode("ExceptionInfo", "AvailableMemory");
                xmlHelper.AppendNode("ExceptionInfo", "ExceptionClasses");
                xmlHelper.AppendNode("ExceptionInfo", "ExceptionMessages");
                xmlHelper.AppendNode("ExceptionInfo", "StackTraces");
                xmlHelper.AppendNode("ExceptionInfo", "LoadedModules");

                xmlHelper.SetNodeValue("ProductName", Application.ProductName);
                xmlHelper.SetNodeValue("ProductVersion", Application.ProductVersion);
                xmlHelper.SetNodeValue("Date", DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"));
                xmlHelper.SetNodeValue("ComputerName", SystemInformation.ComputerName);
                xmlHelper.SetNodeValue("UserName", SystemInformation.UserName);
                xmlHelper.SetNodeValue("OS", Environment.OSVersion.ToString());
                xmlHelper.SetNodeValue("Culture", CultureInfo.CurrentCulture.Name);
                xmlHelper.SetNodeValue("Resolution", SystemInformation.PrimaryMonitorSize.ToString());
                xmlHelper.SetNodeValue("SystemUpTime", ExceptionContextInfo.GetSystemUpTime().ToString());
                xmlHelper.SetNodeValue("AppUpTime", (DateTime.Now - Process.GetCurrentProcess().StartTime).ToString());
                var memoryStatus = new ExceptionContextInfo.MEMORYSTATUSEX();
                if (ExceptionContextInfo.GlobalMemoryStatusEx(memoryStatus))
                {
                    xmlHelper.SetNodeValue("TotalMemory", memoryStatus.ullTotalPhys/(1024*1024) + "Mb");
                    xmlHelper.SetNodeValue("AvailableMemory", memoryStatus.ullAvailPhys/(1024*1024) + "Mb");
                }
                xmlHelper.SetNodeValue("ExceptionClasses", ExceptionContextInfo.GetExceptionTypeStack(exception));
                xmlHelper.SetNodeValue("ExceptionMessages", ExceptionContextInfo.GetExceptionMessageStack(exception));
                xmlHelper.SetNodeValue("StackTraces", ExceptionContextInfo.GetExceptionCallStack(exception));

                var currentProcess = Process.GetCurrentProcess();
                var processInfo = new StringBuilder();
                foreach (ProcessModule module in currentProcess.Modules)
                {
                    processInfo.AppendLine(module.FileName + " " + module.FileVersionInfo.FileVersion);
                }
                xmlHelper.SetNodeValue("LoadedModules", processInfo.ToString());

                // Операция может вызвать исключение.
                xmlHelper.Save(path);
            }
        }