// сохранение списка копий книг в xml-файл private void saveCopiesListToXml(ref BackgroundWorker bw, ref DoWorkEventArgs e, int GroupCountForList, string ToDirName, int CompareMode, string CompareModeName) { if (!Directory.Exists(ToDirName)) { Directory.CreateDirectory(ToDirName); } int ThroughGroupCounterForXML = 0; // "сквозной" счетчик числа групп для каждого создаваемого xml файла копий int GroupCounterForXML = 0; // счетчик (в границых CompareModeName) числа групп для каждого создаваемого xml файла копий int XmlFileNumber = 0; // номер файла - для формирования имени создаваемого xml файла копий // копии fb2 книг по группам if (m_listViewFB2Files.Groups.Count > 0) { ProgressBar.Maximum = m_listViewFB2Files.Items.Count; XDocument doc = createXMLStructure(CompareMode, CompareModeName); int BookInGroups = 0; // число книг (books) в Группах (Groups) int GroupCountInGroups = 0; // число Групп (Group count) в Группах (Groups) bool one = false; foreach (ListViewGroup lvGroup in m_listViewFB2Files.Groups) { if (bw.CancellationPending) { e.Cancel = true; return; } addAllBookInGroup(ref bw, ref e, ref doc, lvGroup, ref BookInGroups, ref GroupCountInGroups); ++GroupCounterForXML; ++ThroughGroupCounterForXML; doc.Root.Element("SelectedItem").SetValue( (m_LastSelectedItem <= GroupCountForList && ThroughGroupCounterForXML <= GroupCountForList) ? m_LastSelectedItem.ToString() : "0" ); if (GroupCountForList <= m_listViewFB2Files.Groups.Count) { if (GroupCounterForXML >= GroupCountForList) { setDataForNode(ref doc, GroupCountInGroups, BookInGroups); doc.Save( Path.Combine(ToDirName, StringProcessing.makeNNNStringOfNumber(++XmlFileNumber) + ".dup_lbc") ); doc.Root.Element("Groups").Elements().Remove(); GroupCountInGroups = 0; GroupCounterForXML = 0; BookInGroups = 0; } else { // последний диаппазон Групп if (ThroughGroupCounterForXML == m_listViewFB2Files.Groups.Count) { setDataForNode(ref doc, GroupCountInGroups, BookInGroups); doc.Save( Path.Combine(ToDirName, StringProcessing.makeNNNStringOfNumber(++XmlFileNumber) + ".dup_lbc") ); } } } else { setDataForNode(ref doc, GroupCountInGroups, BookInGroups); one = true; } } // по всем Группам if (one) { doc.Save(Path.Combine(ToDirName, "001.dup_lbc")); } } }
// ============================================================================================= // СОХРАНЕНИЕ РЕЗУЛЬТАТА ПОИСКА КОПИЙ В 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); }