Ejemplo n.º 1
0
        /// <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; //ИЗБЫТОЧНЫЙ КОД
            }
        }
Ejemplo n.º 2
0
        /// <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; //ИЗБЫТОЧНЫЙ КОД
            }
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Проверка - та же самая ли это книга:
 /// сравнение проводится только по Авторам (только по Авторам fb2 файлов): число авторов в книгах может быть разным;
 /// без учета Path (книги могут быть абсолютно одинаковые, но размещаться в разных папках);
 /// без учета жанров (книги могут быть одинаковые, но разные книгоделатели присвоили им разные жанры);
 /// без учета ID, версии, кодировки...
 /// </summary>
 /// <param name="RightValue">Данные книги для сравнения</param>
 /// <param name="WithMiddleName">учитывать Отчество Автора (true)</param>
 /// <param name="IsFB2Author">Автор книги (false) или Автора fb2 файла (true)</param>
 public bool isSameBook(BookData RightValue, bool WithMiddleName, bool IsFB2Author)
 {
     if (!IsFB2Author)
     {
         // Для Авторов книги
         return(RightValue != null
                             ? isSameAuthors(this.Authors, RightValue.Authors, WithMiddleName, IsFB2Author)
                             : false);
     }
     else
     {
         // Для Авторов fb2 файла
         return(RightValue != null
             ? isSameAuthors(this.FB2Authors, RightValue.FB2Authors, WithMiddleName, IsFB2Author)
             : false);
     }
 }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
 /// <summary>
 /// Проверка - таже самая ли это книга:
 /// сравнение проводится только по Авторам: число авторов в книгах может быть разным;
 /// без учета Path (книги могут быть абсолютно одинаковые, но размещаться в раных папках);
 /// без учета жанров (книги могут быть одинаковые, но разные книгоделатели присвоили им разные жанры);
 /// без учета ID, версии, кодировки...
 /// </summary>
 /// <param name="RightValue">Данные книги для сравнения</param>
 /// <param name="WithMiddleName">учитывать Отчество Автора (true)</param>
 public bool isSameBook(BookData RightValue, bool WithMiddleName)
 {
     return(RightValue != null
                         ? isSameAuthors(this.Authors, RightValue.Authors, WithMiddleName)
                         : false);
 }