private DirTreeViewItemModel SearchDirParent(Uri dirUri, IEnumerable <DirTreeViewItemModel> items, ref Boolean isSelf) { if (items == null || !items.Any()) { return(null); } DirTreeViewItemModel parent = null; foreach (var item in items) { if (!item.IsDir) { continue; } var dirOtherUri = CreateFolderUri(item.DistancePath); //- если это мы и есть if (dirOtherUri.Equals(dirUri)) { parent = item; isSelf = true; //- нашли сами себя - ставим флаг, что не надо добавляться break; } //- часть этого if (dirOtherUri.IsBaseOf(dirUri)) { parent = item; var innerParent = SearchDirParent(dirUri, item.Items, ref isSelf); if (innerParent != null) { parent = innerParent; } break; } } return(parent); }
public void AddFile(String fileFrom, String filePath, bool isNew, DirTreeViewItemModelStatus statusFile, String messageView) { if (statusFile != DirTreeViewItemModelStatus.Error) //? но теперь мы умеем копировать и с ошибками файлы - значит, неверный счетчик будет? подумать { if (isNew) { NewFilesFrom++; } else { ReplaceFilesFrom++; } } //+ dir var dirName = Path.GetDirectoryName(filePath); var dirItem = new DirTreeViewItemModel() { SourcePath = fileFrom, DistancePath = dirName, // важно, у директории тут путь к папке, а не файлу Title = dirName, IsDir = true, IsExcludeFromWork = false, Status = DirTreeViewItemModelStatus.Normal, // директории при подготовке всегда без ошибок (мы пока их не пытались создавать и не знаем их фактических ошибок) MessageView = String.Empty, IsNew = false // не нагружаем в этот момент - не проверяем наличие директории в дистанции }; //- в своего родителя bool isFoundSelf; var dirParent = SearchItemDirParent(dirName, out isFoundSelf); if (dirParent == null) { Items.Add(dirItem); } else { if (!isFoundSelf) { dirParent.Items.Add(dirItem); } else { dirItem = dirParent; } } //+ file var fileName = Path.GetFileName(filePath); var fileItem = new DirTreeViewItemModel() { SourcePath = fileFrom, DistancePath = filePath, Title = fileName, IsDir = false, IsExcludeFromWork = false, Status = statusFile, MessageView = messageView, IsNew = isNew }; dirItem.Items.Add(fileItem); }