Problème Rangement / déplacement d'un fichier

Résolu
GeoffreyJ09
Messages postés
11
Date d'inscription
dimanche 2 avril 2017
Statut
Membre
Dernière intervention
3 avril 2017
- 2 avril 2017 à 17:10
Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
- 3 avril 2017 à 22:10
Bonjour j'ai actuellement un petit problème dans mon code je vous explique,

je crée un petit logiciel afin de ranger facilement les fichiers de mes clients dans leur dossier respectif.

Voici à quoi sa ressemble :


Je choisis donc le client dans une "ComboBox"
Le fichier grâce au "OpenFileDialog"
Et je clique sur la section afin de déplacer/ranger le fichier.

Voici le code :


Imports System.IO

Public Class RangementFichier

Public Sub RangementFichier_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each directory As String In System.IO.Directory.GetDirectories("c:\Atelier\Clients\")
ComboBoxRC.Items.Add(System.IO.Path.GetFileName(directory))
Next
End Sub

Public Sub ButtonS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonS.Click
OpenFileDialog1.ShowDialog()
TextBoxLF.Text = OpenFileDialog1.FileName
End Sub

Public Sub ButtonDIGIT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDIGIT.Click
Dim Fichier As String
Fichier = ComboBoxRC.Text
If My.Computer.FileSystem.DirectoryExists("c:\Atelier\Clients\" & Fichier & "\") Then
My.Computer.FileSystem.MoveFile(OpenFileDialog1.FileName, "c:\Atelier\Clients\", Fichier, "Digit")
End
MessageBox.Show("Une erreur est survenue !")

End If
End Sub
End Class



Pas d'erreur au débogage seulement lorsque je clique sur le bouton "DIGIT" voici se qui se passe :



une solution ?

bien à vous -Geoffrey

2 réponses

Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
2 avril 2017 à 18:19
Bonjour

et bien chez moi ça ne compile pas.
Et pour cause, il n'existe pas de surcharge de MoveFile avec 4 string en paramètre.

Alors pourquoi ça compile chez toi. Certainement car tu ne suis pas la bonne pratique qui est d'activer Option Strict.


Donc tu as 2 bugs:
  • le premier est que le fichier source c'est
    c:\Atelier\Clients\" & Fichier
    et pas
    c:\Atelier\Clients\", Fichier
  • le deuxième c'est que "Digit" n'a pas de sens pour cette méthode, à savoir qu'en 3eme paramètre (une fois qu'on a corrigé le 1er bug) la méthode attends soir un booléen (True/False), soit un Microsoft.VisualBasic.FileIO.UIOption, (OnlyErrorDialogs/ AllDialogs), donc Digit veut certainement dire quelque chose pour toi, mais il faut que tu le transforme en quelque chose de compréhensible par la méthode.


Et là, en plus du bug, on tombe sur une nouvelle mauvaise pratique, l'utilisation du Namespace Microsoft.VisualBasic, donc d'instructions de VB6 dans VB.net. Dans 99,999% des cas ça marche, mais de temps en temps ça buggue, et là c'est une galère sans nom de trouver pourquoi.
L'idéal est de bannir toute utilisation de VB6 => supprimer la référence à Microsoft.VisualBasic dans les références de ton projet.
Le hic est qu'à chaque ligne ou tu t'es servi d'un code VB6, ça ne compilera plus et il faudra changer par le code VB.Net approprié.

Réflexe à prendre pour ton prochain projet, avant tout supprimer la référence, Option Strict On et tant qu'on y est Option Explicit On. Pour plus de détails, voir cet article.

1
GeoffreyJ09
Messages postés
11
Date d'inscription
dimanche 2 avril 2017
Statut
Membre
Dernière intervention
3 avril 2017

Modifié le 2 avril 2017 à 18:41
Avant tout merci de ta réponse.

D’ailleurs une erreur que j'ai fait mais se n'est qu'un détail c'est que c'est "client" au lieux de "fichier"
Soite:
        Dim Client As String
Client = ComboBoxRC.Text


Pour mon information personnelle dans se cas comment située un sous dossier ?

Car mon but est de déplacer le fichier dans le sous dossier du client choisis dans la ComBoBox.

Exemple si le client choisi est "TEST" et que je veut ranger un fichier qui concerne une "digit" le chemin d’accès serait: "c:\Atelier\Clients\TEST\Digit"
et ainsi de suite, si c'est un PDF :
"c:\Atelier\Clients\TEST\PDF"
0
Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
2 avril 2017 à 18:50
Si le dossier existe
"c:\Atelier\Clients\" & Client & "\Test"

S'il n'existe pas cette même chaine est à donner à Directory.CreateDirectory().

Au fait, pour déplacer, c'est File.Move en .Net qui sert aussi à renommer le fichier. C'est pareil d'un point de vue du pc, tu changes le chemin du fichier.
0
GeoffreyJ09
Messages postés
11
Date d'inscription
dimanche 2 avril 2017
Statut
Membre
Dernière intervention
3 avril 2017
> Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022

Modifié le 2 avril 2017 à 19:11
Voilà que maintenant pour x ou y raison mon code fonctionne,cependant sa me déplace belle et bien le fichier dans le dossier du client "TEST" sauf qu'a la place de le mettre dans le sous dossier "Digit" sa le met juste dans le dossier "TEST" et modifie son nom et son extension

voici un screen:
http://www.hostingpics.net/viewer.php?id=422568Capture.png

Merci de ton aide
-Geoffrey
0
Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596 > GeoffreyJ09
Messages postés
11
Date d'inscription
dimanche 2 avril 2017
Statut
Membre
Dernière intervention
3 avril 2017

2 avril 2017 à 19:32
Il faut ton code actuel pour se faire une idée
0
GeoffreyJ09
Messages postés
11
Date d'inscription
dimanche 2 avril 2017
Statut
Membre
Dernière intervention
3 avril 2017

2 avril 2017 à 19:57
rien de changer sauf ton commentaire de 18h50

soite:
Imports System.IO

Public Class RangementFichier

Public Sub RangementFichier_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each directory As String In System.IO.Directory.GetDirectories("c:\Atelier\Clients\")
ComboBoxRC.Items.Add(System.IO.Path.GetFileName(directory))
Next
End Sub

Public Sub ButtonS_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonS.Click
OpenFileDialog1.ShowDialog()
TextBoxLF.Text = OpenFileDialog1.FileName
End Sub

Public Sub ButtonDIGIT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDIGIT.Click
Dim Client As String
Client = ComboBoxRC.Text
If My.Computer.FileSystem.DirectoryExists("c:\Atelier\Clients\" & Client & "\") Then
File.Move(OpenFileDialog1.FileName, "c:\Atelier\Clients\" & Client & "\digit")
End
MessageBox.Show("Une erreur est survenue !")

End If
End Sub
End Class
0
Whismeril
Messages postés
17333
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
18 mai 2022
596
Modifié le 3 avril 2017 à 22:20
Ben non c'est pas la fin du post.

Je ne t'ai pas montré comment factoriser.

Option 1 le cas général, un code pouvant être appelé de n'importe ou

tu écris une méthode prenant en paramètre les trucs qui changent, dans ton cas le répertoire

   Public Sub Deplacer(Repertoire as String)
        Dim cible as string = String.Format("c:\Atelier\Clients\{0}\{1}\{2}",ComboBoxRC.Text,Repertoire,Path.GetFileName(OpenFileDialog1.FileName))'je préfère string.Format à des concaténations en série
          
        If File.Exists(Path.GetDirectoryName(cible)) Then
            File.Move(OpenFileDialog1.FileName, cible)      
        End If
    End Sub


Et là tu n'as qu'à appeler cette méthode avec le bon paramètre
   Public Sub ButtonDIGIT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDIGIT.Click
        Deplacer("Dixit")
   End Sub


C'est déjà nettement plus simple à maintenir, et plus court à écrire.

Option2 abonner plusieurs éventements à la même méthodes.
Quand tu double cliques sur un bouton, Visual Studio crée la méthode Bidule_Click et lie cette méthode à l'évènement click du bouton en question. On dit que cette méthode est abonnée à l'évènement.
On peut abonner une seule méthode à plusieurs événement, à conditions qu'ils soient compatibles, il faut que les paramètres de la méthode abonnée soient les mêmes (même type, même nombre, même ordre), on dit que la signature de la méthode est identique.
Là y'a pas de question à se poser ce sont tous des événements Click, mais on voit que la signature est un Object suivi d'un EventArgs, et bien dans l'absolue l'événement MouseEnter a la même signature. Bon si tu geres le click et le mouseEnter dans la même méthode, tu vas t'arracher les cheveux pour savoir la raison qui t'y a amené. Mais dans l'absolue c'est possible.

Comment on fait?
  • En mode Design, tu double-cliques sur un premier bouton, puis pour le second, dans la fenêtre de propriétés, tu passes dans l'onglet événement, tu cliques dans la case vide de Click et tu choisis la méthode que tu viens de créer.
  • Par le code

 Private Sub MesClick(sender As Object, e As EventArgs) Handles Label1.Click, Button2.Click


Maintenant reste à savoir vers quel répertoire on va, donc quel bouton a été cliqué.
Le premier paramètre s'appelle sender => expéditeur, source de l'évènement.
Oui mais il est de type Object, pas bouton, (ou Label dans mon exemple au dessus).
C'est le principe de base de .Net, la programmation objet (pas orientée objet, objet tout court, voire tout objet), tout ce que tu utilises est un objet, et tous ces objets dérivent de Object.
Dans la vraie vie, tu peux classer un garçon, une femme et un vieillard dans Humain, ou une fraise, une pomme et une banane dans Fruit, puisque tout dérive de Objet, on peut tout "classer" dans Objet.
Et comme tu sais que de toute façon c'est un contrôle, et même dans ton cas un bouton et bien il suffit de caster sender en bouton (c'est une conversion)

Dim leBouton As Button = CType(sender, Button)
Deplacer(leBouton.Text)

Et voilà, plus qu'un seul abonnement.


Bon mais tu m'as demandé si on pouvait trouver le répertoire en fonction de l'extension et donc ne plus avoir qu'un seul bouton.
Il suffit donc d'extraire l'extension avec Path.GetExtension
Puis de faire soit des if else if en cascade, soit un Select Case

Select Case Path.GetExtension(OpenFileDialog1.FileName)
    Case ".txt"
       Dossier = "Texte"
   Case ".csv"
       Dossier = "CSV"
'etc
End Select


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0