/// <summary> /// Заполнение хеш таблицы данными о fb2-книгах в контексте Авторов /// </summary> /// <param name="fb2">объект класса FictionBook</param> /// <param name="ZipPath">путь к zip-архиву. Если книга - не запакована в zip, то ZipPath = null</param> /// <param name="SrcPath">путь к fb2-файлу</param> /// <param name="Encoding">кодировка текщего файла в fb2</param> /// <param name="sAuthor">Фамилия и 1-я буква Имени текущего автора</param> /// <param name="htFB2ForAuthorFIO">Хеш Таблица с книгами одинаковых Авторов</param> private void FB2AuthorFIOSetHashTable(FictionBook fb2, string ZipPath, string SrcPath, string Encoding, string sAuthor, ref HashtableClass htFB2ForAuthorFIO) { // данные о книге BookData fb2BookData = new BookData( fb2.TIBookTitle, fb2.TIAuthors, fb2.TIGenres, fb2.TILang, fb2.DIID, fb2.DIVersion, fb2.DIAuthors, SrcPath, Encoding ); if (ZipPath != null) { fb2BookData.Path = ZipPath; } if (!htFB2ForAuthorFIO.ContainsKey(sAuthor)) { // этого Автора sAuthor в Группе еще нет FB2FilesDataInGroup fb2f = new FB2FilesDataInGroup(fb2BookData, sAuthor); fb2f.Group = sAuthor; htFB2ForAuthorFIO.Add(sAuthor, fb2f); } else { // этот Автор sAuthor в Группе уже есть FB2FilesDataInGroup fb2f = (FB2FilesDataInGroup)htFB2ForAuthorFIO[sAuthor]; fb2f.Add(fb2BookData); //htFB2ForBT[sAuthor] = fb2f; //ИЗБЫТОЧНЫЙ КОД } }
/// <summary> /// Заполнение хеш таблицы данными о fb2-книгах в контексте их md5 /// </summary> /// <param name="ZipPath">путь к zip-архиву. Если книга - не запакована в zip, то ZipPath = null</param> /// <param name="SrcPath">путь к fb2-файлу;</param> /// <param name="htFB2ForMd5">Хеш Таблица с книгами с одинаковыми значениями Md5</param> private void MakeFB2Md5HashTable(string ZipPath, string SrcPath, ref HashtableClass htFB2ForMd5) { string md5 = ComputeMD5Checksum(SrcPath); FictionBook fb2 = null; try { fb2 = new FictionBook(SrcPath); } catch (Exception ex) { Debug.DebugMessage( SrcPath, ex, "Дубликатор.CompareForm.MakeFB2Md5HashTable(): Заполнение хеш таблицы данными о fb2-книгах в контексте их md5." ); _nonOpenedFileList = _compComm.collectBadFB2(!string.IsNullOrEmpty(ZipPath) ? ZipPath : SrcPath); return; } string Encoding = fb2.getEncoding(); if (string.IsNullOrWhiteSpace(Encoding)) { Encoding = "?"; } string ID = fb2.DIID; if (ID == null) { return; } if (ID.Trim().Length == 0) { ID = "Тег <id> в этих книгах \"пустой\""; } // данные о книге BookData fb2BookData = new BookData( fb2.TIBookTitle, fb2.TIAuthors, fb2.TIGenres, fb2.TILang, ID, fb2.DIVersion, fb2.DIAuthors, SrcPath, Encoding ); if (ZipPath != null) { fb2BookData.Path = ZipPath; } if (!htFB2ForMd5.ContainsKey(md5)) { // такой книги в числе дублей еще нет FB2FilesDataInGroup fb2f = new FB2FilesDataInGroup(fb2BookData, md5); htFB2ForMd5.Add(md5, fb2f); } else { // такая книга в числе дублей уже есть FB2FilesDataInGroup fb2f = (FB2FilesDataInGroup)htFB2ForMd5[md5]; fb2f.Add(fb2BookData); //htFB2ForMd5[md5] = fb2f; //ИЗБЫТОЧНЫЙ КОД } }
/// <summary> /// Заполнение хеш таблицы данными о fb2-книгах в контексте их Названия /// </summary> /// <param name="ZipPath">путь к zip-архиву. Если книга - не запакована в zip, то ZipPath = null</param> /// <param name="SrcPath">путь к fb2-файлу;</param> /// <param name="htFB2ForBT">Хеш Таблица с книгами с одинаковыми Названиями</param> private void MakeFB2BTHashTable(string ZipPath, string SrcPath, HashtableClass htFB2ForBT) { FictionBook fb2 = null; try { fb2 = new FictionBook(SrcPath); } catch (Exception ex) { Debug.DebugMessage( SrcPath, ex, "Дубликатор.CompareForm.MakeFB2BTHashTable(): Заполнение хеш таблицы данными о fb2-книгах в контексте их Названия." ); _nonOpenedFileList = _compComm.collectBadFB2(!string.IsNullOrEmpty(ZipPath) ? ZipPath : SrcPath); return; } string Encoding = fb2.getEncoding(); if (string.IsNullOrWhiteSpace(Encoding)) { Encoding = "?"; } BookTitle bookTitle = fb2.TIBookTitle; string BT = "<Название книги отсутствует>"; if (bookTitle != null && !string.IsNullOrWhiteSpace(bookTitle.Value)) { BT = bookTitle.Value.Trim(); } // данные о книге BookData fb2BookData = new BookData( bookTitle, fb2.TIAuthors, fb2.TIGenres, fb2.TILang, fb2.DIID, fb2.DIVersion, fb2.DIAuthors, SrcPath, Encoding ); if (ZipPath != null) { fb2BookData.Path = ZipPath; } if (!htFB2ForBT.ContainsKey(BT)) { // такой книги в числе дублей еще нет FB2FilesDataInGroup fb2f = new FB2FilesDataInGroup(fb2BookData, BT); htFB2ForBT.Add(BT, fb2f); } else { // такая книга в числе дублей уже есть FB2FilesDataInGroup fb2f = (FB2FilesDataInGroup)htFB2ForBT[BT]; fb2f.Add(fb2BookData); //htFB2ForBT[sBT] = fb2f; //ИЗБЫТОЧНЫЙ КОД } }
/// <summary> /// Заполнение хеш таблицы данными о fb2-книгах в контексте их ID /// </summary> /// <param name="ZipPath">путь к zip-архиву. Если книга - не запакована в zip, то ZipPath = null</param> /// <param name="SrcPath">путь к fb2-файлу;</param> /// <param name="htFB2ForID">Хеш Таблица с книгами с одинаковыми ID</param> private void MakeFB2IDHashTable(string ZipPath, string SrcPath, ref HashtableClass htFB2ForID) { FictionBook fb2 = null; try { fb2 = new FictionBook(SrcPath); } catch (Exception ex) { Debug.DebugMessage( SrcPath, ex, "Дубликатор.CompareForm.MakeFB2IDHashTable(): Заполнение хеш таблицы данными о fb2-книгах в контексте их ID." ); _nonOpenedFileList = _compComm.collectBadFB2(!string.IsNullOrEmpty(ZipPath) ? ZipPath : SrcPath); return; } string Encoding = fb2.getEncoding(); if (string.IsNullOrWhiteSpace(Encoding)) { Encoding = "?"; } string ID = fb2.DIID; if (string.IsNullOrEmpty(ID) || string.IsNullOrWhiteSpace(ID)) { ID = _compComm.NoOrEmptyBookIDString; } // данные о книге BookData fb2BookData = new BookData( fb2.TIBookTitle, fb2.TIAuthors, fb2.TIGenres, fb2.TILang, ID, fb2.DIVersion, fb2.DIAuthors, SrcPath, Encoding ); if (ZipPath != null) { fb2BookData.Path = ZipPath; } if (!htFB2ForID.ContainsKey(ID)) { // такой книги в числе дублей еще нет FB2FilesDataInGroup fb2f = new FB2FilesDataInGroup(fb2BookData, ID); htFB2ForID.Add(ID, fb2f); } else { // такая книга в числе дублей уже есть FB2FilesDataInGroup fb2f = (FB2FilesDataInGroup)htFB2ForID[ID]; fb2f.Add(fb2BookData); //htFB2ForID[sID] = fb2f; //ИЗБЫТОЧНЫЙ КОД } }
/// <summary> /// Хэширование по одинаковым Авторам в пределах сгенерированных групп книг по одинаковым названиям /// </summary /// <param name="bw">Экземплар фонового обработчика класса BackgroundWorker</param> /// <param name="e">Экземпляр класса DoWorkEventArgs</param> /// <param name="htFB2ForBT">Заполненная хеш-таблица списками книг по критерию одинакового Названия книг</param> /// <param name="htBookTitleAuthors">Заполняемая хеш-таблица списками книг по критерию ( Название книги (Авторы) )</param> /// <param name="WithMiddleName">Учитывать ли отчество Авторов (true) или нет (false) при поиске</param> /// <returns>Признак непрерывности обработки файлов</returns> public bool FilesHashForAuthorsParser(BackgroundWorker bw, DoWorkEventArgs e, Label StatusLabel, ProgressBar ProgressBar, HashtableClass htFB2ForBT, HashtableClass htBookTitleAuthors, bool WithMiddleName) { StatusLabel.Text += "Хеширование по Авторам книг...\r"; ProgressBar.Maximum = htFB2ForBT.Values.Count; ProgressBar.Value = 0; // генерация списка ключей хеш-таблицы (для удаления обработанного элемента таблицы) List <string> keyList = _compComm.makeSortedKeysForGroups(htFB2ForBT); // группировка книг по одинаковым Авторам в пределах сгенерированных Групп книг по одинаковым Названиям int i = 0; foreach (string key in keyList) { // разбивка на группы для одинакового Названия по Авторам Hashtable htGroupAuthors = FindDupForAuthors((FB2FilesDataInGroup)htFB2ForBT[key], WithMiddleName); foreach (FB2FilesDataInGroup fb2List in htGroupAuthors.Values) { if (!htBookTitleAuthors.ContainsKey(fb2List.Group)) { htBookTitleAuthors.Add(fb2List.Group, fb2List); } else { FB2FilesDataInGroup fb2ListInGroup = (FB2FilesDataInGroup)htBookTitleAuthors[fb2List.Group]; fb2ListInGroup.AddRange(fb2List); } } // удаление обработанной группы книг, сгруппированных по одинаковому названию htFB2ForBT.Remove(key); bw.ReportProgress(++i); if (bw.CancellationPending) { e.Cancel = true; return(false); } } return(true); }
/// <summary> /// Хэширование fb2-файлов по ID книги в пределах одинаковых Авторов Книги /// 10. Автор(ы), Одинаковый Id Книги /// </summary /// <param name="bw">Экземплар фонового обработчика класса BackgroundWorker</param> /// <param name="e">Экземпляр класса DoWorkEventArgs</param> /// <param name="htAuthors">Хэш Таблица с книгами по критерию одинаковости их Авторов</param> /// <param name="htWorkingBook">Хэш Таблица с книгами по критерию одинаковости их ID</param> /// <returns>Признак непрерывности обработки файлов</returns> public bool FilesHashForAuthorsBookIDParser(ref BackgroundWorker bw, ref DoWorkEventArgs e, Label StatusLabel, ProgressBar ProgressBar, ref HashtableClass htBookTitleAuthors, ref HashtableClass htWorkingBook) { StatusLabel.Text += "Хэширование по ID книги в пределах одинаковых Авторов...\r"; ProgressBar.Maximum = htBookTitleAuthors.Count; ProgressBar.Value = 0; // генерация списка ключей хеш-таблицы (для удаления обработанного элемента таблицы) List <string> keyList = _compComm.makeSortedKeysForGroups(htBookTitleAuthors); // группировка книг по одинаковым Id Книги в пределах сгенерированных Групп книг одинаковых Авторов int i = 0; foreach (string key in keyList) { // разбивка на группы для одинакового Id книги по Названию и по Авторам Hashtable AuthorsTitleBookID = FindDupForAuthorsID((FB2FilesDataInGroup)htBookTitleAuthors[key]); foreach (FB2FilesDataInGroup fb2List in AuthorsTitleBookID.Values) { if (!htBookTitleAuthors.ContainsKey(fb2List.Group)) { htWorkingBook.Add(fb2List.Group, fb2List); } else { FB2FilesDataInGroup fb2ListInGroup = (FB2FilesDataInGroup)htBookTitleAuthors[fb2List.Group]; fb2ListInGroup.AddRange(fb2List); } } // удаление обработанной группы книг, сгруппированных по одинаковому Автору htBookTitleAuthors.Remove(key); bw.ReportProgress(++i); if (bw.CancellationPending) { e.Cancel = true; return(false); } } return(true); }