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