public List <string> OnNext(ExtractResult e) { List <string> existUrls = CollectionStore.GetExistUrls(rootUrl, e.Hrefs); if (existUrls != null && existUrls.Count > 0) { e.Hrefs.RemoveAll(u => existUrls.Contains(u)); } string localFileName = DataProcess?.Save(rootUrl, e); //delete url from 0 //move url to 1 CollectionStore.MoveUrl(rootUrl, new CollectionStore.UrlModel() { Url = e.OriginUrl, Level = e.Level, localFileName = localFileName }); //save into redis CollectionStore.AddUrls(rootUrl, e.Hrefs, e.Level); Console.WriteLine($"{e.Level}, {e.OriginUrl}, {e.Hrefs?.Count}"); return(e.Hrefs); }
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { MessageBoxResult result = MessageBoxResult.Yes; if (CollectionStore.Settings != null && CollectionStore.Settings.IsChanged) { result = Classes.UI.MessageBox.Show("Текущие изменения не сохранены, закрыть?", App.Name, MessageBoxButton.YesNo, MessageBoxImage.Warning); } else { foreach (string collectionName in CollectionStore.ActualCollections) { if (CollectionStore.Get(collectionName).IsChanged) { result = Classes.UI.MessageBox.Show("Текущие изменения не сохранены, закрыть?", App.Name, MessageBoxButton.YesNo, MessageBoxImage.Warning); break; } } } if (result == MessageBoxResult.No) { e.Cancel = true; } else { ImageTaskStop(); if (menuItem_ClearImageCache.IsChecked) { TaskProgressWindow taskProgressWindow = new TaskProgressWindow(TaskType.СlearImageCache); taskProgressWindow.ShowDialog(); } } }
private void Button_Apply_Click(object sender, RoutedEventArgs e) { string newCollectionName = textBox_collectionName.Text; if (newCollectionName.Equals(CollectionNamePlaceholder)) { Classes.UI.MessageBox.Show("Название коллекции не может быть пустым!", App.Name, MessageBoxButton.OK, MessageBoxImage.Warning); return; } Regex regex = new Regex(".*[\\<>:\"/|?*].*"); if (regex.IsMatch(newCollectionName)) { Classes.UI.MessageBox.Show("Название коллекции содержит запрещенные символы! (< > : \" \\ / | ? *)", App.Name, MessageBoxButton.OK, MessageBoxImage.Warning); return; } if (!collectionName.Equals(newCollectionName)) { if (CollectionStore.Contains(newCollectionName)) { Classes.UI.MessageBox.Show("Коллекция с таким названием уже существует!", App.Name, MessageBoxButton.OK, MessageBoxImage.Warning); return; } changedCollectionName = true; } if (!textBox_collectionDescription.Text.Equals(collectionDescription)) { changedCollectionDescription = true; if (textBox_collectionDescription.Text.Equals(CollectionDescriptionPlaceholder)) { textBox_collectionDescription.Text = string.Empty; } } Close(); }
/// <summary> /// Открытие папки как коллекция /// </summary> /// <param name="baseDirectory">Базовая директория</param> /// <param name="search">Тип поиска</param> /// <param name="searchMask">Маска поиска</param> /// <param name="distributionDirectory">Директория для первого распределения</param> private void OpenFolderTaskAction(string baseDirectory, SearchOption search, string searchMask, string distributionDirectory) { try { Dispatcher.Invoke(() => { inProgress = true; progressBar_Progress.IsIndeterminate = true; logParagraph.Inlines.Add("Подготовка хранилища...\r\n"); }); CollectionStore.Reset(baseDirectory); CollectionStore.Settings.DistributionDirectory = distributionDirectory; Dispatcher.Invoke(() => logParagraph.Inlines.Add("Создание базовой коллекции...\r\n")); Collection collection = new Collection(CollectionStore.BaseCollectionId); Dispatcher.Invoke(() => logParagraph.Inlines.Add("Получение списка файлов...\r\n")); IEnumerable <FileInfo> files = new DirectoryInfo(baseDirectory) .EnumerateFiles(searchMask, search) .Where(f => f.Extension.Equals(".bmp") || f.Extension.Equals(".jpg") || f.Extension.Equals(".jpeg") || f.Extension.Equals(".png")); int deleteCount = baseDirectory.Length + 1; Dispatcher.Invoke(() => logParagraph.Inlines.Add("Обработка списка файлов...\r\n")); foreach (FileInfo fileInfo in files) { if (fileInfo.DirectoryName.Equals(baseDirectory)) { collection.AddIgnorRules(fileInfo.Name, true, null); } else { collection.AddIgnorRules(fileInfo.FullName.Remove(0, deleteCount), false, null); } } collection.IsChanged = true; Dispatcher.Invoke(() => logParagraph.Inlines.Add("Добавление коллекции в хранилище...\r\n")); CollectionStore.AddIgnorRules(CollectionStore.BaseCollectionName, collection); Dispatcher.Invoke(() => { inProgress = false; Close(); }); } catch (Exception ex) { Dispatcher.Invoke((Action <string>)((valueError) => { inProgress = false; Run run = new Run(valueError) { Foreground = Brushes.Red, }; logParagraph.Inlines.Add(run); }), ex.Message); } }
private void MenuItem_CreateCollection_Click(object sender, RoutedEventArgs e) { CollectionInformationEditorWindow collectionInformationEditor = new CollectionInformationEditorWindow(); collectionInformationEditor.ShowDialog(); CollectionInformation collectionInformation = collectionInformationEditor.GetCollectionInformation(); if (collectionInformation.ChangedName) { CollectionStore.Add(collectionInformation); comboBox_CollectionNames.Items.Refresh(); } }
private void CreateItemList(string collectionName) { // preparation stopImageTask = false; string previewFolder = Path.Combine(CollectionStore.Settings.BaseDirectory, CollectionStore.DataDirectoryName, CollectionStore.PreviewDirectoryName); if (!Directory.Exists(previewFolder)) { Directory.CreateDirectory(previewFolder); } MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); // processing Collection collection = CollectionStore.Get(collectionName); foreach (KeyValuePair <string, CollectionItemMeta> collectionItem in collection.ActualItems) { if (stopImageTask) { break; } ListBoxImageItem listBoxImageItem = new ListBoxImageItem(collectionItem.Key, collectionItem.Value); GeneratePreviewAndDescription(previewFolder, collectionItem.Key, md5, listBoxImageItem); if (stopImageTask) { break; } //Dispatcher.Invoke(() => //{ // string previewFile = Path.Combine(previewFolder, $"{listBoxImageItem.Hash}.jpg"); // MemoryStream memoryStream = new MemoryStream(File.ReadAllBytes(previewFile)); // BitmapImage preview = new BitmapImage(); // preview.BeginInit(); // preview.StreamSource = memoryStream; // preview.EndInit(); // listBoxImageItem.Preview = preview; // collectionItems.Add(listBoxImageItem); //}); Dispatcher.Invoke(new Func <int>(() => { string previewFile = Path.Combine(previewFolder, $"{listBoxImageItem.Hash}.jpg"); MemoryStream memoryStream = new MemoryStream(File.ReadAllBytes(previewFile)); BitmapImage preview = new BitmapImage(); preview.BeginInit(); preview.StreamSource = memoryStream; preview.EndInit(); listBoxImageItem.Preview = preview; collectionItems.Add(listBoxImageItem); return(1); }), TimeSpan.FromMilliseconds(500)); } }
public CollectContinueModel OnContinue(string desc, string url) { var model = CollectionStore.GetFirstUrl(url); if (model != null && model.IsValid()) { return(new CollectContinueModel() { ContinueUrl = model.Url, ContinueLevel = model.Level }); } return(null); }
public void OnFailed(string processUrl, int processLevel, Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"{processLevel}, {processUrl}, {CollectTools.GetExceptionMessages(ex)}"); Console.ResetColor(); //delete url from 0 //move url to 1 CollectionStore.MoveUrl(rootUrl, new CollectionStore.UrlModel() { Url = processUrl, Level = processLevel, localFileName = null }); }
private void MenuItem_EditCollectionDetails_Click(object sender, RoutedEventArgs e) { if (comboBox_CollectionNames.SelectedItem != null) { string currentCollectionName = (string)comboBox_CollectionNames.SelectedItem; Collection collection = CollectionStore.Get(currentCollectionName); CollectionInformationEditorWindow collectionInformationEditor = new CollectionInformationEditorWindow(currentCollectionName, collection.Description); collectionInformationEditor.ShowDialog(); CollectionInformation collectionInformation = collectionInformationEditor.GetCollectionInformation(); CollectionStore.Edit(currentCollectionName, collectionInformation); if (collectionInformation.ChangedName) { comboBox_CollectionNames.Items.Refresh(); comboBox_CollectionNames.SelectedItem = collectionInformation.Name; } } }
private void ToCollection(string from, string to) { IEnumerable <ListBoxImageItem> enSelectedItems = listBox_CollectionItems.SelectedItems.Cast <ListBoxImageItem>(); int firstCollectionItemSelectedIndex = enSelectedItems.Min(x => collectionItems.IndexOf(x)); List <ListBoxImageItem> selectedItems = new List <ListBoxImageItem>(enSelectedItems); ItemMover itemMover = CollectionStore.InitializeItemMover(from, to); foreach (ListBoxImageItem item in selectedItems) { collectionItems.Remove(item); itemMover.Move(item.Path); } itemMover.EndMoving(); listBox_CollectionItems.SelectedIndex = Math.Min(firstCollectionItemSelectedIndex, listBox_CollectionItems.Items.Count - 1); }
private void MenuItem_RemoveCollection_Click(object sender, RoutedEventArgs e) { if (comboBox_CollectionNames.SelectedItem != null) { string currentCollectionName = (string)comboBox_CollectionNames.SelectedItem; if (currentCollectionName.Equals(CollectionStore.BaseCollectionName)) { Classes.UI.MessageBox.Show("Коллекцию по умолчанию запрещено удалять!", App.Name, MessageBoxButton.OK, MessageBoxImage.Information); } else { if (Classes.UI.MessageBox.Show($"Удалить коллекцию \"{currentCollectionName}\"?", App.Name, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { CollectionStore.Remove(currentCollectionName); comboBox_CollectionNames.Items.Refresh(); comboBox_CollectionNames.SelectedItem = CollectionStore.BaseCollectionName; } } } }
[Test] public void StoreRetrieveLapTimes() { var lapTimeDic = new Dictionary <int, ParticipantLapTime> { { 0, new ParticipantLapTime(1, 2, 3, 4) }, { 1, new ParticipantLapTime(0.123, 0.456, 0.789, 1) } }; var lapTimes = new ParticipantLapTimes(Key.Create(), Key.Create(), SessionType.Practice, 0, lapTimeDic); var db = new LiteDatabase("test.db"); var store = new CollectionStore <ParticipantLapTimes>(db); store.DeleteAll(); store.Store(lapTimes); var result = store.LoadAll().First(); Assert.AreEqual(result.Id, lapTimes.Id); Assert.AreEqual(result.participantIndex, lapTimes.participantIndex); CollectionAssert.AreEqual(result.lapTimes.ToArray(), lapTimes.lapTimes.ToArray()); }
/// <summary> /// Переименовывание файлов входящих в коллекцию /// </summary> /// <param name="collectionName">Название коллекции</param> /// <param name="mask">Маска имени файла</param> public void RenameAllItemsInCollectionTaskAction(string collectionName, string mask) { try { Dispatcher.Invoke(() => { inProgress = true; progressBar_Progress.IsIndeterminate = true; logParagraph.Inlines.Add("Подготовка...\r\n"); }); Dictionary <string, int> number = new Dictionary <string, int>() { { ".bmp", 0 }, { ".jpg", 0 }, { ".jpeg", 0 }, { ".png", 0 } }; MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); Collection collection = CollectionStore.Get(collectionName); List <string> actualItemsTemp = new List <string>(collection.ActualItemsKeys); string baseDirectory = CollectionStore.Settings.BaseDirectory; string previewDirectory = Path.Combine(baseDirectory, CollectionStore.DataDirectoryName, CollectionStore.PreviewDirectoryName); Dispatcher.Invoke((Action <string>)((string _collectionName) => logParagraph.Inlines.Add($"Обработка элементов коллекции \"{_collectionName}\"...\r\n")), collectionName); while (actualItemsTemp.Count != 0) { string item = actualItemsTemp[0]; string extension = Path.GetExtension(item); string newName = string.Format($"{mask}{extension}", number[extension]); number[extension]++; string dirName = Path.GetDirectoryName(item); newName = (string.IsNullOrEmpty(dirName) ? "" : $"{dirName}\\") + newName; if (actualItemsTemp.Contains(newName)) { actualItemsTemp.Remove(newName); } else { string fromPath = $"{baseDirectory}\\{item}"; string toPath = $"{baseDirectory}\\{newName}"; Dispatcher.Invoke((Action <string>)((string _item) => logParagraph.Inlines.Add($"Переименование: \"{_item}\"...\r\n")), item); File.Move(fromPath, toPath); collection.Rename(item, newName); actualItemsTemp.RemoveAt(0); CollectionItemMeta itemMeta = collection[newName]; if (!string.IsNullOrEmpty(itemMeta.Hash)) { Dispatcher.Invoke(() => logParagraph.Inlines.Add("Установка параметров элемента...\r\n")); byte[] newHashB = md5.ComputeHash(Encoding.UTF8.GetBytes(newName)); StringBuilder newHashSB = new StringBuilder(newHashB.Length * 2); for (int i = 0; i < newHashB.Length; i++) { newHashSB.Append(newHashB[i].ToString("X2")); } string newHash = newHashSB.ToString(); string oldPreview = Path.Combine(previewDirectory, $"{itemMeta.Hash}.jpg"); string newPreview = Path.Combine(previewDirectory, $"{newHash}.jpg"); /*if (File.Exists(newPreview)) * { * File.Delete(newPreview); * }*/ File.Move(oldPreview, newPreview); itemMeta.Hash = newHash; } } } foreach (KeyValuePair <string, int> numberItem in number) { if (numberItem.Value > 0) { collection.IsChanged = true; break; } } Dispatcher.Invoke(() => { inProgress = false; Close(); }); } catch (Exception ex) { Dispatcher.Invoke((Action <string>)((valueError) => { inProgress = false; Run run = new Run(valueError) { Foreground = Brushes.Red, }; logParagraph.Inlines.Add(run); }), ex.Message); } }
/// <summary> /// Объединение коллекций /// </summary> /// <param name="mergeCollectionPath">Путь к коллекциям для объединения с текущими</param> public void MergeCollectionsTaskAction(string mergeCollectionPath) { try { Dispatcher.Invoke(() => { inProgress = true; progressBar_Progress.IsIndeterminate = true; logParagraph.Inlines.Add("Подготовка...\r\n"); }); string metaDirectory = Path.Combine(mergeCollectionPath, CollectionStore.DataDirectoryName); int deleteItemPath = CollectionStore.Settings.BaseDirectory.Length + 1; Collection baseCollection = CollectionStore.Get(CollectionStore.BaseCollectionName); Dispatcher.Invoke(() => logParagraph.Inlines.Add("Поиск метаданных коллекций...\r\n")); IEnumerable <string> icdFiles = new DirectoryInfo(metaDirectory) .EnumerateFiles() .Where(x => x.Extension.Equals(".icd")) .Select(x => x.Name); foreach (string icdFileName in icdFiles) { string icdFilePath = Path.Combine(metaDirectory, icdFileName); Dispatcher.Invoke((Action <string>)((string _icdFilePath) => logParagraph.Inlines.Add($"Обработка: \"{_icdFilePath}\"\r\n")), icdFilePath); Collection collection = null; string collectionName = null; Guid? parentId; using (FileStream icdFile = new FileStream(icdFilePath, FileMode.Open, FileAccess.Read)) { using (BinaryReader icdReader = new BinaryReader(icdFile, Encoding.UTF8)) { Dispatcher.Invoke(() => logParagraph.Inlines.Add("Чтение базовых сведений...\r\n")); Guid id = new Guid(icdReader.ReadBytes(16)); collection = new Collection(id); collectionName = icdReader.ReadString(); if (icdReader.ReadBoolean()) { collection.Description = icdReader.ReadString(); } bool ofnContains = icdReader.ReadBoolean(); if (ofnContains || id == CollectionStore.BaseCollectionId) { if (ofnContains) { collection.OriginalFolderName = icdReader.ReadString(); } // get files from folder and add coll string collectionFolder = mergeCollectionPath; if (id != CollectionStore.BaseCollectionId) { collectionFolder = Path.Combine(mergeCollectionPath, collection.OriginalFolderName); } Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Получение файлов коллекции...\r\n")); IEnumerable <string> files = new DirectoryInfo(collectionFolder) .EnumerateFiles() .Where(x => x.Extension.Equals(".bmp") || x.Extension.Equals(".jpg") || x.Extension.Equals(".jpeg") || x.Extension.Equals(".png")) .Select(x => x.FullName); Dispatcher.Invoke(() => logParagraph.Inlines.Add("Добавление файлов...\r\n")); foreach (string filePath in files) { collection.AddIgnorRules(filePath.Remove(0, mergeCollectionPath.Length + 1), true, null); } } // read icd processing Dispatcher.Invoke(() => logParagraph.Inlines.Add("Обработка актуальных и исключенных элементов...\r\n")); while (icdFile.Length != icdFile.Position) { // add if (icdReader.ReadBoolean()) { parentId = null; // contains guid if (icdReader.ReadBoolean()) { parentId = new Guid(icdReader.ReadBytes(16)); } string item = icdReader.ReadString(); collection.AddIgnorRules(item, false, parentId); } // remove else { string item = icdReader.ReadString(); collection.Remove(item); } } } } // merge Dispatcher.Invoke((Action <string>)((string _mergeCollection) => logParagraph.Inlines.Add($"Слияние коллекции \"{_mergeCollection}\"...")), collectionName); if (!CollectionStore.Contains(collectionName)) { CollectionStore.Add(new Structures.CollectionInformation(collectionName, false, null, false)); } Collection currentCollection = CollectionStore.Get(collectionName); currentCollection.IsChanged = true; string toCollectionPath = CollectionStore.Settings.BaseDirectory; bool hasDirectory = false; parentId = CollectionStore.BaseCollectionId; if (!string.IsNullOrEmpty(currentCollection.OriginalFolderName) || currentCollection.Id.Equals(CollectionStore.BaseCollectionId)) { if (!string.IsNullOrEmpty(currentCollection.OriginalFolderName) && !currentCollection.Id.Equals(CollectionStore.BaseCollectionId)) { toCollectionPath = Path.Combine(CollectionStore.Settings.BaseDirectory, currentCollection.OriginalFolderName); } hasDirectory = true; parentId = null; } foreach (KeyValuePair <string, CollectionItemMeta> item in collection.ActualItems) { string fromFilePath = Path.Combine(mergeCollectionPath, item.Key); Dispatcher.Invoke((Action <string>)((string _mergeItem) => logParagraph.Inlines.Add($"Обработка: \"{_mergeItem}\"")), fromFilePath); string fileName = Path.GetFileName(fromFilePath); string toFilePath = Path.Combine(toCollectionPath, fileName); int counter = 0; while (File.Exists(toFilePath)) { toFilePath = Path.Combine(toCollectionPath, $"{counter}{fileName}"); counter++; } File.Move(fromFilePath, toFilePath); fileName = toFilePath.Remove(0, deleteItemPath); currentCollection.AddIgnorRules(fileName, hasDirectory, parentId); if (hasDirectory == false) { baseCollection.AddIrrelevantItem(fileName); } } } baseCollection.IsChanged = true; Dispatcher.Invoke(() => logParagraph.Inlines.Add("Сохранение изменений...\r\n")); BaseSaveCollectionsTaskAction(); Dispatcher.Invoke(() => { inProgress = false; Close(); }); } catch (Exception ex) { Dispatcher.Invoke((Action <string>)((valueError) => { inProgress = false; Run run = new Run(valueError) { Foreground = Brushes.Red, }; logParagraph.Inlines.Add(run); }), ex.Message); } }
/// <summary> /// Распределяет файлы по папкам /// </summary> private void StdDistributionTaskAction() { try { Dispatcher.Invoke(() => { inProgress = true; progressBar_Progress.IsIndeterminate = true; }); List <string[]> collectionRename = new List <string[]>(); string baseDirectory = CollectionStore.Settings.BaseDirectory; MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); string previewDirectory = Path.Combine(baseDirectory, CollectionStore.DataDirectoryName, CollectionStore.PreviewDirectoryName); foreach (string collectionName in CollectionStore.ActualCollections) { Dispatcher.Invoke((Action <string>)((string _collection) => logParagraph.Inlines.Add($"Обработка коллекции: \"{_collection}\"\r\n")), collectionName); Collection collection = CollectionStore.Get(collectionName); // add data to rename list if (!string.IsNullOrEmpty(collection.OriginalFolderName) && !collectionName.Equals(collection.OriginalFolderName)) { collectionRename.Add(new string[] { collectionName, collection.OriginalFolderName }); } // remove from delete list if (CollectionStore.ContainsIrrelevantDistribution(collectionName)) { CollectionStore.RemoveIrrelevantDistribution(collectionName); } // distribution process string prefixPath = string.Empty; string prefixItem = string.Empty; if (collection.Id != CollectionStore.BaseCollectionId) { prefixPath = collectionName; if (!string.IsNullOrEmpty(collection.OriginalFolderName)) { prefixPath = collection.OriginalFolderName; } prefixItem = collectionName; } string toPath = Path.Combine(baseDirectory, prefixPath); Directory.CreateDirectory(toPath); List <string> actualItemsTemp = new List <string>(collection.ActualItemsKeys); foreach (string item in actualItemsTemp) { CollectionItemMeta meta = collection[item]; if (meta.InCurrentFolder) { continue; } string fromFilePath = Path.Combine(baseDirectory, item); Dispatcher.Invoke((Action <string>)((string _fromFilePath) => logParagraph.Inlines.Add($"Подготовка и копирование: \"{_fromFilePath}\"\r\n")), fromFilePath); string fromFileName = Path.GetFileNameWithoutExtension(item); string fromFileExtension = Path.GetExtension(item); string toFileName = fromFileName + fromFileExtension; string toFilePath = Path.Combine(toPath, toFileName); int fileNamePrefix = 0; while (File.Exists(toFilePath)) { toFileName = fromFileName + fileNamePrefix.ToString() + fromFileExtension; toFilePath = Path.Combine(toPath, toFileName); fileNamePrefix++; } File.Move(fromFilePath, toFilePath); string newItem = Path.Combine(prefixItem, toFileName); collection.RemoveIgnorRules(item); collection.AddIgnorRules(newItem, true, null, meta); collection.IsChanged = true; if (!string.IsNullOrEmpty(meta.Hash)) { Dispatcher.Invoke(() => logParagraph.Inlines.Add("Установка параметров элемента...\r\n")); byte[] newHashB = md5.ComputeHash(Encoding.UTF8.GetBytes(newItem)); StringBuilder newHashSB = new StringBuilder(newHashB.Length * 2); for (int i = 0; i < newHashB.Length; i++) { newHashSB.Append(newHashB[i].ToString("X2")); } string newHash = newHashSB.ToString(); string oldPreview = Path.Combine(previewDirectory, $"{meta.Hash}.jpg"); string newPreview = Path.Combine(previewDirectory, $"{newHash}.jpg"); /*if (File.Exists(newPreview)) * { * File.Delete(newPreview); * }*/ File.Move(oldPreview, newPreview); meta.Hash = newHash; } } collection.OriginalFolderName = collectionName; bool isClear = collection.ClearIrrelevantItems(); collection.IsChanged = collection.IsChanged || isClear; // write collection description if (!string.IsNullOrEmpty(collection.Description)) { Dispatcher.Invoke(() => logParagraph.Inlines.Add("Сохранение описания коллекции...\r\n")); string descriptionFile = Path.Combine(toPath, "description.txt"); using (StreamWriter descriptionWriter = new StreamWriter(descriptionFile, false, Encoding.UTF8)) { descriptionWriter.Write(collection.Description); } } } // rename folders Dispatcher.Invoke(() => logParagraph.Inlines.Add("Подготовка к переименованию папок коллекций...\r\n")); foreach (string[] item in collectionRename) { string originalNameFrom = Path.Combine(baseDirectory, item[1]); string originalNameTo = Path.Combine(baseDirectory, $"temp-{item[1]}"); Directory.Move(originalNameFrom, originalNameTo); } foreach (string[] item in collectionRename) { string originalNameFrom = Path.Combine(baseDirectory, $"temp-{item[1]}"); string originalNameTo = Path.Combine(baseDirectory, item[0]); Dispatcher.Invoke((Action <string, string>)((string _fromName, string _toName) => logParagraph.Inlines.Add($"Переименование \"{_fromName}\" в \"{_toName}\"")), item[1], item[0]); Directory.Move(originalNameFrom, originalNameTo); Collection collection = CollectionStore.Get(item[0]); collection.IsChanged = true; } // deleted irrelevant folder Dispatcher.Invoke(() => logParagraph.Inlines.Add("Удаление пустых папок коллекций...\r\n")); foreach (string removeCollection in CollectionStore.IrrelevantDistributionCollections) { string removeCollectionDirPath = Path.Combine(baseDirectory, removeCollection); DirectoryInfo removeCollectionDir = new DirectoryInfo(removeCollectionDirPath); if (removeCollectionDir.Exists) { FileInfo[] allFiles = removeCollectionDir.GetFiles("*", SearchOption.AllDirectories); int count = allFiles.Length; if (count > 1) { continue; } else if (count == 1) { string loverName = allFiles[0].Name.ToLower(); if (!loverName.Equals("description.txt")) { continue; } } removeCollectionDir.Delete(true); } } CollectionStore.ClearIrrelevantDistribution(); BaseSaveCollectionsTaskAction(); Dispatcher.Invoke(() => { inProgress = false; Close(); }); } catch (Exception ex) { Dispatcher.Invoke((Action <string>)((valueError) => { inProgress = false; Run run = new Run(valueError) { Foreground = Brushes.Red, }; logParagraph.Inlines.Add(run); }), ex.Message); } }
/// <summary> /// Распределяет файлы по папкам (используя новое место для хранения) /// </summary> private void DistributionTaskAction() { try { Dispatcher.Invoke(() => { inProgress = true; progressBar_Progress.IsIndeterminate = true; }); string distributionDirectory = CollectionStore.Settings.DistributionDirectory; string baseDirectory = CollectionStore.Settings.BaseDirectory; string dataDirectory = Path.Combine(baseDirectory, CollectionStore.DataDirectoryName); foreach (string collectionName in CollectionStore.ActualCollections) { Dispatcher.Invoke((Action <string>)((string _collection) => logParagraph.Inlines.Add($"Обработка коллекции: \"{_collection}\"\r\n")), collectionName); Collection collection = CollectionStore.Get(collectionName); string prefixPath = string.Empty; if (collection.Id != CollectionStore.BaseCollectionId) { prefixPath = collectionName; } string toPath = Path.Combine(distributionDirectory, prefixPath); Directory.CreateDirectory(toPath); List <string> actualItemsTemp = new List <string>(collection.ActualItemsKeys); foreach (string item in actualItemsTemp) { string fromFilePath = Path.Combine(baseDirectory, item); Dispatcher.Invoke((Action <string>)((string _fromFilePath) => logParagraph.Inlines.Add($"Подготовка и копирование: \"{_fromFilePath}\"\r\n")), fromFilePath); string fromFileName = Path.GetFileNameWithoutExtension(item); string fromFileExtension = Path.GetExtension(item); string toFileName = fromFileName + fromFileExtension; string toFilePath = Path.Combine(toPath, toFileName); int fileNamePrefix = 0; while (File.Exists(toFilePath)) { toFileName = fromFileName + fileNamePrefix.ToString() + fromFileExtension; toFilePath = Path.Combine(toPath, toFileName); fileNamePrefix++; } File.Copy(fromFilePath, toFilePath, true); collection.RemoveIgnorRules(item); collection.AddIgnorRules(Path.Combine(prefixPath, toFileName), true, null); } collection.ClearIrrelevantItems(); collection.OriginalFolderName = collectionName; collection.IsChanged = true; // write collection description if (!string.IsNullOrEmpty(collection.Description)) { Dispatcher.Invoke(() => logParagraph.Inlines.Add("Сохранение описания коллекции...\r\n")); string descriptionFile = Path.Combine(toPath, "description.txt"); using (StreamWriter descriptionWriter = new StreamWriter(descriptionFile, false, Encoding.UTF8)) { descriptionWriter.Write(collection.Description); } } } Dispatcher.Invoke(() => logParagraph.Inlines.Add("Установка параметров...\r\n")); CollectionStore.ClearIrrelevantDistribution(); CollectionStore.ClearIrrelevantSaved(); CollectionStore.Settings.SetDistributionDirectoryAsBase(); Dispatcher.Invoke(() => logParagraph.Inlines.Add("Удаление директории данных программы...\r\n")); if (Directory.Exists(dataDirectory)) { Directory.Delete(dataDirectory, true); } Dispatcher.Invoke(() => logParagraph.Inlines.Add("Сохранение параметров...\r\n")); string newDataDirectory = Path.Combine(distributionDirectory, CollectionStore.DataDirectoryName); Directory.CreateDirectory(newDataDirectory); CollectionStore.Settings.Save(); BaseSaveCollectionsTaskAction(); Dispatcher.Invoke(() => { inProgress = false; Close(); }); } catch (Exception ex) { Dispatcher.Invoke((Action <string>)((valueError) => { inProgress = false; Run run = new Run(valueError) { Foreground = Brushes.Red, }; logParagraph.Inlines.Add(run); }), ex.Message); } }
private void MenuItem_RemoveSelectedFiles_Click(object sender, RoutedEventArgs e) { if (listBox_CollectionItems.SelectedItems.Count > 1) { if (Classes.UI.MessageBox.Show("Вы действительно хотите удалить выбранные файлы?", App.Name, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { string currentCollectionName = (string)comboBox_CollectionNames.SelectedItem; Collection collection = CollectionStore.Get(currentCollectionName); IEnumerable <ListBoxImageItem> enSelectedItems = listBox_CollectionItems.SelectedItems.Cast <ListBoxImageItem>(); int firstCollectionItemSelectedIndex = enSelectedItems.Min(x => collectionItems.IndexOf(x)); List <ListBoxImageItem> selectedItems = new List <ListBoxImageItem>(enSelectedItems); foreach (ListBoxImageItem item in selectedItems) { File.Delete(Path.Combine(CollectionStore.Settings.BaseDirectory, item.Path)); collection.RemoveIgnorRules(item.Path); collection.IsChanged = true; collectionItems.Remove(item); } listBox_CollectionItems.SelectedIndex = Math.Min(firstCollectionItemSelectedIndex, collectionItems.Count - 1); Task.Run(() => { string previewFolder = Path.Combine(CollectionStore.Settings.BaseDirectory, CollectionStore.DataDirectoryName, CollectionStore.PreviewDirectoryName); foreach (ListBoxImageItem item in selectedItems) { if (!string.IsNullOrEmpty(item.Hash)) { string deletePreviewFile = Path.Combine(previewFolder, $"{item.Hash}.jpg"); if (File.Exists(deletePreviewFile)) { try { File.Delete(deletePreviewFile); } catch { } } } } }); } } else { string currentCollectionName = (string)comboBox_CollectionNames.SelectedItem; ListBoxImageItem currentCollectionItem = (ListBoxImageItem)listBox_CollectionItems.SelectedItem; int currentCollectionItemIndex = listBox_CollectionItems.SelectedIndex; string deleteFile = Path.Combine(CollectionStore.Settings.BaseDirectory, currentCollectionItem.Path); if (Classes.UI.MessageBox.Show($"Удалить \"{deleteFile}\"?", App.Name, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { Collection collection = CollectionStore.Get(currentCollectionName); File.Delete(deleteFile); collection.RemoveIgnorRules(currentCollectionItem.Path); collection.IsChanged = true; collectionItems.RemoveAt(currentCollectionItemIndex); listBox_CollectionItems.SelectedIndex = Math.Min(currentCollectionItemIndex, collectionItems.Count - 1); try { if (!string.IsNullOrEmpty(currentCollectionItem.Hash)) { string deletePreviewFile = Path.Combine(CollectionStore.Settings.BaseDirectory, CollectionStore.DataDirectoryName, CollectionStore.PreviewDirectoryName, $"{currentCollectionItem.Hash}.jpg"); if (File.Exists(deletePreviewFile)) { File.Delete(deletePreviewFile); } } } catch { } } } }
/// <summary> /// Чтение сохраненных коллекций /// </summary> /// <param name="baseDirectory">Базовая директория</param> private void OpenCollectionsTaskAction(string baseDirectory) { try { Dispatcher.Invoke(() => { inProgress = true; progressBar_Progress.IsIndeterminate = true; logParagraph.Inlines.Add("Поиск метаданных коллекций...\r\n"); }); string metaDirectory = Path.Combine(baseDirectory, CollectionStore.DataDirectoryName); IEnumerable <string> icdFiles = new DirectoryInfo(metaDirectory) .EnumerateFiles() .Where(x => x.Extension.Equals(".icd")) .Select(x => x.Name); Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Подготовка хранилища...\r\n")); CollectionStore.Reset(baseDirectory, true); foreach (string icdFileName in icdFiles) { string icdFilePath = Path.Combine(metaDirectory, icdFileName); Dispatcher.Invoke((Action <string>)((string _icdFilePath) => logParagraph.Inlines.Add($"Обработка: \"{_icdFilePath}\"\r\n")), icdFilePath); Collection collection = null; using (FileStream icdFile = new FileStream(icdFilePath, FileMode.Open, FileAccess.Read)) { using (BinaryReader icdReader = new BinaryReader(icdFile, Encoding.UTF8)) { Dispatcher.Invoke(() => logParagraph.Inlines.Add("Чтение базовых сведений...\r\n")); Guid id = new Guid(icdReader.ReadBytes(16)); collection = new Collection(id); string collectionName = icdReader.ReadString(); if (icdReader.ReadBoolean()) { collection.Description = icdReader.ReadString(); } bool ofnContains = icdReader.ReadBoolean(); if (ofnContains || id == CollectionStore.BaseCollectionId) { if (ofnContains) { collection.OriginalFolderName = icdReader.ReadString(); } // get files from folder and add coll string collectionFolder = baseDirectory; if (id != CollectionStore.BaseCollectionId) { collectionFolder = Path.Combine(baseDirectory, collection.OriginalFolderName); } Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Получение файлов коллекции...\r\n")); IEnumerable <string> files = new DirectoryInfo(collectionFolder) .EnumerateFiles() .Where(x => x.Extension.Equals(".bmp") || x.Extension.Equals(".jpg") || x.Extension.Equals(".jpeg") || x.Extension.Equals(".png")) .Select(x => x.FullName); Dispatcher.Invoke(() => logParagraph.Inlines.Add("Добавление файлов...\r\n")); foreach (string filePath in files) { collection.AddIgnorRules(filePath.Remove(0, baseDirectory.Length + 1), true, null); } } // read icd processing Dispatcher.Invoke(() => logParagraph.Inlines.Add("Обработка актуальных и исключенных элементов...\r\n")); while (icdFile.Length != icdFile.Position) { // add if (icdReader.ReadBoolean()) { Guid?parentId = null; // contains guid if (icdReader.ReadBoolean()) { parentId = new Guid(icdReader.ReadBytes(16)); } string item = icdReader.ReadString(); collection.AddIgnorRules(item, false, parentId); } // remove else { string item = icdReader.ReadString(); collection.Remove(item); } } Dispatcher.Invoke((Action <string>)((string _collectionName) => logParagraph.Inlines.Add($"Добавление коллекции \"{_collectionName}\" в хранилище...\r\n")), collectionName); CollectionStore.AddIgnorRules(collectionName, collection); } } } // read deleted collection Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Чтение удаленных коллекций...\r\n")); string dicdFilePath = Path.Combine(metaDirectory, $"irrelevant.icdd"); if (File.Exists(dicdFilePath)) { using (FileStream dicdFile = new FileStream(dicdFilePath, FileMode.Open, FileAccess.Read)) { using (BinaryReader dicdReader = new BinaryReader(dicdFile, Encoding.UTF8)) { while (dicdFile.Length != dicdFile.Position) { string deleteCollectionName = dicdReader.ReadString(); CollectionStore.AddIrrelevantDistribution(deleteCollectionName); } } } } ProgramSettings settings = ProgramSettings.GetInstance(); settings.LastOpenCollection = baseDirectory; settings.Save(); Dispatcher.Invoke(() => { inProgress = false; Close(); }); } catch (Exception ex) { Dispatcher.Invoke((Action <string>)((valueError) => { inProgress = false; Run run = new Run(valueError) { Foreground = Brushes.Red, }; logParagraph.Inlines.Add(run); }), ex.Message); } }
/// <summary> /// Сохранение коллекций [ОБОЛОЧКА] /// </summary> private void BaseSaveCollectionsTaskAction() { string metaDirectory = Path.Combine(CollectionStore.Settings.BaseDirectory, CollectionStore.DataDirectoryName); Dispatcher.Invoke(() => logParagraph.Inlines.Add("Обработка удаленных коллекций...\r\n")); if (!Directory.Exists(metaDirectory)) { Directory.CreateDirectory(metaDirectory); } else { Dispatcher.Invoke(() => logParagraph.Inlines.Add("Удаление ненужных метаданных...\r\n")); foreach (Guid deleteSavedCollection in CollectionStore.IrrelevantSavedCollections) { string icdPath = Path.Combine(metaDirectory, $"{deleteSavedCollection}.icd"); if (File.Exists(icdPath)) { Dispatcher.Invoke((Action <string>)((string _icdPath) => logParagraph.Inlines.Add($"Удаление метаданных: \"{_icdPath}\"\r\n")), icdPath); File.Delete(icdPath); } } CollectionStore.ClearIrrelevantSaved(); } string dicdFilePath = Path.Combine(metaDirectory, $"irrelevant.icdd"); Dispatcher.Invoke(() => logParagraph.Inlines.Add("Запись названий удаленных распределенных коллекций...\r\n")); using (FileStream dicdFile = new FileStream(dicdFilePath, FileMode.Create, FileAccess.Write)) { using (BinaryWriter dicdWriter = new BinaryWriter(dicdFile, Encoding.UTF8)) { foreach (string deleteCollection in CollectionStore.IrrelevantDistributionCollections) { dicdWriter.Write(deleteCollection); } } } Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Обработка актуальных коллекций...\r\n")); foreach (string collectionName in CollectionStore.ActualCollections) { Dispatcher.Invoke((Action <string>)((string _collection) => logParagraph.Inlines.Add($"Обработка коллекции: \"{_collection}\"\r\n")), collectionName); Collection collection = CollectionStore.Get(collectionName); if (collection.IsChanged) { string icdFilePath = Path.Combine(metaDirectory, $"{collection.Id}.icd"); using (FileStream icdFile = new FileStream(icdFilePath, FileMode.Create, FileAccess.Write)) { using (BinaryWriter icdWriter = new BinaryWriter(icdFile, Encoding.UTF8)) { Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Запись базовых сведений...\r\n")); icdWriter.Write(collection.Id.ToByteArray()); icdWriter.Write(collectionName); bool isValue = !string.IsNullOrEmpty(collection.Description); icdWriter.Write(isValue); if (isValue) { icdWriter.Write(collection.Description); } isValue = !string.IsNullOrEmpty(collection.OriginalFolderName); icdWriter.Write(isValue); if (isValue) { icdWriter.Write(collection.OriginalFolderName); } Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Запись актуальных элементов...\r\n")); foreach (KeyValuePair <string, CollectionItemMeta> item in collection.ActualItems) { if (item.Value.InCurrentFolder) { continue; } // add item flag icdWriter.Write(true); icdWriter.Write(item.Value.Parent.HasValue); if (item.Value.Parent.HasValue) { icdWriter.Write(item.Value.Parent.Value.ToByteArray()); } icdWriter.Write(item.Key); } Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Запись исключенных элементов...\r\n")); foreach (string deleteItem in collection.IrrelevantItems) { // delete item flag icdWriter.Write(false); icdWriter.Write(deleteItem); } collection.IsChanged = false; } } } } if (CollectionStore.Settings.IsChanged) { Dispatcher.Invoke(() => logParagraph.Inlines.Add($"Сохранение настроек...\r\n")); CollectionStore.Settings.Save(); } ProgramSettings settings = ProgramSettings.GetInstance(); if (!settings.LastOpenCollection.Equals(CollectionStore.Settings.BaseDirectory)) { settings.LastOpenCollection = CollectionStore.Settings.BaseDirectory; settings.Save(); } }