Fortschrittsbalken für das kopieren einer Datei aus 'Meine.Ressourcen' VB.net
Ich versuche, kopieren Sie eine Datei aus 'Meine.Ressourcen " mit einem Fortschrittsbalken, habe ich die Suche auch über viele andere Fortschrittsanzeige beim kopieren von Dateien Skripte, aber keiner von Ihnen unterstützen das kopieren von der internen Dateien. hier ist mein code:
Private Sub Install_Click(sender As Object, e As System.EventArgs) Handles Install.Click
InstallDialog.ShowNewFolderButton = True
InstallDialog.ShowDialog()
If Not (IO.Directory.Exists(IO.Path.GetTempPath & "extract")) Then
IO.Directory.CreateDirectory(IO.Path.GetTempPath & "extract")
End If
If Not (InstallDialog.SelectedPath = "") Then
Dim exepath As String = IO.Path.GetTempPath & "extract\7zG.exe"
Dim archpath As String = IO.Path.GetTempPath & "extract\arch.7z"
If File.Exists(archpath) = False Then
Dim b As Byte() = My.Resources.arch
Dim TempFile As IO.FileStream = IO.File.Create(archpath)
TempFile.Write(b, 0, b.Length)'Copies the archive to disk
TempFile.Flush()
TempFile.Close()
End If
If File.Exists(exepath) = False Then
Dim c As Byte() = My.Resources.zipexe
Dim TempFile As IO.FileStream = IO.File.Create(exepath)
TempFile.Write(c, 0, c.Length)'Copies the 7-zip executable to disk
TempFile.Flush()
TempFile.Close()
End If
Dim p As New ProcessStartInfo
p.WindowStyle = ProcessWindowStyle.Normal
p.FileName = exepath
p.Arguments = " x " & archpath & " -mmt -aoa -o" & InstallDialog.SelectedPath
Dim Extract As Process = Process.Start(p)'runs 7-zip to extract the archive
Dim i As Boolean = True
Do While i = True
If Extract.HasExited = True Then
i = False
Else
Threading.Thread.Sleep(2000)
End If
Loop
Msgbox("Installation Complete")
End If
End Sub
meiner progress-bar wird als "copyprog',
'arch.7z' ist über 150Mb und das UI hängt, während es kopieren, meine Benutzer sind mit sehr langsamen Rechnern und wollen, haben einige andere Antwort als die app einfrieren auf den button klicken.
ein Grund, warum Ihre UI hängt: die Verwendung von
ich habe praktisch keine Erfahrung in der Durchzug, den Grund habe ich den thread.schlafen dort ist, denn ohne Sie wird es maxes meine CPU-Auslastung
Wollen Sie eine "genaue" feedback von whats going on (z.B. "dekomprimiert xx%") oder willst du einfach nur "einige" feedback (wie "kopieren ...", "entpacken ..." etc)?
Ich würde lieber etwas wie "nach x Anzahl der bytes, die kopiert wurden, aktualisieren Sie die Fortschritt-bar", sondern eine prozentuale Wert ist in Ordnung, ich brauche nur feedback für das kopieren Prozess 'Tempfile.schreib' für die Dekompression hat es 7-Reißverschlüssen auf der GUI
Verwenden Sie den Prozess.Exited-event statt. Man kann nicht den Fortschritt von einem externen Prozess.
thread.sleep
. Mit dieser auf dem UI-Thread ist fast nie ein godd Idee.ich habe praktisch keine Erfahrung in der Durchzug, den Grund habe ich den thread.schlafen dort ist, denn ohne Sie wird es maxes meine CPU-Auslastung
Wollen Sie eine "genaue" feedback von whats going on (z.B. "dekomprimiert xx%") oder willst du einfach nur "einige" feedback (wie "kopieren ...", "entpacken ..." etc)?
Ich würde lieber etwas wie "nach x Anzahl der bytes, die kopiert wurden, aktualisieren Sie die Fortschritt-bar", sondern eine prozentuale Wert ist in Ordnung, ich brauche nur feedback für das kopieren Prozess 'Tempfile.schreib' für die Dekompression hat es 7-Reißverschlüssen auf der GUI
Verwenden Sie den Prozess.Exited-event statt. Man kann nicht den Fortschritt von einem externen Prozess.
InformationsquelleAutor Connor Galea | 2012-12-18
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein Ansatz (von vielen) zu erreichen, was Sie wollen. Diese Vorgehensweise lässt die UI-allein, so dass es aktualisiert wird, in Ordnung. Ich schrieb den support für zwei Fortschrittsanzeigen, eine für den gesamten Fortschritt (Anzahl der Dateien) und eine für den aktuellen Fortschritt. Die code-Unterstützung Stornierung.
Verwenden und modifizieren, wie Sie wollen, es ist zur Verfügung gestellt.
Den code übernimmt, wie bereits erwähnt, zwei progress-bars auf dem Formular sowie zwei buttons (installieren und Abbrechen) - siehe Bild unten.
Nutzung
Fügen Sie einfach eine Aufgabe-Liste alle Ressourcen, die Sie kopieren möchten, starten Sie den cue.
Komplette code:
Update: Die folgende änderung läuft ein Prozess nach dem kopieren der Aufgaben abgeschlossen hat. Bei Bedarf ändern.
aber wie mache ich es starten Sie 7-zip aus, nachdem die Datei kopiert worden sind? in dem moment, wenn ich die 7-zip-Anleitung, um die 'copycompleted' sub, es läuft 7-zip zweimal
Sie können es innerhalb der if-else-block, in dem er sagt, abgeschlossen. Laufen wird es, nur einmal.
nvm, ich habe es funktioniert durch " wenn tasklist.count = 0'
Ich habe eine geänderte version, die einen Prozess startet nach dem kopieren abgeschlossen ist. Dieser kümmert sich dann um das Letzte bit (entpacken).
InformationsquelleAutor
Wenn Sie mit VS2012 und/oder das Async-feature, es ist mehr oder weniger einfach. Beachten Sie, dass wie üblich gibt es Dutzende von "guten" Lösungen zu Ihren problem gegeben!
Der wichtigste Vorteil: Es ist alles in einem sub, und der Fluss ist mehr oder weniger linear. Wenn Sie eine Bibliothek wie sevenzipsharp (oder jedem anderen, der passt), Sie gould sogar Fortschritte feedback auf Dekompression (glaube ich). wenn Sie wollen stick mit einer externen exe, könnten Sie versuchen, wenn Sie können, überprüfen Sie die filelength in einer Schleife zu bieten feedback auf die Dekompression.
InformationsquelleAutor igrimpe