/// <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); } }