Copier un dossier tout en gardant la main ?

Signaler
Messages postés
19
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 mai 2016
-
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
-
Bonjour,

Je recherche à faire un programme (en VB, pas en .net) qui me copie un dossier. Cependant, lorsque je copie mon dossier, le programme perd la main... Cela est génant lorsqu'il contient des gros fichiers, car je peux rester 30 minutes sans pouvoir rien faire avec le prog.

Je voudrais donc pouvoir garder la main, afin de calculer le temps de copie restant.

Je pense pouvoir me débrouiller pour calculer le temps de copie, je voudrais juste savoir comment garder la main.

Voilà mon code pour la copie d'un fichier :


Dim fso As FileSystemObject
Set fso = New FileSystemObject
fso.CopyFolder (dossier.Text), (destination.Text), True
Set fso = Nothing


(il faut inclure la librairie Microsoft Scripting Runtime).



J'ai essayé de caser des DoEvents, cependant j'ai compris que DoEvents sert uniquement dans les boucles. Là avec mon code, le dossier se copie en une seul ligne, donc je ne vois pas comment faire...

Merci =)

7 réponses

Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Salut, pas bien bon la copie via les fonction (qu'elle soient natives ou non) et encore moins bon la dépendance vers les activeX en .Net, à éviter comme la pèste !

Je te poste une classe qui gère la copie (même avec progression via des événements), c'est un peu long pour si peu, mais bon je pense que cela ferra l'affaire

Imports System.Windows.Forms
Imports System.IO
'
Public Class DotNetCopy
    '
#Region "Public Events"
    '
    Public Event Start(ByVal sender As Object, ByVal e As System.EventArgs)
    '
    Public Event Terminate(ByVal sender As Object, ByVal e As System.EventArgs)
    '
    Public Event Progress(ByVal sender As Object, ByVal e As CopyFileProgressEventsArgs)
    '
    Public Event [Error](ByVal sender As Object, ByVal e As CopyFileErrorEventsArgs)
    '
#End Region
    '
#Region "Private Fields"
    '
    Private _BufferSize As Integer = 8192
    '
    Private _bCancel As Boolean
    '
#End Region
    '
#Region "Public Propertys"
    '
    Property BufferSize() As Integer
        Get
            Return _BufferSize
        End Get
        Set(ByVal value As Integer)
            _BufferSize = value
        End Set
    End Property
    '
#End Region
    '
#Region "Public Methods"
    '
    Public Sub Cancel()
        '
        _bCancel = True
        ''
    End Sub
    '
    Public Function CopyFile(ByVal Source As String, ByVal Dest As String, Optional ByVal Overwrite As Boolean = False) As Boolean
        '
        _bCancel = False
        '
        RaiseEvent Start(Me, New System.EventArgs)
        '
        If File.Exists(Dest) Then
            If Overwrite Then
                Try
                    '
                    File.Delete(Dest)
                    '
                Catch ex As Exception
                    '
                    RaiseEvent [Error](Me, New CopyFileErrorEventsArgs(ex))
                    Return False
                    '
                End Try
            Else
                '
                Return False
                '
            End If
        End If
        '
        Dim fs_Source As IO.FileStream = Nothing
        Dim fs_Cible As IO.FileStream = Nothing
        '
        Dim SR As BinaryReader = Nothing
        Dim SW As BinaryWriter = Nothing
        '
        Try
            '
            fs_Source = New FileStream(Source, FileMode.Open)
            fs_Cible = New FileStream(Dest, FileMode.Create)
            '
            Dim FileLenght As Long = fs_Source.Length
            '
            SR = New BinaryReader(fs_Source)
            SW = New BinaryWriter(fs_Cible)
            '
            Dim Buffer As Byte() SR.ReadBytes(BufferSize), BytesWriten As Long 0
            '
            While Buffer.Length > 0
                '
                SW.Write(Buffer)
                '
                BytesWriten += Buffer.Length
                Dim Prc As Integer = Math.Round((BytesWriten / FileLenght) * 100)
                RaiseEvent Progress(Me, New CopyFileProgressEventsArgs(Prc))
                '
                If _bCancel Then
                    '
                    _bCancel = False
                    '
                    SR.Close()
                    SW.Close()
                    '
                    Try
                        '
                        IO.File.Delete(Dest)
                        '
                    Catch ex As Exception
                        '
                    End Try
                    '
                    RaiseEvent Terminate(Me, New System.EventArgs)
                    Return False
                    '
                End If
                '
                Application.DoEvents()
                '
                Buffer = SR.ReadBytes(BufferSize)
                '
            End While
            '
            RaiseEvent Terminate(Me, New System.EventArgs)
            Return True
            '
        Catch ex As IOException
            '
            RaiseEvent [Error](Me, New CopyFileErrorEventsArgs(ex))
            Return False
            '
        Finally

            If fs_Cible IsNot Nothing AndAlso _
               fs_Cible.CanRead Then
                fs_Cible.Close()
                fs_Cible.Dispose()
            End If

            If fs_Source IsNot Nothing AndAlso _
               fs_Source.CanRead Then
                fs_Source.Close()
                fs_Source.Dispose()
            End If

        End Try
        ''
    End Function
    '
#End Region
    '
End Class
'
Public Class CopyFileErrorEventsArgs
    Inherits System.EventArgs
    '
#Region "Ctor"
    '
    Sub New()
        '
    End Sub
    Sub New(ByVal Err As Exception)
        '
        _Error = Err
        ''
    End Sub
    '
#End Region
    '
#Region "Private Fields"
    '
    Private _Error As Exception
    '
#End Region
    '
#Region "Public Propertys"
    '
    Property [Error]() As Exception
        Get
            Return _Error
        End Get
        Set(ByVal value As Exception)
            _Error = value
        End Set
    End Property
    '
#End Region
    '
End Class
'
Public Class CopyFileProgressEventsArgs
    Inherits System.EventArgs
    '
#Region "Ctor"
    '
    Sub New()

    End Sub
    Sub New(ByVal Progress As Integer)
        '
        _Progress = Progress
        ''
    End Sub
    '
#End Region
    '
#Region "Private Fields"
    '
    Private _Progress As Integer
    '
#End Region
    '
#Region "Public Propertys"
    '
    Property Progress() As Integer
        Get
            Return _Progress
        End Get
        Set(ByVal value As Integer)
            _Progress = value
        End Set
    End Property
    '
#End Region
    '
End Class


Voila @+

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Et pour t'en servir :

Private WithEvents DNCopy As New DotNetCopy
    '
    Sub Start(ByVal sender As Object, ByVal e As System.EventArgs) Handles DNCopy.Start
    End Sub
    '
    Sub Progress(ByVal sender As Object, ByVal e As CopyFileProgressEventsArgs) Handles DNCopy.Progress
        pg.Value = e.Progress
    End Sub
    '
    Sub [Error](ByVal sender As Object, ByVal e As CopyFileErrorEventsArgs) Handles DNCopy.Error
        MsgBox(e.Error.Message)
    End Sub
    '
    Sub Terminate(ByVal sender As Object, ByVal e As System.EventArgs) Handles DNCopy.Terminate
    End Sub
    '
    Private Sub cmd_cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_cancel.Click
        DNCopy.Cancel()
    End Sub
    '
    Private Sub btn_Copy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Copy.Click
        DNCopy.CopyFile("c:\test.mkv", "d:\test.mkv", True)
    End Sub


Testé sur gros fichier mkv (8Go+)

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
19
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 mai 2016

Merci de ta réponse !!

Hum disons que je débute... Lorsque je lance l'appli j'ai le message "incorrect à l'intérieur d'une procédure". Ca bloque sur la ligne 1... J'ai mis la première partie du code dans un module de classe...


Pour l'instant je me suis fait un truc un peu foireux : un prog A ouvre un fichier .ini qui contient le dossier à copier et le dossier de destination, et lance la copie aussitot. Ensuite il se ferme.

Mon prog B crée un fichier.ini, puis lance le prog A. Toute les secondes, il regarde la taille du dossier de destination, et fait le calcul en fonction de la taille du dossier source, pour savoir à combien de % on en est.

Un peu compliqué...
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
T'as du te planté quelque part, copie bien le premier code dans une classe, (en supprimant le code généré par vb), de 'Imports...' jusqu'a '...End Classe'.



Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Bonjour,

Si j'ai bien compris, tu recherches un code VB6 et celui que t'as donné Mayzz est en .NET, d'où l'erreur sur l'Import que VB6 ne connait pas.

Désolé de m'être immiscé dans votre conversation mais j'ai préféré rectifier le tir tout de suite.
Au passage si ce post avait été fait dans la bonne catégorie, cela ne serait pas arrivé.


Calade
Messages postés
19
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 mai 2016

Ahh je comprends mieux... Merci.

VB.NET et VB 2005 > Système > Fichier & Disque ==> ca me semble être la bonne catégorie enfin tant pis.

Merci
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Non pas de soucis Calade, merci du commentaire, effectivement il me semble que c'est bien ça !

Accueil > Forum > VB.NET et VB 2005 > Système > Fichier & Disque > Copier un dossier tout en gardant la main ?

sylvanox > Tu vois l'importance de poster dans la bonne catégorie maintenant ?

Cela évite aux personnes qui répondent de perdre leur temps , pour ta réponse en vb6 elle existe dans les sources, cherche 'copie avec progression'.

@+ Mayzz.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.