using System;
using System.Runtime.InteropServices;
namespace Developpez.Dotnet.System
{
///
/// Représente une opération de déplacement de fichier qui peut signaler
/// sa progression.
///
public class FileMoveOperation : FileOperationBase
{
///
/// Initialise une nouvelle instance de FileMoveOperation
///
/// Fichier source
/// Fichier destination
public FileMoveOperation(string source, string destination)
: base(source, destination)
{
}
///
/// Exécute le déplacement
///
protected override void ExecuteCore()
{
var flags = MoveFileFlags.CopyAllowed;
if (ReplaceExisting)
flags |= MoveFileFlags.ReplaceExisting;
bool r = MoveFileWithProgress(
Source,
Destination,
ProgressCallback,
IntPtr.Zero,
flags);
CheckError(r);
}
///
/// Renvoie FileOperationType.Move
///
public override FileOperationType OperationType
{
get { return FileOperationType.Move; }
}
#region Interop declarations
[DllImport("kernel32", SetLastError = true)]
private static extern bool MoveFileWithProgress(
string lpExistingFileName,
string lpNewFileName,
CopyProgressRoutine lpProgressRoutine,
IntPtr lpData,
MoveFileFlags dwFlags);
[Flags]
private enum MoveFileFlags
{
// ReSharper disable UnusedMember.Local
ReplaceExisting = 0x01,
CopyAllowed = 0x02,
DelayUntilReboot = 0x04,
WriteThrough = 0x08,
CreateHardLink = 0x10,
FailIfNotTrackable = 0x20
// ReSharper restore UnusedMember.Local
}
#endregion
}
}