Hallo zusammen,
nachdem ich mich jetzt mehrere Stunden durch Google und sämtliche MSDN, VB und sonstige Foren gekämpft habe, muß ich jetzt doch mal hier einen Thread eröffnen...
Folgende Anforderung:
- Ich möchte ein ZIP-File auf einen FTP-Server hochladen (funktioniert)
- Während dem Upload soll eine Form mit einer ProgressBar eingeblendet werden (funktioniert teilweise)
- Der Thread, der den Upload aufruft, darf erst mit der Abarbeitung fortfahren, wenn der Upload Completed ist (funktioniert nicht)
Zum Thema ProgressBar:
Meine Anwendung ist eine Windows Forms Anwendung, die beim Starten keine Form aufruft, sondern ein eine Prozedur in einem Modul.
In dieser Prozedur wird an einer Stelle dir Funktion FTP-Upload gerufen. Hier wird ein Verzeichnis auf dem FTP-Server erstellt (funktioniert) und dann in das Verzeichnis ein ZIP-File hochgeladen (funktioniert auch).
Vor dem Upload starte ich die Form frmUploadProgress.Show(), in der die ProgressBar pbUpload und ein Label lblUploadProgress enthalten ist.
1. Problem: Die Form wird angezeigt, aktualisiert sich aber nicht.
2. Problem: Um den Thread nicht zu blockieren bis der Upload completed ist, wird ja UploadFileAsync verwendet. Hat allerdings zur Folge, dass die Abarbeitung des Codes weiter läuft, auch wenn der Upload noch nicht beendet ist. Nach dem Upload wird jedoch eine Funktion gerufen, die das File löschen soll, welches hochgeladen wurde. Hier läuft die Application immer in einen Fehler, da der WebClient das File ja noch im Zugriff hat. Also muß ich sicherstellen, dass die Abarbeitung des Codes erst fortgeführt wird, wenn der Upload erfolgreich completed ist.
PublicFunction FTPUpload(ByVal Foldername AsString, ByVal File AsString) AsBoolean
Dim FTPCredentials AsNew Net.NetworkCredential("User", "Password")
Dim WC AsNew Net.WebClient
WC.Credentials = FTPCredentials
AddHandler WC.UploadProgressChanged, AddressOf UploadProgressChanged
AddHandler WC.UploadFileCompleted, AddressOf UploadFileCompleted
Dim FTPrequest As Net.FtpWebRequest = CType(Net.FtpWebRequest.Create(Foldername), Net.FtpWebRequest)
With FTPrequest
.UseBinary = True
.Credentials = FTPCredentials
.Method = Net.WebRequestMethods.Ftp.MakeDirectory
EndWith
Try
Using response As Net.FtpWebResponse = DirectCast(FTPrequest.GetResponse(), Net.FtpWebResponse)
Try
frmUploadProgress.Show()
WC.UploadFileAsync(address:= New Uri(Foldername & File), fileName:="C:\Temp\Versand\" & File)
FTPUpload = True
Catch ex As Exception
MsgBox( "#10013" & vbCrLf & "Der Versandordner konnte nicht hochgeladen werden!" & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Upload fehlgeschlagen")
FTPUpload = False
EndTry
EndUsing
Catch ex As Exception
EndTry
WC.Dispose()
EndFunction
PrivateSub UploadProgressChanged(ByVal sender AsObject, ByVal e As System.Net.UploadProgressChangedEventArgs)
If frmUploadProgress.pbUpload.InvokeRequired Then
frmUploadProgress.pbUpload.Invoke(
New System.Net.UploadProgressChangedEventHandler(AddressOf UploadProgressChanged), sender, e)
ExitSub
EndIf
frmUploadProgress.pbUpload.Value = e.ProgressPercentage
frmUploadProgress.lblUploadProgress.Text = e.BytesSent.ToString( "0,0") & "Byte(s) von " & e.TotalBytesToSend.ToString("0,0") & " Byte(s) hochgeladen (" & (e.BytesSent / e.TotalBytesToSend).ToString("P") & ")"
frmUploadProgress.Refresh()
EndSub
PrivateSub UploadFileCompleted(ByVal sender AsObject, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
frmUploadProgress.Hide()
EndSub
Ich hoffe, mir kann hier jemand weiter helfen.
Vielen Dank von meinem geschunden Hirn
nachdem ich mich jetzt mehrere Stunden durch Google und sämtliche MSDN, VB und sonstige Foren gekämpft habe, muß ich jetzt doch mal hier einen Thread eröffnen...
Folgende Anforderung:
- Ich möchte ein ZIP-File auf einen FTP-Server hochladen (funktioniert)
- Während dem Upload soll eine Form mit einer ProgressBar eingeblendet werden (funktioniert teilweise)
- Der Thread, der den Upload aufruft, darf erst mit der Abarbeitung fortfahren, wenn der Upload Completed ist (funktioniert nicht)
Zum Thema ProgressBar:
Meine Anwendung ist eine Windows Forms Anwendung, die beim Starten keine Form aufruft, sondern ein eine Prozedur in einem Modul.
In dieser Prozedur wird an einer Stelle dir Funktion FTP-Upload gerufen. Hier wird ein Verzeichnis auf dem FTP-Server erstellt (funktioniert) und dann in das Verzeichnis ein ZIP-File hochgeladen (funktioniert auch).
Vor dem Upload starte ich die Form frmUploadProgress.Show(), in der die ProgressBar pbUpload und ein Label lblUploadProgress enthalten ist.
1. Problem: Die Form wird angezeigt, aktualisiert sich aber nicht.
2. Problem: Um den Thread nicht zu blockieren bis der Upload completed ist, wird ja UploadFileAsync verwendet. Hat allerdings zur Folge, dass die Abarbeitung des Codes weiter läuft, auch wenn der Upload noch nicht beendet ist. Nach dem Upload wird jedoch eine Funktion gerufen, die das File löschen soll, welches hochgeladen wurde. Hier läuft die Application immer in einen Fehler, da der WebClient das File ja noch im Zugriff hat. Also muß ich sicherstellen, dass die Abarbeitung des Codes erst fortgeführt wird, wenn der Upload erfolgreich completed ist.
PublicFunction FTPUpload(ByVal Foldername AsString, ByVal File AsString) AsBoolean
Dim FTPCredentials AsNew Net.NetworkCredential("User", "Password")
Dim WC AsNew Net.WebClient
WC.Credentials = FTPCredentials
AddHandler WC.UploadProgressChanged, AddressOf UploadProgressChanged
AddHandler WC.UploadFileCompleted, AddressOf UploadFileCompleted
Dim FTPrequest As Net.FtpWebRequest = CType(Net.FtpWebRequest.Create(Foldername), Net.FtpWebRequest)
With FTPrequest
.UseBinary = True
.Credentials = FTPCredentials
.Method = Net.WebRequestMethods.Ftp.MakeDirectory
EndWith
Try
Using response As Net.FtpWebResponse = DirectCast(FTPrequest.GetResponse(), Net.FtpWebResponse)
Try
frmUploadProgress.Show()
WC.UploadFileAsync(address:= New Uri(Foldername & File), fileName:="C:\Temp\Versand\" & File)
FTPUpload = True
Catch ex As Exception
MsgBox( "#10013" & vbCrLf & "Der Versandordner konnte nicht hochgeladen werden!" & vbCrLf & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Upload fehlgeschlagen")
FTPUpload = False
EndTry
EndUsing
Catch ex As Exception
EndTry
WC.Dispose()
EndFunction
PrivateSub UploadProgressChanged(ByVal sender AsObject, ByVal e As System.Net.UploadProgressChangedEventArgs)
If frmUploadProgress.pbUpload.InvokeRequired Then
frmUploadProgress.pbUpload.Invoke(
New System.Net.UploadProgressChangedEventHandler(AddressOf UploadProgressChanged), sender, e)
ExitSub
EndIf
frmUploadProgress.pbUpload.Value = e.ProgressPercentage
frmUploadProgress.lblUploadProgress.Text = e.BytesSent.ToString( "0,0") & "Byte(s) von " & e.TotalBytesToSend.ToString("0,0") & " Byte(s) hochgeladen (" & (e.BytesSent / e.TotalBytesToSend).ToString("P") & ")"
frmUploadProgress.Refresh()
EndSub
PrivateSub UploadFileCompleted(ByVal sender AsObject, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
frmUploadProgress.Hide()
EndSub
Ich hoffe, mir kann hier jemand weiter helfen.
Vielen Dank von meinem geschunden Hirn
![:)](https://www.vb-paradise.de/wcf/images/smilies/smile.png)