Copier un ensemble de fichier en VB.NET

Résolu
fradimed Messages postés 25 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 8 avril 2012 - 12 janv. 2009 à 11:41
cs_demonstorm Messages postés 29 Date d'inscription samedi 2 juin 2007 Statut Membre Dernière intervention 7 mars 2011 - 22 janv. 2009 à 17:10
Salut à Tous.

Est ce que je peut savoir comment copier un ensemble de fichiers(en VB.NET)au même temps d'une répertoire à une autre,en utilisant la propriété :
My.Computer.FileSystem.CopyFile...
avec l'affichage de la fenêtre du dialog.

Merci pour votre réponse.

5 réponses

cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
15 janv. 2009 à 14:27
Salut,

Comment cette solution ne te convient, il faut alors gérer toi même la ProgressBar et la faire avancer dés qu'un fichier est copié. Voici un exemple

Pour effectuer un test, le mieux serait de mettre le code ci-dessous dans l'évènement Click d'un bouton :




'On déclare deux FolderBrowserDialog



Dim
 fbd1, fbd2 As New FolderBrowserDialog

' On déclare une nouvelle form qui va afficher
' la progression de la copie
Dim FormCopy As New Form

' ProgressBar qui indiquera l'état d'avancement
' de la copie
Dim ProgressBarCopy As New ProgressBar

' On ajoute la ProgressBar sur FormCopy
FormCopy.Controls.Add(ProgressBarCopy)
' On fixe la taille de FormCopy
FormCopy.Size =   New  System.Drawing.Size(53585)
' On demande que FormCopy apparaisse au milieu de l'écran
FormCopy.StartPosition  = FormStartPosition.CenterScreen
' On définit le titre de FormCopy
FormCopy.Text =   "Copie en cours..."

' On positionne la ProgressBar
ProgressBarCopy.Location  =  New  System.Drawing.Point(1010)
' On fixe sa taille
ProgressBarCopy.Size  =  New System.Drawing.Size(50030)

' On autorise la création d'un nouveau dossier
fbd1.ShowNewFolderButton =   True
' On définit que le dossier qu'affiche fbd1
' Ici Poste de Travail
fbd1.RootFolder  = Environment.SpecialFolder.MyComputer
' On affiche une description
fbd1.Description =   "Sélectionner le dossier contenant les fichiers à copier"

' Si l'utilisateur a cliqué sur OK
If  fbd1.ShowDialog()  = Windows.Forms.DialogResult.OK Then
     fbd2.ShowNewFolderButton =   True
     fbd2.RootFolder  = Environment.SpecialFolder.MyComputer
     fbd2.Description =   "Sélectionner le dossier où les fichiers seront collés"

     ' Si l'utilisateur a cliqué sur OK
      If  fbd2.ShowDialog()  = Windows.Forms.DialogResult.OK Then
          ' On fixe la valeur minimale de la ProgressBar
          ProgressBarCopy.Minimum =   0
          ' On fixe la valeur maximale de la ProgressBar
          ' le nombre de fichiers à copier donc
          ProgressBarCopy.Maximum  = My.Computer.FileSystem.GetFiles(fbd1.SelectedPath).Count
          ' On fixe sa valeur actuelle à 0
          ProgressBarCopy.Value =   0
          ' On fixe le pas de la ProgressBar
          ' c'est la valeur qui va être ajouter
          ' à Value dés qu'on utilise PerformStep
          ProgressBarCopy.Step  = 1

          'On affiche la Form visualisant la progression de la copie
          FormCopy.Show()

          ' Boucle sur tous les fichiers présents dans le dossier
          For Each Files In My.Computer.FileSystem.GetFiles(fbd1.SelectedPath)
               Dim Fi As New System.IO.FileInfo(Files)
               ' Copie le fichier
               My.Computer.FileSystem.CopyFile(Files, fbd2.SelectedPath +  ""  + Fi.Name)
               ' Avance la position actuelle de la ProgressBar avec
               ' la quantité spécifiée par Step
               ProgressBarCopy.PerformStep()
          Next

          ' On ferme la fenêtre visualisant la progression de la copie
          ' une fois celle-ci terminée
          FormCopy.Close()

     End If
End If





++

Fauve

<hr size ="2" width="100%" />
Pensez : Réponse Acceptée 
3
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
14 janv. 2009 à 21:16
Salut,

Si j'ai bien compris ce que tu demandes, ce code devrait faire ce que tu souhaites :

Dim fbd1, fbd2 As New FolderBrowserDialog

fbd1.ShowNewFolderButton =   True
fbd1.RootFolder  = Environment.SpecialFolder.MyComputer
fbd1.Description =   "Veuillez choisir un dossier contenant les fichiers à copier"

If  fbd1.ShowDialog()  = Windows.Forms.DialogResult.OK Then
     fbd2.ShowNewFolderButton =   True
     fbd2.RootFolder  = Environment.SpecialFolder.MyComputer
     fbd2.Description =   "Veuillez choisir un dossier où les fichiers copiés seront collés"

      If  fbd2.ShowDialog()  = Windows.Forms.DialogResult.OK Then
          For Each Files As String In My.Computer.FileSystem.GetFiles(fbd1.SelectedPath)
               Dim Fi As New System.IO.FileInfo(Files)
               My.Computer.FileSystem.CopyFile(Files, fbd2.SelectedPath + "" + Fi.Name)
          Next
     End If
End If

<hr size="2" width="100%" />Pensez : Réponse Acceptée 
0
cs_demonstorm Messages postés 29 Date d'inscription samedi 2 juin 2007 Statut Membre Dernière intervention 7 mars 2011
21 janv. 2009 à 15:29
Bonjour, je ne comprend pas, j'ai une erreur et je ne sais pas d'où cela peut venir...
je vous colle mon code:
Imports System.Windows.Forms

Public Class Dialog1

    Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
        Dim f1, f2 As Object
        If RadioButton1.Checked = True Then
            f1 = "C:\Program Files\AOE3_TradPatcher\TradFr\Age of Empire III\age of empire 3 patch fr complet\aoe3dialfr\dialog\*.*"
            f2 = "C:\Program Files\Microsoft Games\Age of Empires III\Sound\dialog"
        ElseIf RadioButton2.Checked = True Then
            f1 = "C:\Program Files\AOE3_TradPatcher\TradFr\Age of Empire III\age of empire 3 patch fr complet\aoe3helpunit\aoe3helpunit\*.*"
            f2 = "C:\Program Files\Microsoft Games\Age of Empires III\data"
        ElseIf RadioButton3.Checked = True Then
            f1 = "C:\Program Files\AOE3_TradPatcher\TradFr\Age of Empire III\age of empire 3 patch fr complet\aoe3stfr\tradfraoe3\*.*"
            f2 = "C:\Program Files\Microsoft Games\Age of Empires III\data"

            MsgBox("Vous devez cochez l'une des partie!", MsgBoxStyle.Critical, "Attention!")
        End If
        If RadioButton1.Checked True Or RadioButton2.Checked True Or RadioButton3.Checked = True Then
            Dim fbd1, fbd2 As Object
            fbd1 = f1
            fbd2 = f2

            ' On déclare une nouvelle form qui va afficher
            ' la progression de la copie
            Dim FormCopy As New Form

            ' ProgressBar qui indiquera l'état d'avancement
            ' de la copie
            Dim ProgressBarCopy As New ProgressBar

            ' On ajoute la ProgressBar sur FormCopy
            FormCopy.Controls.Add(ProgressBarCopy)
            ' On fixe la taille de FormCopy
            FormCopy.Size = New System.Drawing.Size(535, 85)
            ' On demande que FormCopy apparaisse au milieu de l'écran
            FormCopy.StartPosition = FormStartPosition.CenterScreen
            ' On définit le titre de FormCopy
            FormCopy.Text = "Copie en cours..."

            ' On positionne la ProgressBar
            ProgressBarCopy.Location = New System.Drawing.Point(10, 10)
            ' On fixe sa taille
            ProgressBarCopy.Size = New System.Drawing.Size(500, 30)

            ' Si l'utilisateur a cliqué sur OK

            ' On fixe la valeur minimale de la ProgressBar
            ProgressBarCopy.Minimum = 0
            ' On fixe la valeur maximale de la ProgressBar
            ' le nombre de fichiers à copier donc
            ProgressBarCopy.Maximum = My.Computer.FileSystem.GetFiles(fbd1).Count
            ' On fixe sa valeur actuelle à 0
            ProgressBarCopy.Value = 0
            ' On fixe le pas de la ProgressBar
            ' c'est la valeur qui va être ajouter
            ' à Value dés qu'on utilise PerformStep
            ProgressBarCopy.Step = 1

            'On affiche la Form visualisant la progression de la copie
            FormCopy.Show()

            ' Boucle sur tous les fichiers présents dans le dossier
            For Each Files In My.Computer.FileSystem.GetFiles(fbd1)
                Dim Fi As New System.IO.FileInfo(Files)
                ' Copie le fichier
                FileCopy(Files, fbd2)
                ' Avance la position actuelle de la ProgressBar avec
                ' la quantité spécifiée par Step
                ProgressBarCopy.PerformStep()
            Next

            ' On ferme la fenêtre visualisant la progression de la copie
            ' une fois celle-ci terminée
            FormCopy.Close()
        Else
            MsgBox("Vous devez cochez l'une des partie!", MsgBoxStyle.Critical, "Attention!")
            Me.Close()
        End If

    End Sub

    Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click

        Me.Close()
    End Sub

    Private Sub Dialog1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MsgBox("Vous devrez appliquez les trois partie une par une pour que le patch fonctionne...")
    End Sub
End Class
 l'erreur que j'obtient:
Une exception non gérée s'est produite dans votre application. Si vous cliquez sur Continuer, l'application va ignorer cette erreur et essayer de continuer. Si vous cliquez sur Quitter, l'application va s'arrêter immédiatement.

Caractères non conformes dans le chemin d'accès.
et voici le détail de l'erreur:
Consultez la fin de ce message pour plus de détails sur l'appel du débogage
juste-à-temps (JIT) à la place de cette boîte de dialogue.

************** Texte de l'exception **************
System.ArgumentException: Caractères non conformes dans le chemin d'accès.
   à System.Security.Permissions.FileIOPermission.HasIllegalCharacters(String[] str)
   à System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)
   à System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String[] pathList, Boolean checkForDuplicates, Boolean needFullPath)
   à System.IO.Path.GetFullPath(String path)
   à Microsoft.VisualBasic.FileIO.FileSystem.FindFilesOrDirectories(FileOrDirectory FileOrDirectory, String directory, SearchOption searchType, String[] wildcards, Collection`1 Results)
   à Microsoft.VisualBasic.MyServices.FileSystemProxy.GetFiles(String directory)
   à Age_Of_Empire_III___TradPatcher.Dialog1.OK_Button_Click(Object sender, EventArgs e) dans C:\Documents and Settings\landry cometti\Mes documents\Visual Studio 2008\Projects\Age Of Empire III - TradPatcher\Age Of Empire III - TradPatcher\Dialog1.vb:ligne 55
   à System.Windows.Forms.Control.OnClick(EventArgs e)
   à System.Windows.Forms.Button.OnClick(EventArgs e)
   à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   à System.Windows.Forms.Control.WndProc(Message& m)
   à System.Windows.Forms.ButtonBase.WndProc(Message& m)
   à System.Windows.Forms.Button.WndProc(Message& m)
   à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

************** Assemblys chargés **************
mscorlib
    Version de l'assembly : 2.0.0.0
    Version Win32 : 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase : file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
Age Of Empire III - TradPatcher
    Version de l'assembly : 2.0.0.0
    Version Win32 : 2.0.0.0
    CodeBase : file:///C:/Program%20Files/AOE3_TradPatcher/Age%20Of%20Empire%20III%20-%20TradPatcher.exe
----------------------------------------
Microsoft.VisualBasic
    Version de l'assembly : 8.0.0.0
    Version Win32 : 8.0.50727.1433 (REDBITS.050727-1400)
    CodeBase : file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
    Version de l'assembly : 2.0.0.0
    Version Win32 : 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase : file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms
    Version de l'assembly : 2.0.0.0
    Version Win32 : 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase : file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Version de l'assembly : 2.0.0.0
    Version Win32 : 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase : file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Runtime.Remoting
    Version de l'assembly : 2.0.0.0
    Version Win32 : 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase : file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
mscorlib.resources
    Version de l'assembly : 2.0.0.0
    Version Win32 : 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase : file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
System.Windows.Forms.resources
    Version de l'assembly : 2.0.0.0
    Version Win32 : 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase : file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_fr_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** Débogage JIT **************
Pour activer le débogage juste-à-temps (JIT), le fichier de configuration pour cette
application ou cet ordinateur (machine.config) doit avoir la valeur
jitDebugging définie dans la section system.windows.forms.
L'application doit également être compilée avec le débogage
activé.

Par exemple :

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

Lorsque le débogage juste-à-temps est activé, les exceptions non gérées
seront envoyées au débogueur JIT inscrit sur l'ordinateur
plutôt que d'être gérées par cette boîte de dialogue.


voila je suis perdu, s'il vous plait aidez moi a m'y retrouver...

PS: j'ai essayer ton code fauve dans une autre application et l'application fonctionne mais ne copie pas le dossier séléctionné...
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
21 janv. 2009 à 21:52
Salut,

Je crois savoir où est ton erreur, cela vient de f1. Il faut enlever *.* car My.Computer.FileSystem.GetFiles considère *.* comme un nom de dossier or le caractère * est interdit dans un nom de dossier d'où le message d'erreur suivant apparait :

Une exception non gérée s'est produite dans votre application. Si vous
cliquez sur Continuer, l'application va ignorer cette erreur et essayer
de continuer. Si vous cliquez sur Quitter, l'application va s'arrêter
immédiatement.

Caractères non conformes dans le chemin d'accès.

Je devine ce que tu as voulu faire, tu crois quand précisant *.* dans f1 que My.Computer.FileSystem.GetFiles(fbd1).Count va te retourner le nombre total de fichiers dans un dossier.

Tu as pas besoin de mettre *.* dans f1 car My.Computer.FileSystem.GetFiles(fbd1).Count te retourne le nombre de tous les fichiers présent dans le dossier

Voici le code que j'ai modifié et optimisé (car tu as déclaré certaines variables qui ne servaient à rien, j'ai enlevé le deuxième if car avec Exit Sub si aucun RadioButton n'est coché, on quitte OK_Button_Click, la copie n'a pas lieu)  :

Note : si tu as des questions, n'hésites pas


<hr size= "2" width="100%" />







Public Class
 Form1

    Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
        Dim f1 As String  =  ""
        Dim f2 As String  =  ""

         If  RadioButton1.Checked Then
            f1  =   "C:\Program Files\AOE3_TradPatcher\TradFr\Age of Empire III\age of empire 3 patch fr complet\aoe3dialfr\dialog"
            f2  =  "C:\Program Files\Microsoft Games\Age of Empires III\Sound\dialog"
         ElseIf  RadioButton2.Checked Then
            f1  =   "C:\Program Files\AOE3_TradPatcher\TradFr\Age of Empire III\age of empire 3 patch fr complet\aoe3helpunit\aoe3helpunit"
            f2  =  "C:\Program Files\Microsoft Games\Age of Empires III\data"
         ElseIf  RadioButton3.Checked Then
            f1  =   "C:\Program Files\AOE3_TradPatcher\TradFr\Age of Empire III\age of empire 3 patch fr complet\aoe3stfr\tradfraoe3"
            f2  =  "C:\Program Files\Microsoft Games\Age of Empires III\data"
         ElseIf Not  (RadioButton1.Checked Or RadioButton2.Checked Or RadioButton3.Checked) Then
            MsgBox("Vous devez cochez l'une des partie!", MsgBoxStyle.Critical, "Attention!")
            ' Si aucun RadioButton n'est coché on quite la procédure OK_Button_Click
            ' Le code qui suit ne sera pas exécutée
            Exit Sub
        End If

        ' On déclare une nouvelle form qui va afficher
        ' la progression de la copie
        Dim FormCopy As New Form

        ' ProgressBar qui indiquera l'état d'avancement
        ' de la copie
        Dim ProgressBarCopy As New ProgressBar

        ' On ajoute la ProgressBar sur FormCopy
        FormCopy.Controls.Add(ProgressBarCopy)
        ' On fixe la taille de FormCopy
        FormCopy.Size  =  New System.Drawing.Size(53585)
        ' On demande que FormCopy apparaisse au milieu de l'écran
        FormCopy.StartPosition =  FormStartPosition.CenterScreen
        ' On définit le titre de FormCopy
        FormCopy.Text =  "Copie en cours..."

        ' On positionne la ProgressBar
        ProgressBarCopy.Location  =  New  System.Drawing.Point(1010)
        ' On fixe sa taille
        ProgressBarCopy.Size  =  New System.Drawing.Size(50030)

        ' Si l'utilisateur a cliqué sur OK

        ' On fixe la valeur minimale de la ProgressBar
        ProgressBarCopy.Minimum =   0
        ' On fixe la valeur maximale de la ProgressBar
        ' le nombre de fichiers à copier donc
        ProgressBarCopy.Maximum  = My.Computer.FileSystem.GetFiles(f1).Count
        ' On fixe sa valeur actuelle à 0
        ProgressBarCopy.Value =   0
        ' On fixe le pas de la ProgressBar
        ' c'est la valeur qui va être ajouter
        ' à Value dés qu'on utilise PerformStep
        ProgressBarCopy.Step  = 1

        'On affiche la Form visualisant la progression de la copie
        FormCopy.Show()

        ' Boucle sur tous les fichiers présents dans le dossier
        For Each Files In My.Computer.FileSystem.GetFiles(f1)
            Dim Fi As New System.IO.FileInfo(Files)
            ' Copie le fichier
            My.Computer.FileSystem.CopyFile(Files, f2 +  ""  + Fi.Name)
            ' Avance la position actuelle de la ProgressBar avec
            ' la quantité spécifiée par Step
            ProgressBarCopy.PerformStep()
        Next
        ' On ferme la fenêtre visualisant la progression de la copie
        ' une fois celle-ci terminée
        FormCopy.Close()
        Me.Close()

    End Sub
End Class







<hr size ="2" width="100%" />
++

Fauve

<hr size="2" width="100%" />
Pensez : Réponse Acceptée 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_demonstorm Messages postés 29 Date d'inscription samedi 2 juin 2007 Statut Membre Dernière intervention 7 mars 2011
22 janv. 2009 à 17:10
plop merci ca c'est du code, mais je m'était rendu compte de ma connerie ce matin, merci encore, maintenant je me heurte a un autre problème, je voudrai que pendant la copie il affiche dans un  label le chemain complet du fichier avec sont nom et son extension et que dans un autre label il mette la taille du fichier...
pour l'instant ca fonctionne que quand il y a une erreur ...

j'en déduis que le copyfile acapare le programme et ne repond a aucune question tant qu'il bosse...
comment copier et récupérer des infos en même temps?
je sais que c'est possible je l'avais vu dans un autre code vbnet mais je n'arrive pas a remetre la main dessus...

en tout cas merci encore fauve....
http://wovbc.azureforum.com
0
Rejoignez-nous