/// <summary> /// создание итема в списке для невалидной книги /// </summary> private void createNotValidateBookItem(string FilePath, FB2UnionGenres fb2g, FB2Validator fv2Validator, SharpZipLibWorker sharpZipLib) { if (File.Exists(FilePath)) { string TempDir = Settings.Settings.TempDirPath; string FileExt = Path.GetExtension(FilePath); ListViewItem.ListViewSubItem[] subItems; if (FilesWorker.isFB2File(FilePath) || FilesWorker.isFB2Archive(FilePath)) { ListViewItem item = new ListViewItem(FilePath, FilesWorker.isFB2File(FilePath) ? 1 : 2); try { if (FilesWorker.isFB2File(FilePath)) { item.ForeColor = Colors.FB2ForeColor; subItems = createSubItemsWithMetaData(FilePath, FileExt, item, ref fb2g, ref fv2Validator); } else { // для zip-архивов FilesWorker.RemoveDir(TempDir); sharpZipLib.UnZipFB2Files(FilePath, TempDir); string [] files = Directory.GetFiles(TempDir); if (FilesWorker.isFB2File(files[0])) { item.ForeColor = Colors.ZipFB2ForeColor; subItems = createSubItemsWithMetaData(files[0], FileExt, item, ref fb2g, ref fv2Validator); } else { item.ForeColor = Colors.BadZipForeColor; subItems = WorksWithBooks.createEmptySubItemsForItem(item); } } if (subItems != null) { item.SubItems.AddRange(subItems); } } catch (Exception ex) { Debug.DebugMessage( null, ex, "FB2NotValidateForm.createNotValidateBookItem(): Создание итема в списке для невалидной книги." ); subItems = WorksWithBooks.createEmptySubItemsForItem(item); if (subItems != null) { item.SubItems.AddRange(subItems); item.ForeColor = Colors.BadZipForeColor; } } item.Tag = new ListViewItemType("f", FilePath); item.BackColor = Colors.FileBackColor; if (subItems != null) { m_listViewFB2Files.Items.Add(item); } } } }
// ============================================================================================= // ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ ДЛЯ BACKGROUNDWORKER // ============================================================================================= #region BackgroundWorker: Вспомогательные методы /// <summary> /// поиск невалидных книг /// </summary> private void searchNotValidateFiles(object sender, DoWorkEventArgs e, List <string> FilesList) { BackgroundWorker worker = sender as BackgroundWorker; ProgressBar.Maximum = FilesList.Count; int i = 0; List <string> FinishedFilesList = new List <string>(); foreach (string FilePath in FilesList) { if (worker.CancellationPending) { // удаление из списка всех файлов обработанные книги (файлы) WorksWithBooks.removeFinishedFilesInFilesList(ref FilesList, ref FinishedFilesList); e.Cancel = true; return; } createNotValidateBookItem(FilePath, m_fb2Genres, m_fv2Validator, m_sharpZipLib); // обработанные файлы FinishedFilesList.Add(FilePath); worker.ReportProgress(i++); } // удаление из списка всех файлов обработанные книги (файлы) WorksWithBooks.removeFinishedFilesInFilesList(ref FilesList, ref FinishedFilesList); }
// загрузка Жанров для правки private void loadGenresFromFB2Files(Enums.TitleInfoEnum TitleInfoType) { FB2UnionGenres fb2g = new FB2UnionGenres(); foreach (FB2ItemInfo Info in m_GenreFB2InfoList) { if (Info.FictionBook != null) { IList <Genre> GenresList = TitleInfoType == Enums.TitleInfoEnum.TitleInfo ? Info.FictionBook.TIGenres : Info.FictionBook.STIGenres; if (GenresList != null) { foreach (Genre g in GenresList) { if (g != null) { if (!WorksWithBooks.genreIsExist(GenresListView, g, fb2g)) { ListViewItem lvi = new ListViewItem( !string.IsNullOrEmpty(g.Name) ? fb2g.GetFBGenreName(g.Name) + " (" + g.Name + ")" : string.Empty ); lvi.SubItems.Add(!string.IsNullOrEmpty(g.Math.ToString()) ? g.Math.ToString() : string.Empty); if (!string.IsNullOrEmpty(g.Name)) { GenresListView.Items.Add(lvi); } } } } } } } }
// удаление всех элементов Списка, для которых отсутствуют файлы на жестком диске для Дубликатора public static void deleteAllItemForNonExistFileWithCounter(ListView listView, ListViewItem RemoveListViewItem, bool RemoveFast) { if (!RemoveFast) { if (listView.Items.Count > 0) { ListViewGroup lvg = RemoveListViewItem.Group; listView.Items.Remove(RemoveListViewItem); if (lvg != null && lvg.Items.Count <= 1) { if (lvg.Items.Count == 1) { listView.Items[lvg.Items[0].Index].Remove(); } listView.Groups.Remove(lvg); } } } else { // пометка цветом и зачеркиванием удаленных книг с диска, но не из списка (быстрый режим удаления) WorksWithBooks.markRemoverFileInCopyesList(RemoveListViewItem); } }
private void bw_DoWork(object sender, DoWorkEventArgs e) { Cursor.Current = Cursors.WaitCursor; FB2DescriptionCorrector fB2Corrector = null; foreach (FB2ItemInfo Info in m_KeywordsFB2InfoList) { FictionBook fb2 = Info.FictionBook; if (fb2 != null) { fB2Corrector = new FB2DescriptionCorrector(fb2); fB2Corrector.recoveryDescriptionNode(); XmlNode xmlTI = fb2.getTitleInfoNode(TitleInfoEnum.TitleInfo); if (xmlTI != null) { string kw = string.Empty; string kwOld = fb2.getKeywordsNode(TitleInfoEnum.TitleInfo).InnerText; if (AddRadioButton.Checked) { // добавить новые ключевые слова к существующим kw = !string.IsNullOrWhiteSpace(kwOld) ? (kwOld + "," + KeywordsTextBox.Text.Trim()) : KeywordsTextBox.Text.Trim(); } else { // заменить существующие ключевые слова на новые kw = KeywordsTextBox.Text.Trim(); } xmlTI.ReplaceChild( fB2Corrector.makeKeywordsNode(kw), fb2.getKeywordsNode(TitleInfoEnum.TitleInfo) ); // сохранение fb2 файла if (!Directory.Exists(m_TempDir)) { Directory.CreateDirectory(m_TempDir); } string NewPath = Info.IsFromZip ? Info.FilePathIfFromZip : Info.FilePathSource; fb2.saveToFB2File(NewPath, false); if (Info.IsFromZip) { WorksWithBooks.zipMoveTempFB2FileTo(m_sharpZipLib, NewPath, Info.FilePathSource); } if (Info.IsFromZip && File.Exists(NewPath)) { File.Delete(NewPath); } } } m_bw.ReportProgress(1); ProgressBar.Update(); } Cursor.Current = Cursors.Default; }
// генерация списка файлов - создание итемов listViewSource private void bw_DoWork(object sender, DoWorkEventArgs e) { m_dtStart = DateTime.Now; FB2UnionGenres fb2Genres = new FB2UnionGenres(); if (!WorksWithBooks.generateBooksListWithMetaData(m_listView, m_dirPath, ref fb2Genres, true, false, false, this, ProgressBar, m_bw, e)) { e.Cancel = true; } }
private void bw_DoWork(object sender, DoWorkEventArgs e) { Cursor.Current = Cursors.WaitCursor; FB2DescriptionCorrector fB2Corrector = null; foreach (FB2ItemInfo Info in m_SequencesFB2InfoList) { FictionBook fb2 = Info.FictionBook; if (fb2 != null) { fB2Corrector = new FB2DescriptionCorrector(fb2); fB2Corrector.recoveryDescriptionNode(); XmlNode xmlTI = fb2.getTitleInfoNode(TitleInfoEnum.TitleInfo); if (xmlTI != null) { if (RemoveRadioButton.Checked || ReplaceRadioButton.Checked) { // удаление всех Серий foreach (XmlNode node in fb2.getSequencesNode(TitleInfoEnum.TitleInfo)) { xmlTI.RemoveChild(node); } } if (AddRadioButton.Checked || ReplaceRadioButton.Checked) { // добавление новой Серии xmlTI.AppendChild( fB2Corrector.makeSequenceNode(SequencesTextBox.Text.Trim(), NumberTextBox.Text.Trim()) ); } // сохранение fb2 файла if (!Directory.Exists(m_TempDir)) { Directory.CreateDirectory(m_TempDir); } string NewPath = Info.IsFromZip ? Info.FilePathIfFromZip : Info.FilePathSource; fb2.saveToFB2File(NewPath, false); if (Info.IsFromZip) { WorksWithBooks.zipMoveTempFB2FileTo(m_sharpZipLib, NewPath, Info.FilePathSource); } if (Info.IsFromZip && File.Exists(NewPath)) { File.Delete(NewPath); } } } m_bw.ReportProgress(1); ProgressBar.Update(); } Cursor.Current = Cursors.Default; }
/// <summary> /// Сравнение 2-х файлов: fb2, fb2 из zip или fb2 из fbz /// </summary> /// <param name="DiffPath">Путь к diff-программе сравнения fb2 файла</param> /// <param name="FB2File1Path">Путь к 1-му исходному fb2, zip или fbz-файлу</param> /// <param name="FB2File2Path">Путь ко 2-му исходному fb2, zip или fbz-файлу</param> /// <param name="TempDirForFile1">Путь к временной папке для 1-го распакованного fb2 файла </param> /// <param name="TempDirForFile2">Путь к временной папке для 2-го распакованного fb2 файла </param> public static void DiffFB2(string DiffPath, string FB2File1Path, string FB2File2Path, string TempDirForFile1, string TempDirForFile2) { Cursor.Current = Cursors.WaitCursor; string TempFile1Path = null; string TempFile2Path = null; // создание путей (или распаковка) к исходным fb2 файлам, участвующим в сравнении if (FilesWorker.isFB2File(FB2File1Path)) { TempFile1Path = FB2File1Path; } else if (FilesWorker.isFB2Archive(FB2File1Path)) { TempFile1Path = getFileFromZipFBZ(FB2File1Path, TempDirForFile1); } if (FilesWorker.isFB2File(FB2File2Path)) { TempFile2Path = FB2File2Path; } else if (FilesWorker.isFB2Archive(FB2File2Path)) { TempFile2Path = getFileFromZipFBZ(FB2File2Path, TempDirForFile2); } // Сравнение файлов if (!string.IsNullOrWhiteSpace(TempFile1Path) && !string.IsNullOrWhiteSpace(TempFile2Path)) { FilesWorker.StartDiff(true, DiffPath, TempFile1Path, TempFile2Path); } // завершенн работы (перепаковка файла(ов), если он(они) были извлечены из архива) if (FilesWorker.isFB2Archive(FB2File1Path) && !string.IsNullOrWhiteSpace(TempFile1Path)) { WorksWithBooks.zipMoveTempFB2FileTo(m_sharpZipLib, TempFile1Path, FB2File1Path); } if (FilesWorker.isFB2Archive(FB2File2Path) && !string.IsNullOrWhiteSpace(TempFile2Path)) { WorksWithBooks.zipMoveTempFB2FileTo(m_sharpZipLib, TempFile2Path, FB2File2Path); } // удаление временных файлов, если они есть FilesWorker.RemoveDir(TempDirForFile1); FilesWorker.RemoveDir(TempDirForFile2); Cursor.Current = Cursors.Default; }
private void bw_DoWork(object sender, DoWorkEventArgs e) { Cursor.Current = Cursors.WaitCursor; FB2DescriptionCorrector fB2Corrector = null; foreach (FB2ItemInfo Info in m_LangFB2InfoList) { FictionBook fb2 = Info.FictionBook; if (fb2 != null) { fB2Corrector = new FB2DescriptionCorrector(fb2); fB2Corrector.recoveryDescriptionNode(); XmlNode xmlTI = fb2.getTitleInfoNode(TitleInfoEnum.TitleInfo); if (xmlTI != null) { xmlTI.ReplaceChild( fB2Corrector.makeLangNode(LangComboBox.Text.Substring(LangComboBox.Text.IndexOf('(') + 1, 2)), fb2.getLangNode(TitleInfoEnum.TitleInfo) ); // сохранение fb2 файла if (!Directory.Exists(m_TempDir)) { Directory.CreateDirectory(m_TempDir); } string NewPath = Info.IsFromZip ? Info.FilePathIfFromZip : Info.FilePathSource; fb2.saveToFB2File(NewPath, false); if (Info.IsFromZip) { WorksWithBooks.zipMoveTempFB2FileTo(m_sharpZipLib, NewPath, Info.FilePathSource); } if (Info.IsFromZip && File.Exists(NewPath)) { File.Delete(NewPath); } } } m_bw.ReportProgress(1); ProgressBar.Update(); } Cursor.Current = Cursors.Default; }
/// <summary> /// Правка fb2 и перепаковка fb2 из zip, fbz /// </summary> /// <param name="SourceFilePath">Путь к исходному fb2, zip или fbz-файлу</param> /// <param name="FB2ProgramPath">Путь к программе правки fb2 файла</param> public static void StartFB2_FBZForEdit(string SourceFilePath, string FB2ProgramPath) { Cursor.Current = Cursors.WaitCursor; if (FilesWorker.isFB2Archive(SourceFilePath)) { string TempFileFromZipPath = getFileFromZipFBZ(SourceFilePath, m_TempDir); if (!string.IsNullOrWhiteSpace(TempFileFromZipPath)) { FilesWorker.StartFile(true, FB2ProgramPath, TempFileFromZipPath); WorksWithBooks.zipMoveTempFB2FileTo(m_sharpZipLib, TempFileFromZipPath, SourceFilePath); FilesWorker.RemoveDir(m_TempDir); } } else { FilesWorker.StartFile(true, FB2ProgramPath, SourceFilePath); } Cursor.Current = Cursors.Default; }
public EditGenreInfoForm(ref IList <FB2ItemInfo> GenreFB2InfoList) { InitializeComponent(); initializeBackgroundWorker(); this.Text += String.Format(" : {0} книг", GenreFB2InfoList.Count); m_GenreFB2InfoList = GenreFB2InfoList; // формирование Списка Групп Жанров WorksWithBooks.makeListGenresGroups(GroupComboBox); // загрузка Жанров для правки loadGenresFromFB2Files(TitleInfoEnum.TitleInfo); ControlPanel.Enabled = true; GenresSchemePanel.Enabled = true; GenreWorkPanel.Enabled = true; ProgressBar.Maximum = GenreFB2InfoList.Count; }
// ============================================================================================= // ВСПОМОГАТЕЛЬНЫЕ МЕТОДЫ ДЛЯ BACKGROUNDWORKER // ============================================================================================= #region BackgroundWorker: Вспомогательные методы private void validateFile(ListViewItem lvi, ref FB2Validator fv2Validator) { if (WorksWithBooks.isFileItem(lvi)) { string FilePath = Path.Combine(m_SourceDir.Trim(), lvi.SubItems[0].Text); if (File.Exists(FilePath)) { string Msg = fv2Validator.ValidatingFB2File(FilePath); lvi.SubItems[(int)ResultViewCollumnEnum.Validate].Text = Msg == string.Empty ? "Да" : "Нет"; if (!string.IsNullOrEmpty(Msg)) { lvi.ForeColor = Colors.FB2NotValidForeColor; } else { lvi.ForeColor = FilesWorker.isFB2File(FilePath) ? Color.FromName("WindowText") : Colors.ZipFB2ForeColor; } } } }
// генерация списка файлов с описанием из метаданных private void bw_DoWork(object sender, DoWorkEventArgs e) { m_dtStart = DateTime.Now; FB2UnionGenres fb2Genres = new FB2UnionGenres(); if (!m_isCreateItems) { // отображение/скрытие метаданных данных книг в Списке Сортировщика if (m_listViewFB2Files.Items.Count > 0) { ProgressBar.Maximum = m_listViewFB2Files.Items.Count; if ( !WorksWithBooks.viewOrHideBookMetaDataLocal( m_listViewFB2Files, ref fb2Genres, m_isTagsView, m_bw, e ) ) { e.Cancel = true; } } } else { // генерация списка файлов - создание итемов listViewSource if ( !WorksWithBooks.generateBooksListWithMetaData( m_listViewFB2Files, m_dirPath, ref fb2Genres, m_isTagsView, true, false, this, ProgressBar, m_bw, e ) ) { e.Cancel = true; } } }
private void bw_DoWork(object sender, DoWorkEventArgs e) { Cursor.Current = Cursors.WaitCursor; FB2DescriptionCorrector fB2Corrector = null; foreach (FB2ItemInfo Info in m_AuthorFB2InfoList) { FictionBook fb2 = Info.FictionBook; if (fb2 != null) { // восстанавление раздела description до структуры с необходимыми элементами для валидности fB2Corrector = new FB2DescriptionCorrector(fb2); fB2Corrector.recoveryDescriptionNode(); IList <XmlNode> xmlNewAuthors = makeAuthorNode(Enums.AuthorEnum.AuthorOfBook, ref fb2, AuthorsListView); if (xmlNewAuthors != null) { XmlNodeList xmlAuthorList = fb2.getAuthorNodes(TitleInfoEnum.TitleInfo); if (xmlAuthorList != null) { XmlNode xmlBookTitleNode = fb2.getBookTitleNode(TitleInfoEnum.TitleInfo); if (xmlBookTitleNode != null) { XmlNode xmlTINode = fb2.getTitleInfoNode(TitleInfoEnum.TitleInfo); if (xmlTINode != null) { // удаление старых данных Авторов foreach (XmlNode Author in xmlAuthorList) { xmlTINode.RemoveChild(Author); } // добавление новых данных Авторов foreach (XmlNode Author in xmlNewAuthors) { xmlTINode.InsertBefore(Author, xmlBookTitleNode); } // сохранение fb2 файла if (!Directory.Exists(m_TempDir)) { Directory.CreateDirectory(m_TempDir); } string NewPath = Info.IsFromZip ? Info.FilePathIfFromZip : Info.FilePathSource; fb2.saveToFB2File(NewPath, false); if (Info.IsFromZip) { WorksWithBooks.zipMoveTempFB2FileTo(m_sharpZipLib, NewPath, Info.FilePathSource); } if (Info.IsFromZip && File.Exists(NewPath)) { File.Delete(NewPath); } } } } } } m_bw.ReportProgress(1); ProgressBar.Update(); } Cursor.Current = Cursors.Default; }
// загрузка Авторов для правки private void loadAuthorsFromFB2Files() { foreach (FB2ItemInfo Info in m_AuthorFB2InfoList) { if (Info.FictionBook != null) { IList <Author> AuthorsList = Info.FictionBook.TIAuthors; if (AuthorsList != null) { foreach (Author a in AuthorsList) { if (a != null) { if (!WorksWithBooks.authorIsExist(AuthorsListView, a)) { ListViewItem lvi = new ListViewItem(""); if (a.LastName != null) { lvi.Text = !string.IsNullOrEmpty(a.LastName.Value) ? a.LastName.Value : string.Empty; } if (a.FirstName != null) { lvi.SubItems.Add(!string.IsNullOrEmpty(a.FirstName.Value) ? a.FirstName.Value : string.Empty); } else { lvi.SubItems.Add(string.Empty); } if (a.MiddleName != null) { lvi.SubItems.Add(!string.IsNullOrEmpty(a.MiddleName.Value) ? a.MiddleName.Value : string.Empty); } else { lvi.SubItems.Add(string.Empty); } if (a.NickName != null) { lvi.SubItems.Add(!string.IsNullOrEmpty(a.NickName.Value) ? a.NickName.Value : string.Empty); } else { lvi.SubItems.Add(string.Empty); } if (a.HomePages != null) { lvi.SubItems.Add(StringProcessing.makeStringFromListItems(a.HomePages)); } else { lvi.SubItems.Add(string.Empty); } if (a.Emails != null) { lvi.SubItems.Add(StringProcessing.makeStringFromListItems(a.Emails)); } else { lvi.SubItems.Add(string.Empty); } lvi.SubItems.Add(!string.IsNullOrEmpty(a.ID) ? a.ID : string.Empty); AuthorsListView.Items.Add(lvi); } } } } } } }
void GroupComboBoxSelectedIndexChanged(object sender, EventArgs e) { // формирование Списка Жанров в контролы, в зависимости от Группы WorksWithBooks.makeListGenres(GenresComboBox, GroupComboBox.Text); }
/// <summary> /// Хеширование файлов в контексте Id книг: /// Одинаковый Id Книги (копии и/или разные версии правки одной и той же книги) /// </summary> /// <param name="FilesList">Список файлов для сканированияl</param> /// <param name="htFB2ForID">Хеш Таблица с книгами с одинаковыми ID</param> /// <returns>Признак непрерывности обработки файлов</returns> public bool FilesHashForIDParser(BackgroundWorker bw, DoWorkEventArgs e, Label StatusLabel, ProgressBar ProgressBar, string TempDir, List <string> FilesList, HashtableClass htFB2ForID) { StatusLabel.Text += "Хэширование по Id книг...\r"; ProgressBar.Maximum = FilesList.Count; ProgressBar.Value = 0; List <string> FinishedFilesList = new List <string>(); for (int i = 0; i != FilesList.Count; ++i) { if (FilesWorker.isFB2File(FilesList[i])) { // заполнение хеш таблицы данными о fb2-книгах в контексте их ID MakeFB2IDHashTable(null, FilesList[i], ref htFB2ForID); // обработанные файлы FinishedFilesList.Add(FilesList[i]); } else { if (FilesWorker.isFB2Archive(FilesList[i])) { try { if (_sharpZipLib.UnZipFB2Files(FilesList[i], TempDir) != -1) { string[] files = Directory.GetFiles(TempDir); if (files.Length > 0) { if (FilesWorker.isFB2File(files[0])) { // заполнение хеш таблицы данными о fb2-книгах в контексте их ID MakeFB2IDHashTable(FilesList[i], files[0], ref htFB2ForID); // обработанные файлы FinishedFilesList.Add(FilesList[i]); } } } } catch (Exception ex) { Debug.DebugMessage( FilesList[i], ex, "Дубликатор.CompareForm.FilesHashForIDParser(): Хеширование файлов в контексте Id книг." ); } FilesWorker.RemoveDir(TempDir); } } bw.ReportProgress(i); // отобразим данные в контролах if (bw.CancellationPending) { // удаление из списка всех файлов обработанных книг WorksWithBooks.removeFinishedFilesInFilesList(ref FilesList, ref FinishedFilesList); e.Cancel = true; return(false); } } // удаление элементов таблицы, value (списки) которых состоят из 1-го элемента (это не копии) _compComm.removeNotCopiesEntryInHashTable(htFB2ForID); // удаление из списка всех файлов обработанных книг WorksWithBooks.removeFinishedFilesInFilesList(ref FilesList, ref FinishedFilesList); return(true); }