/// <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> /// Разбивка на группы для одинакового Id книги по Авторам /// </summary /// <param name="bw">Экземпляр фонового обработчика класса BackgroundWorker</param> /// <param name="e">Экземпляр класса DoWorkEventArgs</param> /// <param name="fb2Group">Экземпляр класса для хранения информации по одинаковым книгам в одной группе</param> private Hashtable FindDupForAuthorsID(FB2FilesDataInGroup fb2Group) { // в fb2Group.Group - название группы (название книги у всех книг одинаковое, а пути - разные ) // внутри fb2Group в BookData - данные на каждую книгу группы Hashtable ht = new Hashtable(new FB2CultureComparer()); // 2 итератора для перебора всех книг группы. 1-й - только на текущий элемент группы, 2-й - скользящий на все последующие. т.е. iter2 = iter1+1 for (int iter1 = 0; iter1 != fb2Group.Count; ++iter1) { BookData bd1 = fb2Group[iter1]; // текущая книга FB2FilesDataInGroup fb2NewGroup = new FB2FilesDataInGroup(); // перебор всех книг в группе, за исключением текущей for (int iter2 = iter1 + 1; iter2 != fb2Group.Count; ++iter2) { // сравнение текущей книги со всеми последующими BookData bd2 = fb2Group[iter2]; // Проверка ID книги на наличие и/или пустоту _compComm.VerifyBookID(bd1); _compComm.VerifyBookID(bd2); if (bd1.Id.ToLower().Equals(bd2.Id.ToLower())) { if (!fb2NewGroup.isBookExists(bd2.Path)) { fb2NewGroup.Add(bd2); } } } if (fb2NewGroup.Count >= 1) { // только для копий, а не для единичных книг fb2NewGroup.Group = fb2Group.Group + " { " + bd1.Id.ToString() + " }"; fb2NewGroup.Insert(0, bd1); if (!ht.ContainsKey(fb2NewGroup.Group)) { ht.Add(fb2NewGroup.Group, fb2NewGroup); } } } return(ht); }
/// <summary> /// Cоздание групп копий по Авторам, относительно найденного Названия Книги /// </summary /// <param name="fb2Group">Экземпляр класса для хранения информации по одинаковым книгам в одной группе</param> /// <param name="WithMiddleName">Учитывать ли отчество Авторов (true) или нет (false) при поиске</param> private Hashtable FindDupForAuthors(FB2FilesDataInGroup fb2Group, bool WithMiddleName) { // в fb2Group.Group - название группы (название книги у всех книг одинаковое, а пути - разные ) // внутри fb2Group в BookData - данные на каждую книгу группы Hashtable ht = new Hashtable(new FB2CultureComparer()); // 2 итератора для перебора всех книг группы. 1-й - только на текущий элемент группы, 2-й - скользящий на все последующие. т.е. iter2 = iter1+1 for (int iter1 = 0; iter1 != fb2Group.Count; ++iter1) { BookData bd1 = fb2Group[iter1]; // текущая книга FB2FilesDataInGroup fb2NewGroup = new FB2FilesDataInGroup(); // перебор всех книг в группе, за исключением текущей for (int iter2 = iter1 + 1; iter2 != fb2Group.Count; ++iter2) { // сравнение текущей книги со всеми последующими BookData bd2 = fb2Group[iter2]; if (bd1.isSameBook(bd2, WithMiddleName, false)) { if (!fb2NewGroup.isBookExists(bd2.Path)) { fb2NewGroup.Add(bd2); } } } if (fb2NewGroup.Count >= 1) { // только для копий, а не для единичных книг fb2NewGroup.Group = fb2Group.Group + " ( " + fb2NewGroup.makeAuthorsString(WithMiddleName, false) + " )"; fb2NewGroup.Insert(0, bd1); if (!ht.ContainsKey(fb2NewGroup.Group)) { ht.Add(fb2NewGroup.Group, fb2NewGroup); } } } return(ht); }