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 Forms Discussion :

[C#] Copie de fichier via l'API


Sujet :

Windows Forms

  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 ?

    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
     
    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
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Points : 295
    Points
    295
    Par défaut
    Pourquoi passer par l'API windows ?
    Tu peux utiliser System.IO

    Et tu peux faire des fileexist, et apres tu fais un showmessage.

  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,

    En fait, je veux utiliser l'API pour utiliser les fenêtres de remplacement avec la taille ... car je crois que ce n'est pas possible via la solution que tu me propose.



    Slyv

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Points : 295
    Points
    295
    Par défaut
    Il y a un forum plus approprié pour l'API windows.

    As-tu regardé le chapite 4
    http://bob.developpez.com/tutapiwin/

    Sinon
    http://www.developpez.net/forums/viewforum.php?f=4

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    A en croire ton enum, je dirais que c'est ce flag qu'il faut bouger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FOF_NOCONFIRMATION = 0x10, //Don't prompt the user.;
    Après, pour savoir quoi mettre, je vois pas trop

    Regarde toujours ici: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/shfileopstruct.asp

    et là
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shfileoperation.asp

    on sait jamais....

    A plus

  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
    Bonsoir,

    Après la tentative du désespoir, j'ai enfin réussi à obtenir ce que je voulais

    Voici le code modifié :

    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 votre aide et je vous souhaite de très 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
    Réponses: 5
    Dernier message: 20/12/2004, 22h35

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