IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[C#] Copie de fichier via l'API


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 29
    Points
    29
    Par défaut [C#] Copie de fichier via l'API
    Bonjour,

    Au sein de mon application, j'offre à l'utilisateur la possibilité d'importer des fichiers XML. Le fichier qui va être importé peut déjà exister dans mon dossier contenant l'exe de l'application. Ainsi, j'ai donc choisi d'utiliser l'API Windows pour copier des fichiers, avoir la fenêtre de demande de confirmation en cas d'existence du fichier à copier ...

    Par le passé, j'utilisais un code moins complet que celui ci dessous, mais la copie pouvait foirrer. En effet, quand je faisais l'importation de certains XML je recevais l'erreur suivante :
    Impossible de copier Fichier : Impossible de lire à partir du fichier ou la disquette source
    (Code Retour 1026 de ma fonction)
    J'utilise donc désormais le code ci dessus (la nouveauté : l'utilisation de la variable FromWildCard).

    Ce code marche parfaitement, mais par contre, il n'affiche pas la fenêtre de confirmation lorsque le fichier est déjà existant ... et je n'arrive pas à modifier ce code ... J'ai modifié les drapeaux mais sans résultat ...

    Quelqu'un aurait-il une idée ?

    Ps : je voudrais utiliser les API dans le simple but d'avoir la fenêtre de confirmation de remplacement de fichier s'il existe. (la jolie fenêtre windows )

    Merci par avance

    Slyv

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    
    public class Files 
    { 
       public enum FO : int 
      { 
         FO_MOVE = 1, 
         FO_COPY = 2, 
         FO_DELETE = 3, 
         FOF_ALLOWUNDO = 0x40, 
         FOF_NOCONFIRMATION = 0x10, //Don't prompt the user.; 
         FOF_NOCONFIRMMKDIR = 0x200, 
         FOF_SILENT = 0x4, 
         FOF_WANTMAPPINGHANDLE = 0x20, 
         FOF_RENAMEONCOLLISION = 0x8, 
         FOF_CONFIRMMOUSE = 0x2, 
         FOF_FILESONLY = 0x80, 
         FOF_MULTIDESTFILES = 0x1, 
         FOF_NO_CONNECTED_ELEMENTS = 0x1000, 
         FOF_NOCOPYSECURITYATTRIBS = 0x800, 
         FOF_SIMPLEPROGRESS = 0x100, 
         FOF_WANTNUKEWARNING = 0x2000, 
         FOF_NORECURSION = 0x1000, 
         FOF_NOERRORUI = 0x0400 
      } 
        
      [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto, Pack=1)] 
      public struct SHFILEOPSTRUCT 
      { 
        public IntPtr hwnd; 
        [MarshalAs(UnmanagedType.U4)] 
        public int wFunc; 
        public string pFrom; 
        public string pTo; 
        public short fFlags; 
        [MarshalAs(UnmanagedType.Bool)] 
        public bool fAnyOperationsAborted; 
        public IntPtr hNameMappings; 
        public string lpszProgressTitle; 
      } 
      [DllImport("shell32.dll", CharSet=CharSet.Auto)] 
      public static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); 
      public void CopyFile(string SourceFile, string DestinationFile) 
      { 
        const string FromWildcard = @"{0}\*.*"; 
        SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT(); 
        shf.wFunc = (int)FO.FO_COPY; 
        shf.fFlags = (int)FO.FOF_NOCONFIRMMKDIRFO / 
                          (int).FOF_WANTMAPPINGHANDLE; 
        shf.pFrom = string.Format(FromWildcard,SourceFile)+'\0'+'\0'; 
        shf.pTo = DestinationFile + '\0' + '\0'; 
        int res = SHFileOperation(ref shf); 
        Console.WriteLine(res); 
      } 
    }

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/structures/shfileopstruct.asp
    FOF_WANTMAPPINGHANDLE
    If FOF_RENAMEONCOLLISION is specified and any files were renamed, assign a name mapping object containing their old and new names to the hNameMappings member
    Il manque FOF_RENAMEONCOLLISION.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Salut,

    Merci pour ta réponse.

    Selon toi, ma fonction CopyFile devrait être la suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void CopyFile(string pFrom, string pTo) 
    { 
       const string FromWildcard = @"{0}\*.*"; 
       SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
       shf.wFunc = (int)FO.FO_COPY;
       shf.fFlags = (int)FO.FOF_NOCONFIRMMKDIR / 
                         (int)FO.FOF_WANTMAPPINGHANDLE /
                        (int)FO.FOF_RENAMEONCOLLISION;
       shf.pFrom = string.Format(FromWildcard,pFrom)+'\0'+'\0';
       shf.pTo = pTo + '\0' + '\0';
       int res = SHFileOperation(ref shf);
       Console.WriteLine(res);
    }
    Car la fenêtre de confirmation n'est toujours pas présente

    C'est ça que je voudrais obtenir :



    Slyv

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Pourquoi utilises-tu des divisions ? C'est des OU binaires qu'il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       shf.fFlags = (int)FO.FOF_NOCONFIRMMKDIR |
                         (int)FO.FOF_WANTMAPPINGHANDLE |
                        (int)FO.FOF_RENAMEONCOLLISION;
    Mais en C# je me demande ce que ça donne. S'il est pas content utilise le +.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Salut,

    Avec des OU Binaire, cela compile parfaitement, mais par contre, toujours pas de fenêtre de demande de confirmation

    Je précise que dans tous les cas, mon code de sortie est 0 ce qui prouve que la copie a bien été effectué.

    Slyv

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Salut,

    J'ai trouvé la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    
    public class Files{
    	
       public enum FO : int 
       { 
          FO_COPY = 2, 
          FO_DELETE = 3, 
          FO_MOVE = 1, 
          FO_RENAME=4,
          FOF_CONFIRMMOUSE = 0x2,
          FOF_ALLOWUNDO = 0x40, 
          FOF_FILESONLY = 0x80,
          FOF_MULTIDESTFILES = 0x1,
          FOF_NOCONFIRMATION = 0x10, //Don't prompt the user.; 
          FOF_NOCONFIRMMKDIR = 0x200, 
          FOF_NO_CONNECTED_ELEMENTS = 0x1000,
          FOF_NOCOPYSECURITYATTRIBS = 0x800,
          FOF_NOERRORUI = 0x0400,
          FOF_RENAMEONCOLLISION = 0x8,
          FOF_SILENT = 0x4, 
          FOF_SIMPLEPROGRESS = 0x100,
          FOF_WANTMAPPINGHANDLE = 0x20,
          FOF_WANTNUKEWARNING = 0x2000,
          FOF_NORECURSION = 0x1000		
       } 
    	
       [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto, Pack=1)] 
       public struct SHFILEOPSTRUCT 
       { 
          public IntPtr hwnd; 
          public int wFunc; 
          public string pFrom; 
          public string pTo; 
          public short fFlags; 
          public bool fAnyOperationsAborted; 
          public IntPtr hNameMappings; 
          public string lpszProgressTitle; 
       }
       [DllImport("shell32.dll", CharSet=CharSet.Auto)] 
       public static extern int SHFileOperation(ref SHFILEOPSTRUCT FileOp); 
       public void CopyFile(string pFrom, string pTo) 
       { 
          long retval;
          SHFILEOPSTRUCT shf = new SHFILEOPSTRUCT();
          shf.wFunc = (int)FO.FO_COPY;
          shf.fFlags = (int)FO.FOF_NOCONFIRMMKDIR 
                         | (int)FO.FOF_WANTMAPPINGHANDLE;
          shf.pFrom = pFrom+'\0'+'\0';
          shf.pTo = pTo + '\0' + '\0';
          shf.fAnyOperationsAborted = true;
          retval = SHFileOperation(ref shf);
          Console.WriteLine(retval);
       }
    }
    il fallait enlever la string FromWildCard et rajouter les \0 dans les chemins.

    Merci beaucoup pour ton aide.

    Bonnes fêtes de fin d'année

    Slyv

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD12] et [WDM12] Copie de fichiers via USB
    Par Arasen dans le forum WinDev
    Réponses: 11
    Dernier message: 01/04/2009, 14h53
  2. script copie de fichier via Http
    Par msim29 dans le forum Windows
    Réponses: 1
    Dernier message: 30/06/2008, 10h09
  3. Copie de fichier via sockets
    Par MortDansLAme dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/02/2008, 13h01
  4. [Reseau]Copie de fichier via le réseau
    Par liichiii dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 16/08/2005, 10h19
  5. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/12/2004, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo