[VB] Selection et suppression d'objet dans une liste, calcul de taille de fichie [Résolu]

Ezreal - 22 janv. 2013 à 16:50 - Dernière réponse :  Ezreal
- 24 janv. 2013 à 09:13
Bonjour à tous,

Je suis débutant en VB et je souhaiterais faire un petit programme permettant de copier des fichiers vers un autre répertoire, l’intérêt est moindre mais devrais me permettre d'apprendre quelques notions.

Je bloque sur deux problèmes :

1. J'ai une listbox qui m'affiche le chemin\NomFichier d'un ou plusieurs fichiers préalablement sélectionnez dans un OpenFileDialog et une seconde listbox qui ne m'affiche que les noms de fichiers + la taille (en octects, ko, mo etc)
J'ai un bouton qui me permet, en sélectionnant un ou plusieurs fichiers de la première listbox, de les supprimer dans cette première listbox et qui devrais supprimer les lignes correspondante dans la seconde listbox.

Le problème est que dans la seconde listbox, uniquement le dernier fichier ajouté n'est supprimé. Je dois avoir un problème dans une variable qui ne récupère pas le bon nom de fichier ou autre, mais je n'arrive pas à mettre le doigt dessus ...

2. Un label sous la seconde listbox me permet d'afficher/calculer la taille totale (en octect pour l'instant) des fichiers présents dans les listbox. Lorsque j'ajoute des fichiers via OpenFileDialog le calcul s’effectue correctement mais lorsque je souhaite ajouter de nouveaux fichiers à cette liste avec OpenFileDialog le calcul ne sera effectué uniquement sur ces nouveaux fichiers.

Cela fait des heures que je tourne en rond et ne vois pas d'issues


Merci d'avance pour votre aide, une petite indication pour me remettre sur la voie serai bienvenue !



Voici le code (Attention ça risque de faire peur, je débute !) :

Imports System.Math
Public Class filearchiver

    Public dlg_Open As OpenFileDialog, dlg_Destination As New FolderBrowserDialog, Path As String, FileNames As String, Taille As String, TB, File, OctetsToKoMoGo

    Private Sub btn_ajouter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_ajouter.Click
        Dim Addition As Integer = 0
        'Bouton Ajouter
        'Propriétés de OpenFileDialog : dlg_Open
        dlg_Open = New OpenFileDialog()
        dlg_Open.InitialDirectory = "C:"
        dlg_Open.Title = "Selection du fichier à archiver"
        dlg_Open.Filter = "Tous|*.*|Images|*.bmp;*.gif;*.jpg;*.png|PDF|*.pdf|Texte|*.txt|Excel|*.xls;*.xlsx|Word|*.doc;*.docx"
        dlg_Open.DefaultExt = "Tous"
        dlg_Open.AddExtension = True
        dlg_Open.CheckFileExists = False
        dlg_Open.Multiselect = True
        dlg_Open.ShowDialog()

        'Ajoute le chemin des fichiers sélectionnez dans la ListBox : lb_files
        'Ajoute le nom du fichier et sa taille dans la ListBox : lb_taille
        For Each Me.FileNames In dlg_Open.FileNames
            lb_files.Items.Add(FileNames)
            Taille = FileLen(FileNames)
            KoMoGo()
            Dim File As String = System.IO.Path.GetFileName(FileNames)
            lb_taille.Items.Add(File & " " & OctetsToKoMoGo)

            'Ajout de la taille totale des fichiers sélectionné dans le label : lbl_total
            ' !!!!!! Option a corriger, ne prend pas en compte l'ajout de nouveaux fichiers !!!!!!
            Addition += Taille
            lbl_total.Text = Addition
        Next


    End Sub

    Private Sub btn_supp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_supp.Click
        'Bouton Supprimer
        'Supprime de la ListBox lb_files le ou les fichiers sélectionnés
        If Not Me.lb_files.SelectedItem Is Nothing Then
            For Each Items In lb_files.SelectedItem
                KoMoGo()
                Me.lb_files.Items.Remove(Me.lb_files.SelectedItem)
                ' Supprime de la ListBox lb_taille le ou les fichiers sélectionnés
                ' !!!!!! Option a corriger, ne supprime que le dernier fichier ajouté !!!!!
                Dim File As String = System.IO.Path.GetFileName(FileNames)
                Me.lb_taille.Items.Remove(File & " " & OctetsToKoMoGo)
            Next
        Else
            MsgBox("Selectionnez au moins un fichier à supprimer")
        End If
    End Sub

    Private Sub btn_destination_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_destination.Click
        'Bouton Destination
        'Permet de sélectionner le répertoire de destination ou seront archivé/sauvegardé les fichiers sélectionnez plus haut
        tb_destination.Text = ""
        dlg_Destination.RootFolder = Environment.SpecialFolder.Desktop
        dlg_Destination.ShowDialog()
        'Ajoute le chemin de destination dans la TextBox tb_destination
        tb_destination.AppendText(dlg_Destination.SelectedPath)
        Path = dlg_Destination.SelectedPath
    End Sub

    Private Sub btn_archiver_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_archiver.Click

        If Not Me.FileNames Is Nothing Then
            'Si au moins un fichier est sélectionné
            If Not Me.Path Is Nothing Then
                'Si un répertoire de destination est indiqué
                For Each Me.FileNames In lb_files.Items
                    Dim File As String = System.IO.Path.GetFileName(FileNames)
                    'Pour chaque FileNames sélectionnés dans dlg_Open, on va retirer le chemin et ne garder que le nom et l'extension du fichier
                    'Copie le fichier avec son chemin vers le chemin sélectionné dans dlg_Destination \ "Nom du fichier" - sans le chemin
                    If System.IO.File.Exists(Path & "" & File) Then
                        'Si le fichier existe déjà dans le répertoire d'archivage, passe au fichier suivant
                        MsgBox("Le fichier " & File & " existe déjà.")
                        On Error Resume Next
                    Else
                        'Si le fichier n'est pas encore présent dans le répertoire d'archivage, procède à la copie
                        System.IO.File.Copy(FileNames, Path & "" & File)
                    End If
                Next

            MsgBox("Archivage terminé.")

        Else
            'Si aucun répertoire de destination n'est sélectionné, affiche ce message
            MsgBox("Merci de sélectionner un répertoire de destination.")
        End If
        Else
        'Si aucune fichier n'est sélectionné, affiche ce message
        MsgBox("Merci de sélectionner au moins un fichier à archiver.")
        End If

    End Sub

    Sub KoMoGo()
        'Fonction permettant de convertir la taille des fichiers (octets) en Ko, Mo ou Go
        If Taille < 1024 Then ' - d'1 Ko
            OctetsToKoMoGo = Taille & " Octets"

        ElseIf Taille >= 1024 And Taille < 1048576 Then ' Entre 1 Ko et 1023Ko
            OctetsToKoMoGo = Round((Taille / 1024), 2) & " Ko"

        ElseIf Taille >= 1048576 And Taille < 1073741824 Then 'Entre 1 Mo et 1023 Mo
            OctetsToKoMoGo = Round((Taille / 1048576), 2) & " Mo"

        ElseIf Taille >= 1073741824 And Taille < 1099511627776 Then 'Entre 1 Go et 1023 Go
            OctetsToKoMoGo = Round((Taille / 1073741824), 2) & " Go"
        End If
    End Sub
End Class




Et voila à quoi ressemble le Form
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Utilisateur anonyme - 22 janv. 2013 à 18:06
3
Merci
Bonjour,

Oups!!!! Le formatage m'a joué un tour. Voici donc, tes nouvelles lignes de code:

Addition = cdbl(textbox1.text) + Taille
lbl_total.Text = Addition 
textbox1.text = Addition

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
Utilisateur anonyme - 23 janv. 2013 à 17:24
3
Merci
Il me reste encore le problème de la suppression des objets dans la seconde ListBox à régler.

Avant d'utiliser remove sur cette ligne :
Me.lb_files.Items.Remove(Me.lb_files.SelectedItem)

Utilise lb_files.selectedIndex pour connaître la position de l'élément à supprimer.
Dim position_blabla as integer = lb_files.selectedIndex

Il te suffit alors de suppprimer cet élément dans ta deuxième listbox :
lb_autrelistbox.Items.RemoveAt(position_blabla)

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 125 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 22 janv. 2013 à 17:36
0
Merci
Catégorie modifiée VB6 -> .Net
Commenter la réponse de cs_Jack
Utilisateur anonyme - 22 janv. 2013 à 18:00
0
Merci
Bonjour,

Premièrement, ta question est dans la mauvaise section. Tu aurais dû choisir la section Vb.net ou VB2005 etc.

Deuxièmement, le règlement dit une seule question par sujet, ceci pour faciliter la "gestion des réponses"

2. Un label sous la seconde listbox me permet d'afficher/calculer la taille totale (en octect pour l'instant) des fichiers présents dans les listbox. Lorsque j'ajoute des fichiers via OpenFileDialog le calcul s’effectue correctement mais lorsque je souhaite ajouter de nouveaux fichiers à cette liste avec OpenFileDialog le calcul ne sera effectué uniquement sur ces nouveaux fichiers.


C'est parce que cette ligne:

 Dim Addition As Integer = 0


Remet ton addition à zéro à chaque fois.

Donc, cette ligne

Addition += Taille


additionne 0 et la taille des nouveaux fichiers

Il y a quelques façons de s'en sortir, mais, pour l'instant, je te dirais d'essayer ceci.

1) Ajoute un TextBox à ta Form et mets la propriété visible à False. Comme cela il sera évidemment invisible, mais utilisable par le programme


À première vue, remplace ces lignes:

Addition += Taille
lbl_total.Text = Addition


Par

Addition = cdbl(textbox1.text) + Taille
lbl_total.Text = Addition

textbox1.text = Addition/code
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 22 janv. 2013 à 18:16
0
Merci
Bonsoir,

Pourquoi utiliser toutes ces listbox pour afficher les infos de tes fichiers ?
Utilise une seule ListView qui te permettras de visualiser les infos d'un seul coup d'oeuil.
Commenter la réponse de Utilisateur anonyme
0
Merci
Bonjour,

Tout d'abord je tiens à m'excuser des différentes bourdes commises sur la création du sujet.

Ensuite merci à vous,

cmarcotte :
La solution fonctionne parfaitement, merci beaucoup ! Il ne me reste plus qu'a pouvoir modifier les valeurs octets en ko,mo etc.

banana32 : Je n'y ai pas pensé car je n'ai pas encore eu l'occasion d'utiliser ListView. J'essayerais de l'utiliser une fois cette version terminée.

Il me reste encore le problème de la suppression des objets dans la seconde ListBox à régler.

Bonne journée.
Commenter la réponse de Ezreal
0
Merci
Bonjour,

C'est exactement ce qu'il me fallait ! Je n'ai pas pensé à faire de relation entre les deux ListBox et ne connaissait pas Index.
Merci beaocup banana32 !

Voici à quoi ressemble le code pour le bouton supprimer :
Private Sub btn_supp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_supp.Click
        'Bouton Supprimer
            If Not Me.lb_files.SelectedItem Is Nothing Then

            KoMoGo()
            Dim Position_index As Integer = lb_files.SelectedIndex
                If Position_index >= 0 Then
                    'Supprime de la ListBox lb_taille le ou les fichiers sélectionnés
                    lb_taille.Items.RemoveAt(Position_index)
                    'Supprime de la ListBox lb_files le ou les fichiers sélectionnés
                    Me.lb_files.Items.Remove(Me.lb_files.SelectedItem)
                Else
                    On Error Resume Next
                End If

        Else
                MsgBox("Selectionnez au moins un fichier à supprimer")
        End If

    End Sub


J'avais un problème d'index négatif -1 dans ma boucle For Each qui permettait de supprimer plusieurs fichiers en même temps de ma première ListBox, mais ce n'est pas grave je l'ai laissé en sélectione " One "

Grâce à vous j'ai pu considérablement avancé, je vous en remercie.

Je vais encore essayer de régler le problème du calcul de la taille total des fichiers qui ne changent pas lors de la suppression de fichiers.

Bonne journée !
Commenter la réponse de Ezreal

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.