vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Ordner Synchronisieren mit Fortschritt (Progressbar) 
Autor: dj alex z
Datum: 14.12.12 07:45

Guten Morgen zusammen,

habe schon ehr viel durch dieses Forum gelernt und schau immer mal wieder gerne rein.
Jetzt habe ich jedoch selber ein Problem wo ich auch leider über die Suche nichts finde.

Auf der Suche nach einem "Anfang" für mein Programm, bin ich auf folgende Seite gestoßen:

http://www.vbarchiv.net/tipps/details.php?id=2131

Ich möchte mit meinem Programm einfach zwei Ordner miteinander Synchron halten.

Der oben genannte Tipp funktioniert auch tadellos und das ist genau das Richtige für mein Programm...
So weit so gut...

Jetzt möchte ich allerdings eine Progress bar einbauen die den Gesamtfortschritt mitteilt.

Bsp. der Ordner zum synchronisieren hat 3GB.
Dann möchte ich in der Progress bar den Gesamtfortschritt der Aktion und eventuell auch noch in einem Label die verbleibende Zeit anzeigen lassen.

Habe den o.g. Tipp auch schon mit einem Backgroundworker ausgestattet, damit die Form nicht einfriert.

Leider ist mir das mit der Progress bar zu hoch...

Hoffe ihr könnt mir helfen..

Vielen Dank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ordner Synchronisieren mit Fortschritt (Progressbar) 
Autor: Manfred X
Datum: 14.12.12 21:40

Hallo!

Du mußt vor dem Kopiervorgang zunächst feststellen, wie viele
Bytes insgesamt die Dateien umfassen, die zu sichern sind (FileInfo).
Vermutlich ist das nur ein geringer Bruchteil der 3 Gigabyte.
Daraus ergibt sich die einzurichtende Obergrenze der Progressbar.

Mir ist nicht klar, was Dir dabei Schwierigkeiten macht.
http://www.vbarchiv.net/forum/id22_i88775t88770_kopieren-mit-progressbar.html

MfG
Manfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ordner Synchronisieren mit Fortschritt (Progressbar) 
Autor: dj alex z
Datum: 14.12.12 22:03

Vielen Dank für die Antwort.
Es bereitet mir Probleme, weil ich ja damit nur den Kopiervorgang Abfrage.
Der o. G. Tipp besteht aber ja aus kopieren, löschen, vergleichen usw.

Das ist mir im Moment etwas zu hoch...

Wenn sich jetzt 1, 5 gb von den 3gb geändert haben, dann soll der Benutzer einfach nur gezeigt begonnen bekommen, wie lange der gesamte Vorgang noch dauert...
Mfg

Nochmals Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Kopieren ..... Teil 1 
Autor: Manfred X
Datum: 15.12.12 07:26

Schau Dir das mal an .....

Eine genaue Bestimung der Dauer eines
Kopiervorgangs ist nicht möglich.
Man kann nur eine Abschätzung machen: aus
dem benötigten Zeitbedarf für die bereits
kopierten Bytes.

Der Beispielcode besteht aus zwei Teilen,
die beide zusammen in ein WinForms-Formular einzutragen
sind.

Teil 1 .....

Imports System.IO
Public Class frmBackup
 
    Dim w As Integer = 380
 
    Dim WithEvents btnSource As New Button With _
        {.Parent = Me, .Text = "Quelle", .Width = w}
 
    Dim WithEvents btnDest As New Button With _
        {.Parent = Me, .Text = "Ziel", .Width = w, .Top = 50}
 
    Dim WithEvents btnAction As New Button With _
        {.Parent = Me, .Text = "Sichern", .Top = 100, .Left = 150}
 
    Dim prg As New ProgressBar With _
        {.Parent = Me, .Top = 150, .Width = w, .Minimum = 0}
 
    Dim lblInfo As New Label With _
    {.Parent = Me, .Width = w, .Top = 200, .Text = ""}
 
    Dim lblTime As New Label With _
        {.Parent = Me, .Width = w, .Top = 250}
 
    Dim fbd As New FolderBrowserDialog
 
    'Variable für den Info-Delegaten
    Dim progress_value, progress_maximum As Integer
    Dim bedarf_alt As Long
    Dim infotext As String, headline As String
 
    'Info-Delegat
    Dim SetinfoDelegate As New MethodInvoker(AddressOf SetInfo)
 
 
    Private Sub frmBackup_Load(sender As Object, _
                               e As EventArgs) Handles MyBase.Load
        Me.Size = New Size(400, 300)
        Me.FormBorderStyle = FormBorderStyle.FixedSingle
 
    End Sub
 
 
    Private Sub btnSource_Click(sender As Object, _
                e As EventArgs) Handles btnSource.Click
        With fbd
            .Description = "zu sichernder Ordner"
            .ShowNewFolderButton = False
            If .ShowDialog = DialogResult.Cancel Then Exit Sub
            btnSource.Text = .SelectedPath
        End With
    End Sub
 
 
    Private Sub btnDest_Click(sender As Object, _
                e As EventArgs) Handles btnDest.Click
        With fbd
            .Description = "Backup-Ordner"
            .ShowNewFolderButton = True
            If .ShowDialog = DialogResult.Cancel Then Exit Sub
            btnDest.Text = .SelectedPath
        End With
    End Sub
 
 
    Private Sub btnAction_Click(sender As Object, _
            e As EventArgs) Handles btnAction.Click
        'Thread für den Kopiervorgang erstellen und starten
        Dim copythread As New Threading.Thread(AddressOf SaveFiles)
        copythread.Start()
    End Sub
 
 
    Private Sub SetInfo()
        'Benutzeroberfläche während des Kopierens 
        'per Invoke aktualisieren
 
        prg.Maximum = progress_maximum
        prg.Value = progress_value
        lblTime.Text = infotext
        lblInfo.Text = headline
        Me.Invalidate()
    End Sub
 
    '... ab hier Teil 2 einfügen


Beitrag wurde zuletzt am 15.12.12 um 07:28:38 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Kopieren .... Teil 2 
Autor: Manfred X
Datum: 15.12.12 07:27

    Public Sub SaveFiles()
 
        'Kopier-Routine
 
        Dim sourcefile As FileInfo, filename As String
        If Not Directory.Exists(btnSource.Text) Then Exit Sub
        If Not Directory.Exists(btnDest.Text) Then Exit Sub
        If btnSource.Text.ToUpper = btnDest.Text.ToUpper Then Exit Sub
 
        headline = "" : infotext = "" : progress_value = 0
        bedarf_alt = Long.MaxValue
        Me.Invoke(SetinfoDelegate)
 
        Dim destfileinfos As List(Of FileInfo) =
            New DirectoryInfo(btnDest.Text).GetFiles.ToList
 
        'Liste der zu kopierenden Files erstellen
        Dim tocopy As New List(Of FileInfo), found As Boolean
        Dim bytestocopy As Long = 0
        infotext = "Files werden ermittelt"
        Me.Invoke(SetinfoDelegate)
        For Each sourcefile In New DirectoryInfo(btnSource.Text).GetFiles
            found = False
            filename = sourcefile.Name.ToUpper
            For i As Integer = 0 To destfileinfos.Count - 1
                If destfileinfos(i).Name.ToUpper = filename Then
                    If destfileinfos(i).LastWriteTime < _
                        sourcefile.LastWriteTime Then
                        bytestocopy += sourcefile.Length
                        tocopy.Add(sourcefile)
                        Exit For
                    End If
                    found = True
                End If
            Next i
            If Not found Then
                tocopy.Add(sourcefile)
                bytestocopy += sourcefile.Length 'zu kopierende Bytes
            End If
        Next sourcefile
 
        infotext = ""
        headline = "Zu sichernde Dateien: " & CStr(tocopy.Count)
        Me.Invoke(SetinfoDelegate)
        If tocopy.Count = 0 Then Exit Sub
 
        progress_maximum = CInt(bytestocopy / 1000)
        infotext = "Kopiervorgang gestartet"
        Me.Invoke(SetinfoDelegate)
 
        Dim start As Date = Now, bedarf As Long
 
        For i As Integer = 0 To tocopy.Count - 1
 
            Using fsDest As New IO.FileStream _
            (IO.Path.Combine(btnDest.Text, tocopy(i).Name), _
            IO.FileMode.OpenOrCreate, IO.FileAccess.Write), _
            fsSource As New IO.FileStream _
            (tocopy(i).FullName, IO.FileMode.Open)
 
                Dim buffersize As Int32 = 1024 * 30 ' (30 KByte)
                Dim buffer(buffersize) As Byte
                Dim readbyte As Int32
 
                While fsSource.Position < fsSource.Length
                    readbyte = fsSource.Read(buffer, 0, buffersize)
                    fsDest.Write(buffer, 0, readbyte)
 
                    progress_value = Math.Min(progress_maximum, _
                        progress_value + CInt(readbyte / 1000))
 
                    'Abschätzung des verbleibenden Zeitbedarfs   
                    bedarf = CLng((Now.Ticks - start.Ticks) / _
                    progress_value * (bytestocopy \ 1000 - progress_value))
 
                    If bedarf < bedarf_alt Then
                        infotext = "restlicher Zeit-Bedarf: " & _
                        New TimeSpan(bedarf).ToString("hh\:mm\:ss")
                        bedarf_alt = bedarf
                        Me.Invoke(SetinfoDelegate)
                    End If
 
                End While
            End Using
 
            headline = "Noch zu sichernde Dateien: " & _
                        CStr(tocopy.Count - i - 1)
            Me.Invoke(SetinfoDelegate)
        Next i
 
        progress_value = 0
        infotext = "BackUp beendet"
        Me.Invoke(SetinfoDelegate)
    End Sub
 
End Class


Beitrag wurde zuletzt am 15.12.12 um 07:30:53 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel