Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
                }
            }
        }
Beispiel #3
0
        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);
     }
 }
Beispiel #5
0
        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();
            }
        }
Beispiel #6
0
        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));
            }
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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
            });
        }
Beispiel #9
0
 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;
         }
     }
 }
Beispiel #10
0
        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);
        }
Beispiel #11
0
 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);
     }
 }
Beispiel #17
0
        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();
            }
        }