public bool Copy(GlobalPath sourcePath, GlobalPath destinationPath, bool verifyFreeSpace = true) { Volume sourceVolume = GetVolumeFromPath(sourcePath); Volume destinationVolume = GetVolumeFromPath(destinationPath); VolumeItem source = sourceVolume.Open(sourcePath); VolumeItem destination = destinationVolume.Open(destinationPath); if (source == null) { throw new KOSPersistenceException("Path does not exist: " + sourcePath); } if (source is VolumeDirectory) { if (destination is VolumeFile) { throw new KOSPersistenceException("Can't copy directory into a file"); } if (destination == null) { destination = destinationVolume.CreateDirectory(destinationPath); } else if (!sourcePath.IsRoot) { destinationPath = destinationPath.Combine(sourcePath.Name); destination = destinationVolume.OpenOrCreateDirectory(destinationPath); } if (destination == null) { throw new KOSException("Path was expected to point to a directory: " + destinationPath); } return(CopyDirectory(sourcePath, destinationPath, verifyFreeSpace)); } else { if (destination is VolumeFile || destination == null) { Volume targetVolume = GetVolumeFromPath(destinationPath); return(CopyFile(source as VolumeFile, destinationPath, targetVolume, verifyFreeSpace)); } else { return(CopyFileToDirectory(source as VolumeFile, destination as VolumeDirectory, verifyFreeSpace)); } } }