public static void LoadDataFromXml() { if (!Directory.Exists(BackupsFolder)) { Directory.CreateDirectory(BackupsFolder); } var time_stamp = TimeStamp; // DateTime.Now.ToString().Replace(" ", "_").Replace(":", "_").Replace("/", "_"); CreateBackupFile(CategoriesFileName, string.Format("categories.{0}.xml", time_stamp)); Categories = CategoryList.Load(CategoriesFileName); CreateBackupFile(AuthorsFileName, string.Format("authorts.{0}.xml", time_stamp)); Authors = AuthorList.Load(AuthorsFileName); foreach (var author in Authors) { author.CheckID(); } }
public static AuthorList Load(string authorsFileName, bool isBackupLoad) { AuthorList result; bool isCorrect = false; if (!File.Exists(authorsFileName)) { result = new AuthorList(); result.Retreive(); result.Save(authorsFileName); return(result); } // .bak файл сохраняем там же, где и основное приложение var authorsBakFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(authorsFileName) + ".bak"); try { // перегоняем файл в память (быстро) FileStream fstream = new FileStream(authorsFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); byte[] buffer = new byte[fstream.Length]; fstream.Read(buffer, 0, (int)fstream.Length); MemoryStream mstream = new MemoryStream(buffer); // десериализируем (медленно) using (var st = new StreamReader(mstream)) { var sr = new XmlSerializer(typeof(AuthorList)); result = (AuthorList)sr.Deserialize(st); } isCorrect = true; } catch { if (!isBackupLoad && MessageBox.Show("Произошла ошибка при загрузке списка авторов.\r\n" + "Попытаться восстановить из резервной копии?\r\n", "ВНИМАНИЕ", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.Yes) == MessageBoxResult.Yes) { result = Load(authorsBakFileName, true); } else { result = new AuthorList(); result.Retreive(); } } // создаем резервную копию try { if (!isBackupLoad && isCorrect) { result.Save(authorsBakFileName); } } catch { } return(result); }
public static AuthorList Load() { var result = new AuthorList(); #region Чтение из БД using (var con = new SqlCeConnection("Data Source=" + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Author.sdf"))) { con.Open(); using (var com = new SqlCeCommand("Select [Id],[Name],[Url],[DateLine],[isIgnored], [Category] from [Author]", con)) { var dr = com.ExecuteReader(); while (dr.Read()) { result.Add(new Author { Id = dr.GetInt32(0), Name = dr.GetString(1), URL = dr.GetString(2), UpdateDate = dr.GetDateTime(3), IsIgnored = dr.GetBoolean(4), Category = dr.GetString(5) }); } var aTexts = AuthorText.Read(); foreach (var aText in aTexts) { var a = result.Find(aText.IdAuthor); if (a != null) { a.Texts.Add(aText); } } foreach (var a in result) { a.PropertyChanged += AuthorPropertyChanged; } } } result.ListChanged += AuthorListChanged; #endregion if (result.Count > 0) { return(result); } #region Если есть данные в старом файле БД (пусть будет версии 0 с БД), то перегоняем оттуда if (File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Author.sdf_0"))) { using (var con = new SqlCeConnection("Data Source=" + Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Author.sdf_0"))) { con.Open(); using ( var com = new SqlCeCommand("Select [Id],[Name],[Url],[DateLine],[isIgnored] from [Author]", con) ) { var dr = com.ExecuteReader(); while (dr.Read()) { Author a = new Author { Id = dr.GetInt32(0), Name = dr.GetString(1), URL = dr.GetString(2), UpdateDate = dr.GetDateTime(3), IsIgnored = dr.GetBoolean(4) }; result.Add(a); a.Texts = new BindingList <AuthorText>(); using ( var _com = new SqlCeCommand( "Select [Id],[Name],[Url],[SectionName],[DateLine],[Genres],[Description],[Size],[LastSize],[IsNew],[IdAuthor] From [AuthorText] Where IdAuthor=" + a.Id.ToString(), con)) { var _dr = _com.ExecuteReader(); while (_dr.Read()) { var aText = new AuthorText(); aText.Read(_dr); aText.Id = 0;// перегенерим айдишку, чтобы произошло добавление в новую БД a.Texts.Add(aText); aText.Save(); } } } } foreach (var a in result) { a.Id = 0;// перегенерим айдишку, чтобы произошло добавление в новую БД a.Save(); a.PropertyChanged += AuthorPropertyChanged; } } return(result); } #endregion #region Чтение из XML try { using (var st = new StreamReader(InfoUpdater.AuthorsFileName)) result = (AuthorList)(new XmlSerializer(typeof(AuthorList))).Deserialize(st); } catch { result = new AuthorList(); result.Retreive(); } result.ListChanged += new ListChangedEventHandler(AuthorListChanged); foreach (var a in result) { a.Save(); a.PropertyChanged += AuthorPropertyChanged; } #endregion return(result); }