/// <summary> /// Copies the file. /// </summary> public void CopyFile([NotNull] string sourceFileName, [NotNull] string destFileName, [CanBeNull] IFileSystem destinationSystem = null) { Validate.ArgumentNotNull(sourceFileName, "sourceFileName"); Validate.ArgumentNotNull(destFileName, "destFileName"); if (destinationSystem == null || destinationSystem == this) { File.Copy(sourceFileName, destFileName); } else { var operations = new VirtualFileOperations(this, destinationSystem); operations.CopyFile(sourceFileName, destFileName); } }
/// <summary> /// Copies the file. /// </summary> /// <param name="sourceFileName">Name of the source file.</param> /// <param name="destFileName">Name of the destination file.</param> /// <param name="destinationSystem">The destination system. Optional.</param> /// <exception cref="FileNotFoundException">Cannot find source file to copy.</exception> /// <exception cref="DirectoryNotFoundException">Specified destination path does not exist.</exception> public void CopyFile([NotNull] string sourceFileName, [NotNull] string destFileName, [CanBeNull] IFileSystem destinationSystem = null) { Validate.ArgumentNotNull(sourceFileName, "sourceFileName"); Validate.ArgumentNotNull(destFileName, "destFileName"); CheckDisposed(); // destination and source must be file names. directory names are not supported (same as native io). bool sameSystem = destinationSystem == null || destinationSystem == this; // move inside same volume if (sameSystem && sourceFileName == destFileName) { return; } if (sameSystem) { var sourceVfn = new VirtualFileName(sourceFileName); using (var srcResult = FindNode(sourceVfn, false)) // lock file for reading, we're copying { var sourceFile = srcResult.File; if (sourceFile == null) { throw new FileNotFoundException("Cannot find source file to copy.", sourceFileName); } var vfn = new VirtualFileName(destFileName); // lock destination dir for writing - new file will be created there. using (var destResult = FindNode(vfn, true, true)) { var parentDir = destResult.Directory; if (parentDir == null) { throw new DirectoryNotFoundException("Specified destination path does not exist."); } var destFile = _record.CreateFileNode(vfn.Name, parentDir); using (NodeLocker.Lock(destFile, true)) { CopyNodeData(sourceFile, destFile); } } } } else { var operations = new VirtualFileOperations(this, destinationSystem); operations.CopyFile(sourceFileName, destFileName); } }