Ce source présent l'utilisation complète ( ou presque ) de la fonction ShFileOperation de l'API. La fonction est modifiée en ShFilOperationPascal pour simplifier son utilisation dans les programmes.
Elle permet de copier/renommer/déplacer/supprimer des groupes de fichiers avec les sous-répertoires inclus. Elle gère aussi les caractères génériques ? et *.
Le programme de démo permet de saisir le paramètres et les options afin d'essayer toutes les possibitilés de la fonction.
Attention : cette fonction est très puissante, vous pouvez supprimer facilement toute une partie de vos fichiers... faites bien gaffe aux paramètre !!!
Source / Exemple :
// Définition de la fonctionen Pascal, c'est plus facile à utiliser que l'API
//
// Définition d'un type ensemble pour les options de la fonctions
Type TSHFileOperationOptions = Set Of (oFOF_MULTIDESTFILES ,
oFOF_CONFIRMMOUSE ,
oFOF_SILENT ,
oFOF_RENAMEONCOLLISION ,
oFOF_NOCONFIRMATION ,
oFOF_WANTMAPPINGHANDLE ,
oFOF_ALLOWUNDO ,
oFOF_FILESONLY ,
oFOF_SIMPLEPROGRESS ,
oFOF_NOCONFIRMMKDIR ,
oFOF_NOERRORUI );
// Prototype de la fonction en Pascal
Function ShFileOperationPascal(Operation:Cardinal;NomsFROM,NomsTO:TStrings;Options:TSHFileOperationOptions;Titre:String):Boolean;
Var Info :TSHFileOPStruct;
ChaineFROM :String;
ChaineTO :String;
fl :Word;
// Fonction interne de conversion d'un TStrings et Chaine à zéro terminal multiple.
// Le résultat est retourné en String plutot qu'en PChar pour plus de facilité de manipulation
Function ConcatTStrings(Liste:TStrings):String;
Var i:Integer;
Begin
If (Liste=Nil) Or (Liste.Count=0)
Then Result:=#0#0
Else Begin
Result:='';
For i:=0 To Liste.Count-1 Do Result:=Result+Liste[i]+#0;
Result:=Result+#0;
End;
End;
Begin
// Transformation des TStrings en Chaine à zéro terminal multiple.
ChaineFROM:=ConcatTStrings(NomsFROM);
ChaineTO :=ConcatTStrings(NomsTO );
Titre :=Titre+#0;
// Préparation des options sous forme de 'flag' pour la fonction API
fl:=0;
If oFOF_MULTIDESTFILES In Options Then Inc(fl,FOF_MULTIDESTFILES );
If oFOF_CONFIRMMOUSE In Options Then Inc(fl,FOF_CONFIRMMOUSE );
If oFOF_SILENT In Options Then Inc(fl,FOF_SILENT );
If oFOF_RENAMEONCOLLISION In Options Then Inc(fl,FOF_RENAMEONCOLLISION);
If oFOF_NOCONFIRMATION In Options Then Inc(fl,FOF_NOCONFIRMATION );
If oFOF_WANTMAPPINGHANDLE In Options Then Inc(fl,FOF_WANTMAPPINGHANDLE);
If oFOF_ALLOWUNDO In Options Then Inc(fl,FOF_ALLOWUNDO );
If oFOF_FILESONLY In Options Then Inc(fl,FOF_FILESONLY );
If oFOF_SIMPLEPROGRESS In Options Then Inc(fl,FOF_SIMPLEPROGRESS );
If oFOF_NOCONFIRMMKDIR In Options Then Inc(fl,FOF_NOCONFIRMMKDIR );
If oFOF_NOERRORUI In Options Then Inc(fl,FOF_NOERRORUI );
// Préparation de la structure TSHFileOPStruct qui contient tous les paramètres de la fonction
// Il n'est pas utile de donner une fenêtre parent pour la progresion si elle est affichée. Dans ce
// cas l'affichage de la progression n'est pas liée à votre application.
// Vous remarquerez que ChaineFROM et ChaineTO ne sont pas converties en PChar, mais
// on donne seulement l'adresse du premier caractère. Ceci est possible car les #0 ont été ajoutés
// dans les chaines au préalable.
// Le titre de la fenêtre n'est utilisé que si la progression est active et en mode simple,
// c'est à dire sans l'option oFOF_SILENT et avec l'option oFOF_SIMPLEPROGRESS
With Info Do
Begin
Wnd :=0; // Handle de la fenêtre parent de la progression
wFunc :=Operation; // Type d'opération
pFrom :=@ChaineFROM[1]; // Noms de fichiers en entrée
pTo :=@ChaineTO [1]; // Noms de fichiers en sortie
fFlags :=fl; // Options
fAnyOperationsAborted :=False; // Code de retour
hNameMappings :=Nil; // J'sais pas encore à quoi ça sert...
lpszProgressTitle :=@Titre[1]; // Tire de la fenêtre de progression
End;
Result:=Not Boolean(ShFileOperation(Info)) And Not Info.fAnyOperationsAborted;
End;
Conclusion :
Cette fonction à déjà été présentée ici dans des cas particuliers par fabiin et delphicool... Merci donc à eux deux
--------------
Cette source et quelques autres sur :
http://nono40.developpez.com
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.