public CopyMoveResult MoveTo(string destinationPath, MoveOptions moveOptions, CopyMoveProgressRoutine progressHandler, object userProgressData, PathFormat pathFormat) { string destinationPathLp; CopyMoveResult cmr = CopyToMoveToCore(destinationPath, null, moveOptions, progressHandler, userProgressData, out destinationPathLp, pathFormat); CopyToMoveToCoreRefresh(destinationPath, destinationPathLp); return(cmr); }
public CopyMoveResult CopyTo(string destinationPath, CopyOptions copyOptions, CopyMoveProgressRoutine progressHandler, object userProgressData) { string destinationPathLp; CopyMoveResult cmr = CopyToMoveToCore(destinationPath, copyOptions, null, progressHandler, userProgressData, out destinationPathLp, PathFormat.RelativePath); CopyToMoveToCoreRefresh(destinationPath, destinationPathLp); return(cmr); }
public CopyMoveResult MoveTo(string destinationPath, MoveOptions moveOptions, CopyMoveProgressRoutine progressHandler, object userProgressData) { string destinationPathLp; CopyMoveResult cmr = CopyToMoveToInternal(destinationPath, null, moveOptions, progressHandler, userProgressData, out destinationPathLp, PathFormat.RelativePath); CopyToMoveToInternalRefresh(destinationPath, destinationPathLp); return(cmr); }
public CopyMoveResult CopyTo(string destinationPath, CopyOptions copyOptions, CopyMoveProgressRoutine progressHandler, object userProgressData, PathFormat pathFormat) { string destinationPathLp; CopyMoveResult cmr = CopyToMoveToInternal(destinationPath, copyOptions, null, progressHandler, userProgressData, out destinationPathLp, pathFormat); CopyToMoveToInternalRefresh(destinationPath, destinationPathLp); return(cmr); }
internal static CopyMoveResult CopyMoveInternal(KernelTransaction transaction, string sourcePath, string destinationPath, CopyOptions? copyOptions, MoveOptions? moveOptions, CopyMoveProgressRoutine progressHandler, object userProgressData, PathFormat pathFormat) { #region Setup if (pathFormat == PathFormat.RelativePath) { Path.CheckValidPath(sourcePath, true, true); Path.CheckValidPath(destinationPath, true, true); } else { // MSDN:. NET 3.5+: NotSupportedException: Path contains a colon character (:) that is not part of a drive label ("C:\"). Path.CheckValidPath(sourcePath, false, false); Path.CheckValidPath(destinationPath, false, false); } // MSDN: .NET 4+ Trailing spaces are removed from the end of the path parameters before moving the directory. // TrimEnd() is also applied for AlphaFS implementation of method Directory.Copy(), .NET does not have this method. var options = GetFullPathOptions.TrimEnd | GetFullPathOptions.RemoveTrailingDirectorySeparator; string sourcePathLp = Path.GetExtendedLengthPathInternal(transaction, sourcePath, pathFormat, options); string destinationPathLp = Path.GetExtendedLengthPathInternal(transaction, destinationPath, pathFormat, options); // MSDN: .NET3.5+: IOException: The sourceDirName and destDirName parameters refer to the same file or directory. if (sourcePathLp.Equals(destinationPathLp, StringComparison.OrdinalIgnoreCase)) NativeError.ThrowException(Win32Errors.ERROR_SAME_DRIVE, destinationPathLp); // Determine Copy or Move action. bool doCopy = copyOptions != null; bool doMove = !doCopy && moveOptions != null; if ((!doCopy && !doMove) || (doCopy && doMove)) throw new NotSupportedException(Resources.UndeterminedCopyMoveAction); bool overwrite = doCopy ? (((CopyOptions)copyOptions & CopyOptions.FailIfExists) != CopyOptions.FailIfExists) : (((MoveOptions)moveOptions & MoveOptions.ReplaceExisting) == MoveOptions.ReplaceExisting); var cmr = new CopyMoveResult(sourcePathLp, destinationPathLp, true, doMove, false, (int)Win32Errors.ERROR_SUCCESS); #endregion //Setup #region Copy if (doCopy) { CreateDirectoryInternal(transaction, destinationPathLp, null, null, false, PathFormat.LongFullPath); foreach (var fsei in EnumerateFileSystemEntryInfosInternal<FileSystemEntryInfo>(transaction, sourcePathLp, Path.WildcardStarMatchAll, DirectoryEnumerationOptions.FilesAndFolders, PathFormat.LongFullPath)) { string newDestinationPathLp = Path.CombineInternal(false, destinationPathLp, fsei.FileName); cmr = fsei.IsDirectory ? CopyMoveInternal(transaction, fsei.LongFullPath, newDestinationPathLp, copyOptions, null, progressHandler, userProgressData, PathFormat.LongFullPath) : File.CopyMoveInternal(false, transaction, fsei.LongFullPath, newDestinationPathLp, false, copyOptions, null, progressHandler, userProgressData, PathFormat.LongFullPath); if (cmr.IsCanceled) return cmr; } } #endregion // Copy #region Move else { // MSDN: .NET3.5+: IOException: An attempt was made to move a directory to a different volume. if (((MoveOptions)moveOptions & MoveOptions.CopyAllowed) != MoveOptions.CopyAllowed) if (!Path.GetPathRoot(sourcePathLp, false).Equals(Path.GetPathRoot(destinationPathLp, false), StringComparison.OrdinalIgnoreCase)) NativeError.ThrowException(Win32Errors.ERROR_NOT_SAME_DEVICE, destinationPathLp); // MoveOptions.ReplaceExisting: This value cannot be used if lpNewFileName or lpExistingFileName names a directory. if (overwrite && File.ExistsInternal(true, transaction, destinationPathLp, PathFormat.LongFullPath)) DeleteDirectoryInternal(null, transaction, destinationPathLp, true, true, false, true, PathFormat.LongFullPath); // Moves a file or directory, including its children. // Copies an existing directory, including its children to a new directory. cmr = File.CopyMoveInternal(true, transaction, sourcePathLp, destinationPathLp, false, null, moveOptions, progressHandler, userProgressData, PathFormat.LongFullPath); } #endregion // Move // The copy/move operation succeeded or was canceled. return cmr; }