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
A voir également:
[VB] Selection et suppression d'objet dans une liste, calcul de taille de fichie
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
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.
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.