Mon code ne passe pas dans mon Select Case.

[Résolu]
Signaler
-
 swohard -
Bonjour à tous,

Lors d'une copie d'un fichier, je souhaite effectuer un contrôle. Si un des fichiers sélectionné apparaît dans la liste du Select Case, alors la copie peut s'effectuer, sinon il renvoie une MessageBox.

Dim nomfichier As String
Dim cheminfichier As String

Private Sub tView_Serveur_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tView_Serveur.AfterSelect
        cheminfichier = tView_Serveur.SelectedNode.FullPath
        nomfichier = Mid(cheminfichier, InStrRev(cheminfichier, "") + 1) 'on extrait le dernier nom de la chaine
        Try
            Select Case nomfichier
                Case "7zip.exe"
                    FileCopy(cheminfichier, Destination & nomfichier)
                Case "acrobatreader.exe"
                    FileCopy(cheminfichier, Destination & nomfichier)
                Case "adobereader.exe"
                    FileCopy(cheminfichier, Destination & nomfichier)
                Case "audacity.exe"
                    FileCopy(cheminfichier, Destination & nomfichier)
                Case "cart’ooo.exe"
                    FileCopy(cheminfichier, Destination & nomfichier)
                Case "cdburner.exe"
                    FileCopy(cheminfichier, Destination & nomfichier)
                Case "chrome.exe"
                    FileCopy(cheminfichier, Destination & nomfichier)
                Case Else
                    If nomfichier.IndexOf("Setup") Then
                        MessageBox.Show("1 Veuillez renommer avec seulement le nom du logiciel")
                        Exit Select
                    ElseIf nomfichier.IndexOf("SETUP") Then
                        MessageBox.Show("2 Veuillez renommer avec seulement le nom du logiciel")
                        Exit Select
                    ElseIf nomfichier = Nothing Then
                        MessageBox.Show("3 Veuillez saisir un nom")
                        Exit Select
                    End If
            End Select
            If File.Exists(Destination & nomfichier) Then
                MessageBox.Show("Un fichier du même nom existe déjà!", "Copie fichier")
                Exit Sub
            End If
            tView_Temporaire.Nodes.Clear() 'on vide le treeview avant de la réinitialiser
                                           'cela évite une répétition du treeview et des dossiers aussi.
            resettemporaire() 'méthode pour réinitialiser le treeview à chaque copie.
        Catch erreur As Exception
            MessageBox.Show("Copie échouée. " & erreur.GetBaseException.Message)
        End Try
    End Sub


Seulement voilà, lorsque je sélectionne le fichier 7zip.exe par exemple, il ne passe pas dans le Case qui lui est attribué, mais il va directement dans cette partie là:
Case Else
    If nomfichier.IndexOf("Setup") Then
       MessageBox.Show("1 Veuillez renommer avec seulement le nom du logiciel")
       Exit Select


Est-ce que quelqu'un peut m'aider à comprendre? J'ai commencé le VB.Net il y a un mois, donc pas vraiment experte.

J'ai essayé de mettre Select Case nomfichier.Text mais VisualStudio me renvoi que 'Text' n'est pas un membre de 'String'... Logique.

Merci d'avance.

15 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,
Tu as bien entendu voulu voir en mode arrêt le contenu exact de ta variable string nomfichier.
Est-il bien "7zip.exe" très exactement (espaces, casse, etc ...) ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
17 avril 2017
2
Bonjour,

Comme le dit ucfoutu attention à la dénomination exacte du fichier !

Commences déjà par mettre en minuscule les noms et retirer les espaces avant la sélection :

nomfichier = LCase$(nomfichier)
nomfichier = Replace$(nomfichier, " ", "")

Cheyenne

Bonjour,

Commence par mettre un espion (le bouton en paire de lunettes (verres correcteurs) sur nomfichier et cheminfichier.

Ensuite, mets un point d'arrêt (F9) sur cheminfichier. Une fois le programme arrêté sur cette ligne-là; passe au pas-à-pas (F8 - VB 2010 et avant, F11 - VB 2012) et surveille les valeurs de tes 2 variables espionnées, dans la fenêtre "espions". Cela devrait donner les premières indications sur où et quoi chercher.


Si jamais tu vois des "/" au lieu des "" dans CheminFichier, tu peux, au choix, changer le "PathSeparator" du Treeview, ou la barre dans to mid().

Si jamais, c'est le nom de fichier, trop court ou trop long, tu vas devoir jouer avec tes indices.

Sinon, je suis en panne d'idées.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Vérifie le nombre de caractères contenus dans ta variable 'nomfichier'.
Il est possible qu'un caractère 'non imprimable' se soit glissé.
Par acquit de conscience, crée une boucle For-Next pour lister les codes ASCII de chaque caractères de ta variable et compare avec celles de ton texte "7zip.exe"

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Oui, j'ai vérifié auparavant si la variable nomfichier contenait quelque chose avec des MsgBox, et le contenu est très exactement "7zip.exe". C'est pour ça que je ne comprend pas vraiment.

Et à l'instant, j'ai tenté de rajouter 'Call' devant CopyFile comme ceci:
Select Case nomfichier
                Case "7zip.exe"
                    Call FileCopy(cheminfichier, Destination & nomfichier)

Je l'ai enlevé ensuite. Et là, retournement de situation:
le fichier se copie bien. Et il passe ensuite dedans:
If File.Exists(Destination & nomfichier) Then
                MessageBox.Show("Un fichier du même nom existe déjà!", "Copie fichier")
                Exit Sub

Et pour les fichiers qui ne sont pas compris dans la liste des Cases, il passe uniquement là dedans, comme je le souhaite:
Case Else
    If nomfichier.IndexOf("Setup") Then
       MessageBox.Show("1 Veuillez renommer avec seulement le nom du logiciel")
       Exit Select


Je ne comprend pas ce retournement de situation...

Bonjour,

Désolé pour le doublon. Quand j'ai commencé à répondre, il n'y avait pas de réponse. Une fois ma réponse envoyée, c'était la troisième réponse.

Bonjour,

Quand tu examines une valeur dans la fenêtre "espions", tu peux faire un clic-droit sur la valeur, puis un clic sur la loupe. Il va t'afficher la valeur de la variable entre guillemets. Si les guillemets ne sont pas "collés" au texte; tu as une espace parasite.
D'accord. Merci à vous tous pour vos réponses. Je vais appliquer ce qui m'a été conseillé, et je reviens vers vous pour les résultats.
Bon bah voilà, c'est résolu

J'avais pas pensé à utiliser l'espion. Mes variables prenaient bien en compte ce que je voulais stocker dedans:
il n'y avait ni de slash, ni de caractère non imprimable, mais uniquement le nom exactement du fichier, et le chemin était exactement également...
Il a juste fallut que je modifie un peu le code pour que tout soit dans l'ordre comme ceci:

'TRAITEMENT DE COPIE DE FICHIER APRES LA SELECTION D'UN FICHIER. 
#Region "Copie des fichiers"
    Private Sub tView_Serveur_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tView_Serveur.AfterSelect
        cheminfichier = tView_Serveur.SelectedNode.FullPath
        MsgBox(cheminfichier)
        nomfichier = Mid(cheminfichier, InStrRev(cheminfichier, "") + 1) 'on extrait le dernier nom de la chaine
        MsgBox(nomfichier)
        'nomfichier = tView_Serveur.SelectedNode.ToString
        'nomfichier = cheminfichier.Replace("TreeNode: ", "") 'supprime TreeNode:
        Try
            Select Case nomfichier
                Case "7zip.exe"
                    VerifCopie()
                Case "acrobatreader.exe"
                    VerifCopie()
                Case "adobereader.exe"
                    VerifCopie()
                Case "audacity.exe"
                    VerifCopie()
                Case "cart’ooo.exe"
                    VerifCopie()
                Case "cdburner.exe"
                    VerifCopie()
                Case "chrome.exe"
                    VerifCopie()
                Case "defrag.exe"
                    VerifCopie()
                Case "esetnod32.exe"
                    VerifCopie()
                Case "firefox.exe"
                    VerifCopie()
                Case "flashplayer.exe"
                    VerifCopie()
                Case "framework4.exe"
                    VerifCopie()
                Case "glaryutilities.exe"
                    VerifCopie()
                Case "itune.exe"
                    VerifCopie()
( la liste est longue... )
                Case Else ( partie à revoir également )
                    If nomfichier.IndexOf("Setup") Then
                        MessageBox.Show("1 Veuillez renommer avec seulement le nom du logiciel")
                    ElseIf nomfichier.IndexOf("setup") Then
                        MessageBox.Show("2 Veuillez renommer avec seulement le nom du logiciel")
                    ElseIf nomfichier.IndexOf("SETUP") Then
                        MessageBox.Show("3 Veuillez renommer avec seulement le nom du logiciel")
                    ElseIf nomfichier = Nothing Then
                        MessageBox.Show("Veuillez saisir un nom")
                    ElseIf nomfichier.Equals(nomfichiertext.ToUpper()) Then
                        MessageBox.Show("Veuillez renommer sans majuscule")
                    ElseIf Nothing Then
                        MessageBox.Show("Veuillez saisir un nom")
                    End If
            End Select
        Catch erreur As Exception
            MessageBox.Show("Copie échouée. " & erreur.GetBaseException.Message)
        End Try
    End Sub

    Private Sub VerifCopie()
        If File.Exists(Destination & nomfichier) Then
            MessageBox.Show("Un fichier du même nom existe déjà!", "Copie fichier")
            Exit Sub
        Else
            FileCopy(cheminfichier, Destination & nomfichier)
            
            'TIMER LABEL    
            Me.lab_CopyEffectue.Visible = True
            Me.Timer_LabCopie.Enabled = True

            tView_Temporaire.Nodes.Clear() 'on vide le treeview avant de la réinitialiser
            'cela évite une répétition du treeview et des dossiers aussi.
            resettemporaire() 'méthode pour réinitialiser la treeview à chaque copie.
        End If
    End Sub
#End Region


Pour résumer, je n'ai toujours pas compris pourquoi le faite d'avoir mis Call devant mon CopyFile et de l'enlever ensuite à permis au code de rentrer dans mon Select Case...
Mais conclusion, ça marche maintenant!

Merci bien de m'avoir indiqué la marche à suivre
Et bonne journée à vous tous.

See you
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Je fait d'avoir utilisé la notation Call puis de l'avoir supprimée n'y est définitivement pour rien !
Il est par contre vraisemblable que, lorsque tu as rencontré le problème, tu n'avais pas cliqué sur un fichier dans ta treeview, mais sur un dossier (un clic, donc, sur un noeud non adéquat) et que, par conséquent le fullpath ne te retournait qu'un chemin de dossier, et donc aucun des noms prévus par ton select case ===>> et donc ===>> entrée dans le case else.
C'est la seule explication raisonnable.
Si tu n'ajoutes aucun garde-fou, les utilisateurs de ton appli risquent de commettre la même erreur de clic et donc de tomber dans la même erreur que celle que tu as rencontrée précédemment.
Voilà.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ

Bonsoir,

Je lis ceci :
( la liste est longue... )

J'en conclus qu'un 'select case' n'est pas du tout approprié dans ton code.

Utilise plutôt une list(of dans laquelle tu placeras tous tes noms de fichiers possibles.

Interroge ensuite cette liste à l'aide de la fonction Contains ou StartsWith.
if nomspossibles.Contains(nomfichier) then
    '...
ucfoutu:
tu n'avais pas cliqué sur un fichier dans ta treeview, mais sur un dossier
C'est probable que lorsque je cliquais sur un fichier, il ne le prenait pas en compte, en ne comptait que le chemin oui. Car c'est difficile de se tromper et de confondre dossier et fichiers dans ma Treeview: Je l'ai pointé que sur un seul et unique dossier, et l'ai déplié ensuite (Me.tView_Serveur.ExpandAll())


banana32:
Je vais voir pour ta méthode (que je ne connais pas d'ailleurs...).


Merci
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
C'est probable que lorsque je cliquais sur un fichier, il ne le prenait pas en compte, en ne comptait que le chemin oui. Car c'est difficile de se tromper et de confondre dossier et fichiers dans ma Treeview: Je l'ai pointé que sur un seul et unique dossier, et l'ai déplié ensuite (Me.tView_Serveur.ExpandAll())

Ouais ...
Il est pourtant très facile (et cela ne mange pas de pain) d'installer les garde-fou qui mettent à l'abri de mauvais gestes, d'étourderies, etc ...
Regarde donc ces deux liens vers MSDN :
Tapez le texte de l'url ici.
Tapez le texte de l'url ici.
Et je ne connais rien de VB.Net, mais ne serais absolument pas étonné de ce qu'il t'offre du plus direct encore !
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Ca revient au File.Exist je suppose: MSDN FileExist Méthode
C'est dans mes projets d'intégrer des Files.Exists et des Directory.Exist
(Exists: Important lorsqu’on va effectuer des manipulations! Vérifie la présence du fichier ou du dossier, renvoie un Booléan, True présence, False non présent.
File.Exists(Fichier as string), Directory.Exists(Path As String).



Cependant, j'essaye d'intégrer la méthode de list(of, mais n'ayant jamais été très douée avec les tableaux et ce malgré les tutos sur internet, je rencontre un problème:
Imports System.Collections
Imports System.Collections.Generic

'Déclaration
Dim listNomFichier As List(Of String) = New List(Of String)
        listNomFichier.Add("7zip.exe")
        listNomFichier.Add("acrobatreader.exe")
        ...


Et l'erreur est la suivante:
Déclaration attendue sur les listNomFichier.Add


C'est gentil de prendre votre temps pour apporter votre aide.
Problème résolu: Déclaration de la liste à l'intérieur de Private Sub Form_Principale_Load.