Problème Rangement / déplacement d'un fichier [Résolu]

GeoffreyJ09 11 Messages postés dimanche 2 avril 2017Date d'inscription 3 avril 2017 Dernière intervention - 2 avril 2017 à 17:10 - Dernière réponse : Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention
- 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
Afficher la suite 
11Messages postés dimanche 2 avril 2017Date d'inscription 3 avril 2017 Dernière intervention

19 réponses

Répondre au sujet
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 2 avril 2017 à 18:19
+1
Utile
17
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.

Cette réponse vous a-t-elle aidé ?  
GeoffreyJ09 11 Messages postés dimanche 2 avril 2017Date d'inscription 3 avril 2017 Dernière intervention > Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 3 avril 2017 à 13:04
Eureka ! Tu as trouver ma solution :D

deux dernière petit question puis je ne t’embête plus, promis :D

1.) Pourquoi un petit cadenas se met sur les fichiers déplacer ?
http://www.hostingpics.net/viewer.php?id=322965Capture.png

2.) Penses-tu que je peut faire en sorte que dépendant son extension le fichier se met dans le bon sous dossier ?

Un grand merci !
-Geoffrey
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention > GeoffreyJ09 11 Messages postés dimanche 2 avril 2017Date d'inscription 3 avril 2017 Dernière intervention - 3 avril 2017 à 17:33
1) je ne sais pas

2) oui, d'ailleurs j'espère que tu n'as pas prévu de dupliquer ce code autant de fois que tu as de bouton sur ton formulaire?
GeoffreyJ09 11 Messages postés dimanche 2 avril 2017Date d'inscription 3 avril 2017 Dernière intervention > Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 3 avril 2017 à 17:36
1. Ok pas de souçis

2. Bha si,je modifie juste le chemin du sous dossier
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention > GeoffreyJ09 11 Messages postés dimanche 2 avril 2017Date d'inscription 3 avril 2017 Dernière intervention - 3 avril 2017 à 17:41
Là j'ai pas le temps de te montrer, mais l'idée est la suivante:
6 codes identiques (à une variable prêt) ont une erreur, ou un changement de spécification => 6 corrections.

Là c'est facile, tu vois tes 6 boutons sur ton formulaire, mais des fois les codes dupliqués sont bien enfuit et on rate une modif.

Donc part du principe que si un truc est écrit 2 fois, c'est mal codé.
GeoffreyJ09 11 Messages postés dimanche 2 avril 2017Date d'inscription 3 avril 2017 Dernière intervention > Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 3 avril 2017 à 17:53
Voici donc la fin de ce post !

Un grand merci pour ta patience et ton aide !

Ce poste es donc résolu grâce à toi !

Bonne soirée !

-Geoffrey
Commenter la réponse de Whismeril
Whismeril 10521 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - Modifié par Whismeril le 3/04/2017 à 22:20
0
Utile
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
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.