/// <summary> /// Moves a virtual directopry to a new location, optioanlly renaming it in the process. /// </summary> /// <param name="sourceDirectory">The source directory to be moved.</param> /// <param name="targetDirectory">The destination directory.</param> /// <param name="newName">An optional new name. Supply <c>null</c> to use the original name of the source file.</param> public static void MoveDirectory(VirtualDirectory sourceDirectory, UnifiedDirectory targetDirectory, string newName) { if (String.IsNullOrEmpty(newName)) { newName = sourceDirectory.Name; } string targetVirtualDirectoryPath = VirtualPathUtility.Combine(targetDirectory.VirtualPath, newName); // TODO: Move this logic into UnifiedDirectoey it shouldn't be possible to orphan directories. if (!ValidatePathStructureForMove(sourceDirectory.VirtualPath, targetVirtualDirectoryPath)) { throw new ArgumentException("Moving a folder below itself is not allowed."); } UnifiedDirectory unifiedSourceDirectory = sourceDirectory as UnifiedDirectory; if (unifiedSourceDirectory != null) { if (unifiedSourceDirectory.Parent.VirtualPath != targetDirectory.VirtualPath) { VersioningDirectory versioningDirectory = sourceDirectory as VersioningDirectory; if (versioningDirectory != null) { ThrowIfCheckedOut(versioningDirectory); } } unifiedSourceDirectory.MoveTo(targetVirtualDirectoryPath); } // If source directory isn't a UnifiedDirectory we can't move it. }
/// <summary> /// Ensures that versioning directory can be updated. /// </summary> /// <param name="directory">The directory.</param> private static void ThrowIfCheckedOut(VersioningDirectory directory) { Validate.RequiredParameter("directory", directory); foreach (IVersioningFile file in directory.Files) { ThrowIfCheckedOut(file); } foreach (VersioningDirectory childDirectory in directory.Directories) { ThrowIfCheckedOut(childDirectory); } }