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
}
}