Faite des opérations de fichiers avec shfileoperation

Soyez le premier à donner votre avis sur cette source.

Vue 5 488 fois - Téléchargée 324 fois

Description

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

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1
OK Merci DeeJay. Donc en gros hNameMappings retourne ce que la fonction vient d'effectuer. Je vais etudier ça.

Nono.
Messages postés
23
Date d'inscription
mercredi 17 avril 2002
Statut
Membre
Dernière intervention
23 décembre 2003

hNameMappings:
Handle of a filename mapping object that contains an array of SHNAMEMAPPING structures. Each structure contains the old and new path names for each file that was moved, copied, or renamed. This member is used only if fFlags includes FOF_WANTMAPPINGHANDLE.

Maintenant on sait à quoi ça sert :)
Messages postés
871
Date d'inscription
dimanche 6 janvier 2002
Statut
Membre
Dernière intervention
3 novembre 2005
1
hNameMappings sert peut-être pour tout ce qui est le mapping de fichiers en mémoire ??

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.