/// <summary> /// Copies a file from one place to another, using the Shell file copying routines. /// </summary> /// <param name="windowHandle">Parent form's handle.</param> /// <param name="source">Source path.</param> /// <param name="destination">Destination path.</param> /// <param name="progressTitle">Title of progress bar.</param> /// <param name="aborted">Was the operation aborted?</param> public static void CopyFileOrDirectory(IntPtr windowHandle, string source, string destination, string progressTitle, ref bool aborted) { int retval = 0; var shf = new Win32API.Shell32.SHFILEOPSTRUCT(); shf.wFunc = Win32API.Shell32.FO_COPY; shf.fFlags = Win32API.Shell32.FOF_SIMPLEPROGRESS; shf.lpszProgressTitle = progressTitle; if (windowHandle != IntPtr.Zero) { shf.hwnd = windowHandle; } shf.pFrom = source + "\0"; shf.pTo = destination + "\0"; shf.fAnyOperationsAborted = false; retval = Win32API.Shell32.SHFileOperation(ref shf); aborted = (retval != 0) || shf.fAnyOperationsAborted; }
/// <summary> /// Deletes files. /// </summary> /// <param name="form">Parent form.</param> /// <param name="paths">Full paths to files or folders (no mixing and matching).</param> /// <param name="aborted">Was the operation aborted?</param> public static void DeleteFilesOrDirectories(IntPtr windowHandle, IEnumerable<string> paths, String progressTitle, ref Boolean aborted) { var delimitedPaths = string.Join("\0", paths.ToArray()); int retval = 0; var shf = new Win32API.Shell32.SHFILEOPSTRUCT(); shf.wFunc = Win32API.Shell32.FO_DELETE; shf.fFlags = Win32API.Shell32.FOF_ALLOWUNDO | Win32API.Shell32.FOF_NOCONFIRMATION; shf.lpszProgressTitle = progressTitle; shf.hwnd = IntPtr.Zero; if (windowHandle != IntPtr.Zero) { shf.hwnd = windowHandle; } shf.pFrom = delimitedPaths + "\0"; shf.pTo = "\0"; shf.fAnyOperationsAborted = false; retval = Win32API.Shell32.SHFileOperation(ref shf); aborted = (retval != 0) || shf.fAnyOperationsAborted; }