/// <summary> /// Copies the directory. /// </summary> public void CopyDirectory([NotNull] string path, [NotNull] string newPath, [CanBeNull] IFileSystem destinationSystem = null) { Validate.ArgumentNotNull(path, "path"); Validate.ArgumentNotNull(newPath, "newPath"); var op = new VirtualFileOperations(this, destinationSystem ?? this); op.CopyDirectory(path, newPath); }
/// <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> /// Moves the directory. /// </summary> public void MoveDirectory([NotNull] string sourceDirectory, [NotNull] string destination, [CanBeNull] IFileSystem destinationSystem = null) { Validate.ArgumentNotNull(sourceDirectory, "sourceDirectory"); Validate.ArgumentNotNull(destination, "destination"); if (destinationSystem == null || destinationSystem == this) { Directory.Move(sourceDirectory, destination); } else { var op = new VirtualFileOperations(this, destinationSystem); op.MoveDirectory(sourceDirectory, destination); } }
/// <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); } }
/// <summary> /// Copies the directory to new destination. /// </summary> /// <param name="sourceDirectory">The source directory name. Must reference existing directory.</param> /// <param name="destination">The destination directory name. That is the name of directory which will be created.</param> /// <param name="destinationSystem">The destination system. Optional.</param> public void CopyDirectory([NotNull] string sourceDirectory, [NotNull] string destination, [CanBeNull] IFileSystem destinationSystem = null) { Validate.ArgumentNotNull(sourceDirectory, "sourceDirectory"); Validate.ArgumentNotNull(destination, "destination"); CheckDisposed(); // implemented as a set of simple operations. var operations = new VirtualFileOperations(this, destinationSystem ?? this); operations.CopyDirectory(sourceDirectory, destination); }
/// <summary> /// Moves or renames the file. /// </summary> /// <param name="sourceFileName">Name of the source file.</param> /// <param name="destFileName">New name and path of moved file.</param> /// <param name="destinationSystem">The destination system. Optional.</param> /// <exception cref="FileNotFoundException">Cannot find source file to move.</exception> /// <exception cref="DirectoryNotFoundException">Cannot find destination directory for move operation.</exception> /// <exception cref="IOException">Destination file already exists.</exception> public void MoveFile([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); var destVfn = new VirtualFileName(destFileName); NodeLocker srcResult; NodeLocker destResult; if (string.Equals(sourceVfn.Path, destVfn.Path, StringComparison.InvariantCultureIgnoreCase)) { // same folder, rename file. srcResult = destResult = FindNode(sourceVfn, true, true); } else if (sourceVfn.AllSegments.Count() > destVfn.AllSegments.Count()) { // lock longer path first srcResult = FindNode(sourceVfn, true, true); destResult = FindNode(destVfn, true, true); } else { destResult = FindNode(destVfn, true, true); srcResult = FindNode(sourceVfn, true, true); } using (srcResult) { var sourceDir = srcResult.Directory; if (sourceDir == null) { throw new FileNotFoundException("Cannot find source file to move.", sourceFileName); } using (destResult) { var destDir = destResult.Directory; if (destDir == null) { throw new DirectoryNotFoundException("Cannot find destination directory for move operation."); } if (destDir.FindChildEntry(destVfn.Name) != null) { throw new IOException("Destination file already exists."); } var sourceFile = sourceDir.FindChildEntry(sourceVfn.Name); if (sourceFile == null || sourceFile is DirectoryNode) { throw new FileNotFoundException("Cannot find source file to move.", sourceFileName); } using (NodeLocker.Lock(sourceFile, true)) { sourceDir.FindAndRemoveChildEntry(sourceVfn.Name, false); destDir.AddChildEntry(destVfn.Name, false, sourceFile.Address); } } } } else { var operations = new VirtualFileOperations(this, destinationSystem); operations.MoveFile(sourceFileName, destFileName); } }