Beispiel #1
0
        /// <summary>
        /// Создание дерева списка копий для всех режимов сравнения
        /// </summary
        /// <param name="bw">Экземплар фонового обработчика класса BackgroundWorker</param>
        /// <param name="e">Экземпляр класса DoWorkEventArgs</param>
        /// <param name="ht">Заполненная хеш-таблица списками книг</param>
        /// <returns>Признак непрерывности обработки файлов</returns>
        public bool makeTreeOfBookCopies(BackgroundWorker bw, DoWorkEventArgs e,
                                         Label StatusLabel, ProgressBar ProgressBar, ListView listViewFB2Files,
                                         ref StatusView sv, HashtableClass ht)
        {
            StatusLabel.Text   += "Создание списка (псевдодерево) одинаковых fb2-файлов...\r";
            ProgressBar.Maximum = ht.Values.Count;
            ProgressBar.Value   = 0;
            // сортировка ключей (групп)
            List <string> keyList = makeSortedKeysForGroups(ht);
            int           i       = 0;

            foreach (string key in keyList)
            {
                ++sv.Group; // число групп одинаковых книг
                            // формирование представления Групп с их книгами
                makeBookCopiesView((FB2FilesDataInGroup)ht[key], listViewFB2Files, ref sv);
                bw.ReportProgress(++i);

                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                    return(false);
                }
            }
            return(true);
        }
Beispiel #2
0
        /// <summary>
        /// Добавление Группы в Список Групп
        /// </summary>
        /// <param name="bw">BackgroundWorker</param>
        /// <param name="e">DoWorkEventArgs</param>
        /// <param name="doc">xml документ - объект класса XDocument, в который заносятся данные на книги Групп</param>
        /// <param name="fb2BookList">Список данных fb2 книг для конкретной Группы</param>
        /// <param name="BookInGroups">Число книг в Группе</param>
        /// <param name="GroupCountInGroups">Счетчик числа Групп</param>
        private void addAllBookInGroup(BackgroundWorker bw, DoWorkEventArgs e,
                                       XDocument doc, FB2FilesDataInGroup fb2BookList,
                                       ref int BookInGroups, ref int GroupCountInGroups,
                                       ref StatusView sv)
        {
            BookInGroups += fb2BookList.Count;

            // Добавление Группы в Список Групп
            XElement xeGroup = null;

            doc.Root.Element("Groups").Add(
                xeGroup = new XElement(
                    "Group", new XAttribute("number", 0),
                    new XAttribute("count", fb2BookList.Count),
                    new XAttribute("name", fb2BookList.Group)
                    )
                );

            int BookNumber       = 0;   // номер Книги (Book number) В Группе (Group)
            int BookCountInGroup = 0;   // число Книг (Group count) в Группе (Group)

            foreach (BookData bd in fb2BookList)
            {
                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

                ++sv.AllFB2InGroups; // число книг во всех группах одинаковых книг
                string sForeColor = "WindowText";
                if (FilesWorker.isFB2Archive(bd.Path))
                {
                    sForeColor = Colors.ZipFB2ForeColor.Name;
                }
                string Validation = _fv2Validator.ValidatingFB2File(bd.Path);
                if (string.IsNullOrEmpty(Validation))
                {
                    Validation = "Да";
                    sForeColor = FilesWorker.isFB2File(bd.Path) ? "WindowText" : Colors.ZipFB2ForeColor.Name;
                }
                else
                {
                    Validation = "Нет";
                    sForeColor = Colors.FB2NotValidForeColor.Name;
                }
                // Добавление Книги в Группу
                xeGroup.Add(
                    new XElement("Book", new XAttribute("number", ++BookNumber),
                                 new XElement("Group", fb2BookList.Group),
                                 new XElement("Path", bd.Path),
                                 new XElement("BookTitle", MakeBookTitleString(bd.BookTitle)),
                                 new XElement("Authors", MakeAuthorsString(bd.Authors)),
                                 new XElement("Genres", MakeGenresString(bd.Genres)),
                                 new XElement("BookLang", bd.Lang),
                                 new XElement("BookID", bd.Id),
                                 new XElement("Version", bd.Version),
                                 new XElement("FB2Authors", MakeAuthorsString(bd.FB2Authors)),
                                 new XElement("Encoding", bd.Encoding),
                                 new XElement("Validation", Validation),
                                 new XElement("FileLength", GetFileLength(bd.Path)),
                                 new XElement("FileCreationTime", GetFileCreationTime(bd.Path)),
                                 new XElement("FileLastWriteTime", FileLastWriteTime(bd.Path)),
                                 new XElement("ForeColor", sForeColor),
                                 new XElement("BackColor", "Window"),
                                 new XElement("IsChecked", false)
                                 )
                    );

                xeGroup.SetAttributeValue("count", ++BookCountInGroup);
                if (!xeGroup.HasElements)
                {
                    xeGroup.Remove();
                }
            } // по всем книгам Группы
            ++GroupCountInGroups;
        }
Beispiel #3
0
        // =============================================================================================
        //                          СОХРАНЕНИЕ РЕЗУЛЬТАТА ПОИСКА КОПИЙ В XML-ФАЙЛЫ
        // =============================================================================================
        #region Сохранение результата поиска копий в xml-файлы
        /// <summary>
        /// Сохранение результата сразу в xml-файлы без построения визуального списка
        /// </summary>
        /// <param name="bw">Ссылка на объект класса BackgroundWorker</param>
        /// <param name="e">Ссылка на объект класса DoWorkEventArgs</param>
        /// <param name="GroupCountForList">Число Групп в Списке Групп</param>
        /// <param name="CompareMode">Вид сравнения при поиске копий</param>
        /// <param name="CompareModeName">Название вида сравнения при поиске копий</param>
        /// <param name="ht">Хэш-таблица данных на Группы (копии fb2 книг по Группам)</param>
        /// <returns>Признак непрерывности обработки файлов</returns>
        public bool saveCopiesListToXml(BackgroundWorker bw, DoWorkEventArgs e, int GroupCountForList,
                                        int CompareMode, string CompareModeName, Label StatusLabel, ProgressBar ProgressBar,
                                        ref StatusView sv, string SourceDir, bool ScanSubDirs,
                                        int GroupCountForListIndex, bool IsSaveGroupToXMLWithoutTree, HashtableClass ht)

        {
            // блокировка отмены сохранения результата в файлы
            StatusLabel.Text   += "Сохранение результата поиска в xml-файлы (папка '_Copies') без построения дерева копий...\r";
            ProgressBar.Maximum = ht.Values.Count;
            ProgressBar.Value   = 0;

            const string ToDirName = "_Copies";

            if (!Directory.Exists(ToDirName))
            {
                Directory.CreateDirectory(ToDirName);
            }

            // "сквозной" счетчик числа групп для каждого создаваемого xml файла копий
            int ThroughGroupCounterForXML = 0;
            // счетчик (в границых CompareModeName) числа групп для каждого создаваемого xml файла копий
            int GroupCounterForXML = 0;
            // номер файла - для формирования имени создаваемого xml файла копий
            int XmlFileNumber = 0;

            // копии fb2 книг по группам
            if (ht.Values.Count > 0)
            {
                XDocument doc = createXMLStructure(CompareMode, CompareModeName, SourceDir, ScanSubDirs,
                                                   GroupCountForListIndex, IsSaveGroupToXMLWithoutTree);

                int  BookInGroups       = 0; // число книг (books) в Группах (Groups)
                int  GroupCountInGroups = 0; // число Групп (Group count) в Группах (Groups)
                int  i   = 0;                // прогресс
                bool one = false;
                // сортировка ключей (групп)
                List <string> keyList = makeSortedKeysForGroups(ht);
                foreach (string key in keyList)
                {
                    ++sv.Group; // число групп одинаковых книг
                    // формирование представления Групп с их книгами
                    addAllBookInGroup(bw, e, doc, (FB2FilesDataInGroup)ht[key], ref BookInGroups, ref GroupCountInGroups, ref sv);

                    ++GroupCounterForXML;
                    ++ThroughGroupCounterForXML;
                    doc.Root.Element("SelectedItem").SetValue("0");
                    if (GroupCountForList <= ht.Values.Count)
                    {
                        if (GroupCounterForXML >= GroupCountForList)
                        {
                            string FileNumber = StringProcessing.makeNNNStringOfNumber(++XmlFileNumber) + ".dup_lbc";
                            setDataForNode(doc, GroupCountInGroups, BookInGroups);
                            doc.Save(Path.Combine(ToDirName, FileNumber));
                            StatusLabel.Text += "Файл: '_Copies\\" + FileNumber + "' создан...\r";
                            doc.Root.Element("Groups").Elements().Remove();
                            GroupCountInGroups = 0;
                            GroupCounterForXML = 0;
                            BookInGroups       = 0;
                        }
                        else
                        {
                            // последний диаппазон Групп
                            if (ThroughGroupCounterForXML == ht.Values.Count)
                            {
                                string FileNumber = StringProcessing.makeNNNStringOfNumber(++XmlFileNumber) + ".dup_lbc";
                                setDataForNode(doc, GroupCountInGroups, BookInGroups);
                                doc.Save(Path.Combine(ToDirName, FileNumber));
                                StatusLabel.Text += "Файл: '_Copies\\" + FileNumber + "' создан...\r";
                            }
                        }
                    }
                    else
                    {
                        setDataForNode(doc, GroupCountInGroups, BookInGroups);
                        one = true;
                    }
                    bw.ReportProgress(i++);

                    if (bw.CancellationPending)
                    {
                        e.Cancel = true;
                        return(false);
                    }
                } // по всем Группам
                if (one)
                {
                    StatusLabel.Text += @"Файл: '_Copies\001.dup_lbc' ...\r";
                    doc.Save(Path.Combine(ToDirName, "001.dup_lbc"));
                }
            }
            return(true);
        }
Beispiel #4
0
        /// <summary>
        /// Формирование представления Групп с их книгами
        /// </summary>
        private void makeBookCopiesView(FB2FilesDataInGroup fb2BookList, ListView listViewFB2Files, ref StatusView sv)
        {
            Hashtable     htBookGroups = new Hashtable(new FB2CultureComparer()); // хеш-таблица групп одинаковых книг
            ListViewGroup lvGroup      = null;                                    // группа одинаковых книг
            string        Valid        = string.Empty;

            foreach (BookData bd in fb2BookList)
            {
                ++sv.AllFB2InGroups; // число книг во всех группах одинаковых книг
                lvGroup = new ListViewGroup(fb2BookList.Group);
                ListViewItem lvi = new ListViewItem(bd.Path);
                if (FilesWorker.isFB2Archive(bd.Path))
                {
                    lvi.ForeColor = Colors.ZipFB2ForeColor;
                }
                lvi.SubItems.Add(MakeBookTitleString(bd.BookTitle));
                lvi.SubItems.Add(MakeAuthorsString(bd.Authors));
                lvi.SubItems.Add(MakeGenresString(bd.Genres));
                lvi.SubItems.Add(bd.Lang);
                lvi.SubItems.Add(bd.Id);
                lvi.SubItems.Add(bd.Version);
                lvi.SubItems.Add(bd.Encoding);

                Valid = _fv2Validator.ValidatingFB2File(bd.Path);
                if (string.IsNullOrEmpty(Valid))
                {
                    Valid         = "Да";
                    lvi.ForeColor = FilesWorker.isFB2File(bd.Path) ? Color.FromName("WindowText") : Colors.ZipFB2ForeColor;
                }
                else
                {
                    Valid         = "Нет";
                    lvi.ForeColor = Colors.FB2NotValidForeColor;
                }

                lvi.SubItems.Add(Valid);
                lvi.SubItems.Add(GetFileLength(bd.Path));
                lvi.SubItems.Add(GetFileCreationTime(bd.Path));
                lvi.SubItems.Add(FileLastWriteTime(bd.Path));
                // заносим группу в хеш, если она там отсутствует
                AddBookGroupInHashTable(htBookGroups, lvGroup);
                // присваиваем группу книге
                listViewFB2Files.Groups.Add((ListViewGroup)htBookGroups[fb2BookList.Group]);
                lvi.Group = (ListViewGroup)htBookGroups[fb2BookList.Group];
                listViewFB2Files.Items.Add(lvi);
            }
        }