using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace Developpez.Dotnet.System { /// /// Classe de base abstraite pour des opérations de copie et de déplacement /// de fichier qui peuvent signaler leur progression. /// public abstract class FileOperationBase { /// /// Initialise une nouvelle instance de FileOperationBase /// /// Fichier source /// Fichier destination protected FileOperationBase(string source, string destination) { Source = source; Destination = destination; } /// /// Quand cette méthode est redéfinie dans une classe dérivée, /// exécute l'opération correspondant à l'objet courant /// public abstract void Execute(); /// /// Quand cette propriété est redéfinie dans une classe dérivée, /// renvoie le type d'opération correspondant à l'objet courant /// public abstract FileOperationType OperationType { get; } /// /// Renvoie ou définit une valeur indiquant si le fichier cible /// doit être remplacé s'il existe déjà. Si cette propriété est false /// et que le fichier cible existe, une exception est levée. /// public bool ReplaceExisting { get; set; } /// /// Renvoie le nom du fichier source /// public string Source { get; private set; } /// /// Renvoie le nom du fichier de destination /// public string Destination { get; private set; } /// /// Se produit quand l'opération signale sa progression /// public event FileOperationProgressEventHandler ProgressChanged; /// /// Déclenche l'évènement ProgressChanged /// /// Un FileOperationProgressEventArgs qui contient les données de l'évènement protected void OnProgressChanged(FileOperationProgressEventArgs e) { var handler = ProgressChanged; if (handler != null) handler(this, e); } internal void CheckResult(bool result) { if (!result) { int error = Marshal.GetLastWin32Error(); if (error != ERROR_REQUEST_ABORTED) { int hr = Marshal.GetHRForLastWin32Error(); throw Marshal.GetExceptionForHR(hr); } } } internal int ProgressCallback( long totalFileSize, long totalBytesTransferred, long streamSize, long streamBytesTransferred, int dwStreamNumber, int dwCallbackReason, IntPtr hSourceFile, IntPtr hDestinationFile, IntPtr lpData) { var args = new FileOperationProgressEventArgs( OperationType, Source, Destination, totalBytesTransferred, totalFileSize); OnProgressChanged(args); return (int) args.Action; } #region Interop declarations internal delegate int CopyProgressRoutine( long totalFileSize, long totalBytesTransferred, long streamSize, long streamBytesTransferred, int dwStreamNumber, int dwCallbackReason, IntPtr hSourceFile, IntPtr hDestinationFile, IntPtr lpData); internal const int ERROR_REQUEST_ABORTED = 1235; #endregion } }