Esempio n. 1
0
        /// <summary>
        /// Перемещение заданного элемента
        /// </summary>
        /// <param name="item">Элемент</param>
        public virtual void Move(string item)
        {
            CollectionItemMeta meta = fromCollection[item];

            fromCollection.Remove(item);
            if (meta.InCurrentFolder)
            {
                toCollection.Add(item, false, fromCollection.Id, meta);
            }
            else
            {
                if (meta.Parent == null)
                {
                    toCollection.Add(item, false, null, meta);
                }
                else
                {
                    if (meta.Parent != toCollection.Id)
                    {
                        toCollection.Add(item, false, meta.Parent, meta);
                    }
                    else
                    {
                        toCollection.Add(item, true, null, meta);
                    }
                }
            }
        }
        /// <summary>
        /// Перемещение заданного элемента
        /// </summary>
        /// <param name="item">Элемент</param>
        public override void Move(string item)
        {
            CollectionItemMeta meta = fromCollection[item];

            if (!meta.InCurrentFolder && meta.Parent != null)
            {
                if (meta.Parent == toCollection.Id)
                {
                    toCollection.Add(item, true, null, meta);
                    return;
                }
            }
            toCollection.Add(item, false, null, meta);
        }
        /// <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>
        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);
            }
        }