| |
VB.NET - Ein- und UmsteigerOrdner 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 | |
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 | |
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 | |
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. | |
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. | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|