Copie de fichiers .exe via des Treeviews

Résolu
swohard - 22 oct. 2012 à 16:24
 Utilisateur anonyme - 5 nov. 2012 à 19:34
Voilà ce que je veux faire en .Net:

1. Sélectionner un (les) fichier(s) .exe ou .msi dans un Treeview.
2. Cliquer sur le bouton Add.
3. Faire un FileCopy du (des) fichier(s) sélectionné(s) vers le dossier temporaire du PC.

A priori, rien de bien compliqué. Seulement, j'ai commencé le VB.Net il y a peu de temps, et ça fait plusieurs jours maintenant que je suis penchée sur ce problème, je piétine.

Voici le code:
    Private Sub btn_Transfert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
        Dim Node As System.Windows.Forms.TreeNode
        Try
            For Each Node In tView_Serveur.SelectedNode
                tView_Temporaire.FileCopy("Z:\Dossier\Sous dossier\Sous sous dossier".fichier récupéré, "%system root%\temp")
            Next
        Catch erreur As Exception
            MessageBox.Show("Copie échoué. " & erreur.GetBaseException.Message)
        End Try
    End Sub


Est-ce qu'il y aurait un moyen d'éviter le For Each aussi?
Merci d'avance.

31 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
2 nov. 2012 à 19:22
Je ne comprends pas. Quel est l'evenement que tu utilises pour faire ton click droit?
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
3 nov. 2012 à 08:24
Je crois avoir compris. Tu as mis un menucontextuel sur ta treeview. Il faut savoir qu'il faut sélectionner le fichier (clic gauche) pour pouvoir ensuite le copier en le renommant.
Tu mets donc ceci dans l'evenement Load de ta form:

ToolStripMenuItem1.Enabled = False

Ceci pour empécher de cliquer si on n'a pas sélectionné de fichier. Ensuite dans l'evenement tView_Serveur_AfterSelect

ToolStripMenuItem1.Enabled = True

et maintenant le code dans l'evenement ToolStripMenuItem1

 Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
        Try
            If File.Exists(Destination & "" & nomfichier) Then
                MessageBox.Show("Le  fichier " & nomfichier & " existe déjà!", "Copie impossible", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                Exit Sub
            Else
                FileCopy(cheminfichier, Destination & "" & "nouveaunom.exe")
                MessageBox.Show("La copie du fichier: nouveaunom.exe est effectuée", "Copie fichier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                reset()
                ToolStripMenuItem1.Enabled = False
            End If
        Catch erreur As Exception
            MessageBox.Show(erreur.GetBaseException.Message, "Copie fichier", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub

Tu remarqueras que j'ai changé le nom de la copie. A toi de t'arranger pour le faire par code, c'est facile! Il faut que tu changes aussi la ligne de vérification de "fichier existe" bien entendu.

@+Le Pivert
0
Merci pour ta réponse. J'ai continué d'explorer avant que je puisse voir tes messages. C'est un menu contextuel que j'ai mis en place oui afin de pouvoir renommer les fichiers souhaités avant de les copier, parmi un liste de propositions qui est la fameuse ToolStripMenu.
Au passage, un seul et unique clique gauche, non seulement, sélectionne le fichier, mais le copie directement également... Mais ça n'est pas un point gênant, et au contraire. Le clique droit sur n'importe quel fichier même sans être sélectionné donne directement accès au menu contextuel "Renommer" et à sa liste.

Voilà mon code avec en exemple le fichier 7Zip.exe:

#Region "Renommage des fichiers"

'--------------------------------
'EVENEMENT GERANT LE CLIQUE DROIT
'--------------------------------

    Private Sub tView_Serveur_NodeMouseClick(ByVal sender As Object, ByVal e As TreeNodeMouseClickEventArgs) Handles tView_Serveur.NodeMouseClick
        Dim textFichier As String

        If e.Button = MouseButtons.Right Then
            textFichier = e.Node.Text
            MsgBox("1 " & textFichier)
        End If
    End Sub


'--------------------------------------------------------
'EVENEMENT POUR RENOMMER LE FICHIER 7z922.exe EN 7Zip.exe
'--------------------------------------------------------
    Private Sub ZipexeToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZipexeToolStripMenuItem.Click


        Dim textToolStripMenu As String
        'Dim textFichier As String

        'remplaces le texte du fichier par le texte du label sélectionné
        textToolStripMenu = ZipexeToolStripMenuItem.Text
        MsgBox("2 " & textToolStripMenu)

        My.Computer.FileSystem.RenameFile(textFichier, textToolStripMenu)

        'PUIS retires "le nom du fichier.exe" de la liste ToolSripMenus
    End Sub

#End Region


Il y a seulement une chose que je n'arrive pas, c'est de faire le lien entre les deux Sub au niveau de cette ligne:
My.Computer.FileSystem.RenameFile(textFichier, textToolStripMenu)

Comment récupérer la "valeur" de textFichier dans le deuxième Sub sans qu'il me dise qu'il est non assigné ou non déclaré...?
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
5 nov. 2012 à 11:52
Ce que je vois c'est que ta variable "textFichier" est déclarée dans la Sub tView_Serveur_NodeMouseClick, il faut la déclarer avec les autres variables au début pour qu'elle soit prise en compte.
Ensuite dans le My.Computer.FileSystem.RenameFile
ceux ne sont pas des chemin de fichiers, mais des nom de fichiers, cela ne peut pas fonctionner.
Voit déjà cela après on verra.
0

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

Posez votre question
Ok, j'ai enlevé la variable locale et l'ai mise au début.
Pour My.Computer.FileSystem.RenameFile, j'avais pensé mettre tout dans des variables une fois le texte récupéré, puisque les chemins seront différents à chaque fois en raison des mises à jour des fichiers .exe. Mauvaise piste...
0
J'ai oublié de préciser que les fichiers ne seront pas tous à renommer automatiquement. C'est pour ça que j'ai choisi cette solution avec les ToolStripMenus.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
5 nov. 2012 à 15:33
Je ne pense pas que ce soit la bonne manière de procéder. Le plus simple est de mettre 2 buttons : Copier et Renommer.
Voici quand même le code, mais tu t'apercevras que si tu as fait un clic gauche avant le clic droit cela génère une erreur. Ta sélection revient au premier clic.

Private Sub ToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click
        Try
            If File.Exists(Destination & "" & textFichier) Then
                MessageBox.Show("Le  fichier: " & textFichier & " existe déjà!", "Renommage impossible", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                Exit Sub
            Else
                FileCopy(cheminfichier & "" & nomfichier, Destination & "" & textFichier)
                MessageBox.Show("Le renommage du fichier: " & textFichier & " est effectué", "Renommer fichier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                reset()
                ToolStripMenuItem1.Enabled = False
            End If
        Catch erreur As Exception
            MessageBox.Show(erreur.GetBaseException.Message, "Renommer fichier", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub
    Private Sub tView_Serveur_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles tView_Serveur.NodeMouseClick
        Try
            If e.Button = MouseButtons.Right Then
                cheminfichier = ""
                cheminfichier = tView_Serveur.SelectedNode.FullPath
                nomfichier = e.Node.Text
                textFichier = e.Node.Text
                textFichier = "1 " & textFichier
            End If
            ToolStripMenuItem1.Text = textFichier
        Catch erreur As Exception
            MessageBox.Show(erreur.GetBaseException.Message, "Copie fichier", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub


Si tu veux suivre mes conseils c'est très simple tu mets le renommage dans un button.
0
Si tu veux suivre mes conseils c'est très simple tu mets le renommage dans un bouton.

Est-ce que cette solution permettra de renommer le fichier du serveur directement? Car là, le renommage est effectué une fois rendu dans le dossier temporaire, mais il n'y a pas de changement sur le fichier côté serveur. Il n'est pas renommé.

Et est-ce que la solution du bouton donnera accès à la ToolStripMenus (liste de proposition pour des normes de nom de fichier)?
0
je pense que je vais faire un CopyFile sur de dossier du serveur lui même:

FileCopy(cheminfichier & "" & nomfichier, cheminfichier & "" & textFichier)

et coder la suppression du premier fichier.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
5 nov. 2012 à 17:45
Je ne comprend pas ou tu veux en venir!
Voici un code qui renomme le fichier source et ensuite le copie.

 Private Sub cmdrename_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdrename.Click
        Try
            If File.Exists(Destination & "" & textFichier) Then
                MessageBox.Show("Le  fichier: " & textFichier & " existe déjà!", "Renommage impossible", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                Exit Sub
            Else
                My.Computer.FileSystem.RenameFile(cheminfichier & "" & nomfichier, textFichier)
                FileCopy(cheminfichier & "" & textFichier, Destination & "" & textFichier)
                MessageBox.Show("Le renommage du fichier: " & textFichier & " est effectué", "Renommer fichier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                reset()
                ToolStripMenuItem1.Enabled = False
            End If
        Catch erreur As Exception
            MessageBox.Show(erreur.GetBaseException.Message, "Renommer fichier", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub


Ensuite si tu as plusieurs options de renommage pourquoi ne pas utiliser des OptionButton, ou tu mettrais les nouveaux noms et l'utilisateur choisirait. Car j'ai encore essayé avec le clic droit, cela ne va pas du tout. Si cela te plait on revoit tout cela. Avec sélection du fichier clic gauche, ensuite choix du nouveau nom et après on copie ou on renomme avec 2 buttons.
0
Utilisateur anonyme
5 nov. 2012 à 19:34
Bonsoir,

Une petite remarque en passant :
Il faut faire le plus de tests possibles avant un déplacement de fichier ce qui évite d'utiliser une routine d'erreur.
-présence du fichier à déplacer
-test si déplaçable (attributs)
-test de capacité du disque
-présence du dossier de destination
* sinon test si possibilité de créer un dossier
-création de ce dossier avec droits d'écriture si besoin
-test si possibilité d'écrire dans ce dossier
-déplacement du fichier
-vérification finale.

N'utiliser un bloc Try/Catch qu'en dernier recours.
0
Rejoignez-nous