public string DeleteTree(string currentDirectory, string directory) { currentDirectory = NormalizeCurrentDirectory(currentDirectory); if (!PathUtils.IsAbsolutePath(directory)) { directory = PathUtils.CombinePath(currentDirectory, directory); } string[] directoryParts = PathUtils.SplitPath(directory); IFileSystemItem currentItem = this.root; for (int i = 0; i < directoryParts.Length; i++) { currentItem = currentItem.ChildItems.FirstOrDefault(item => FileSystemItemNameComparer.Equals(item.Name, directoryParts[i])); if (currentItem is null) { throw new FileSystemConsoleException("Destination path is not exists."); } } if (currentItem.Kind != FileSystemItemKind.Directory) { throw new FileSystemConsoleException("Destination path is not a directory."); } if (currentItem.HasLocks()) { throw new FileSystemConsoleException("Directory or its subdirectories contain one or more locked files."); } currentItem.Parent.RemoveChildDirectoryWithTree(currentItem.Name); return(directory); }
private void CopyOrMoveInternal( string currentDirectory, string sourcePath, string destPath, Action <IFileSystemItem, IFileSystemItem> action) { currentDirectory = NormalizeCurrentDirectory(currentDirectory); if (!PathUtils.IsAbsolutePath(sourcePath)) { sourcePath = PathUtils.CombinePath(currentDirectory, sourcePath); } if (!PathUtils.IsAbsolutePath(destPath)) { destPath = PathUtils.CombinePath(currentDirectory, destPath); } string[] sourcePathParts = PathUtils.SplitPath(sourcePath); IFileSystemItem sourcePathCurrentItem = this.root; for (int i = 0; i < sourcePathParts.Length; i++) { sourcePathCurrentItem = sourcePathCurrentItem.ChildItems.FirstOrDefault(item => FileSystemItemNameComparer.Equals(item.Name, sourcePathParts[i])); if (sourcePathCurrentItem is null) { throw new FileSystemConsoleException("Source path is not exists."); } } if (sourcePathCurrentItem.Kind != FileSystemItemKind.Directory && sourcePathCurrentItem.Kind != FileSystemItemKind.File) { throw new FileSystemConsoleException(Invariant($"'{sourcePath}' is not a directory or a file.")); } if (sourcePathCurrentItem.Kind == FileSystemItemKind.File) { if (sourcePathCurrentItem.IsLocked) { throw new FileSystemConsoleException(Invariant($"File '{sourcePath}' is locked.")); } } string[] destPathParts = PathUtils.SplitPath(destPath); IFileSystemItem destPathCurrentItem = this.root; for (int i = 0; i < destPathParts.Length; i++) { destPathCurrentItem = destPathCurrentItem.ChildItems.FirstOrDefault(item => FileSystemItemNameComparer.Equals(item.Name, destPathParts[i])); if (destPathCurrentItem is null) { throw new FileSystemConsoleException("Destination path is not exists."); } } if (destPathCurrentItem.Kind != FileSystemItemKind.Volume && destPathCurrentItem.Kind != FileSystemItemKind.Directory) { throw new FileSystemConsoleException(Invariant($"'{destPath}' is not a volume or a directory.")); } if (sourcePathCurrentItem == destPathCurrentItem) { throw new FileSystemConsoleException("Source path and destination path must be not equal."); } if (sourcePathCurrentItem.Parent == destPathCurrentItem) { throw new FileSystemConsoleException("Source path cannot be copied or moved to its parent."); } if (sourcePathCurrentItem.Kind == FileSystemItemKind.Directory) { IFileSystemItem destPathCurrentItemParent = destPathCurrentItem.Parent; while (!(destPathCurrentItemParent is null)) { if (destPathCurrentItemParent == sourcePathCurrentItem) { throw new FileSystemConsoleException("Source directory cannot be a parent of the dest directory."); } destPathCurrentItemParent = destPathCurrentItemParent.Parent; } } if (sourcePathCurrentItem.HasLocks()) { throw new FileSystemConsoleException("Source path contain one or more locked files and cannot be copied or moved."); } action(sourcePathCurrentItem, destPathCurrentItem); }