ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
1281
1281
EMPFEHLEN
-
Hallo Leute,
wie in einem anderen Thema bereits geschrieben, habe ich versucht, eine Datei via SFTP hochzuladen. Das gelingt mir nun einwandfrei (verwende die Library SharpSSH von Tamir Gal).
Nun stehe ich aber vor einem Problem, und zwar blockiert ein Upload größerer Dateien die GUI. Dieses Problem kenne ich schon von der einfachen WebClient-Methode (leider ohne SFTP), da kann man eine Datei mit "Async" ja asynchron hochladen (also kann das Programm während des Uploads andere Sachen erledigen).
Diesen Code verwende ich mit der SharpSSH-Library:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Private WithEvents transfer As SecureFileTransfer Public Event onTransferProgress(ByVal source As String, ByVal destination As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String) Public Function putFile(ByVal localFile As String, ByVal remotePath As String) As Boolean Try transfer = New Sftp(Me._hostname, Me._username, Me._password) transfer.Connect(Me._port) transfer.Put(localFile, remotePath) transfer.Close() Return True Catch ex As Exception Debug.Print("Error uploading file: " & ex.ToString) Return False End Try End Function transfer = New SecureFileTransfer("ftp.server.com", Integer.Parse("22"), user, pass) transfer.putFile("test.txt", "/ordner_auf_ftp/" & "text.txt")
Mit folgendem Code lässt sich bei dieser Library sogar feststellen, wie weit der Upload ist:
Code :1 2 3 4 5 6
Private Sub _onTransferProgress(ByVal source As String, ByVal destination As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String) Handles transfer.onTransferProgress ProgressBar1.Maximum = totalBytes ProgressBar1.Value = transferredBytes End Sub
Nun blockiert der Upload aber trotzdem die GUI. Wir kann ich (kostenlos, also nicht mit Rebex und Co.) eine Datei per SFTP hochladen und gleichzeitig eine Blockierung der GUI verhindern (mit Upload-Fortschrittsanzeige)?
MfG und Danke schonmal
-
Ich vermute mal, dass die Put-Methode nicht asynchron ist. Ich konnte leider keine Dokumentation zur SecureFileTransfer-Klasse aus der SharpSSH-Lib finden. Aber vermutlich gibt es eine alternative Methode, die den Upload asynchron startet. Oder sonst musst du einfach einen neuen Thread starten und die Put-Methode daraus starten.
hihi = -h²
-
Danke für die Antwort!
Nein, die Methode ist nicht asynchron. Andere Methoden finde ich leider nicht, ich denke nicht, dass ein asynchroner Upload in dieser Library enthalten ist. Aber das mit dem neuen Thread und der put-Methode klingt interessant. Wie genau funktioniert das? Muss ich dafür die Methode in einem neuen Module/Form starten?
-
Du musst einen Thread starten

Siehe: Add Multithreading to Your VB.Net App
Oder noch besser den BackgroundWorker verwenden: BackgroundWorker-Video-TutorialGeändert von Shakie (10.03.10 um 23:31 Uhr)
hihi = -h²
-
Vielen Dank, das klappt einwandfrei

Nur eine Frage bezüglich des Abbruchs des Backgroundworkers hätte ich noch.
Bei mir wird ja eine Datei hochgeladen, somit wiederholt sich nicht, wie im Video gezeigt, ständig dieselbe Schleife.
Das Cancellation.Pending kann ich also nur nach bzw. vor dem Upload überprüfen, und wenn, dann will ich ja während dem Upload abbrechen.
Wie kann ich das anstellen?
-
Das kann ich dir nicht sagen, vielleicht geht es gar nicht. Du musst nachschauen, ob die SecureFileTransfer-Klasse eine Abbruch-Methode hat (die du threadübergreifend ausführen kannst). Denn das, was bei dir so "lange" dauert, ist die Put-Methode. Wenn die läuft, dann läuft sie halt.
hihi = -h²
-
Ja, die Klasse verfügt tatsächlich über ein Abbrechen-Event. Darauf hätte ich auch selbst kommen können

Vielen Dank, funktioniert nun alles.
MfG
-
Hallo,
diese Thema wurde zwar vor längerer Zeit bearbeitet, aber ich versuch es einfach noch mal.
Nach dem ich mich entschieden habe vom normalen FTP-upload zum sftp zu wechseln quäle ich mich mit der Fortschrittsanzeige.
Diese funktioniert mit der Tamir.SharpSsh ohne Backgroundworker auch gut. Allerdings ist ein Programm was nicht mehr reagiert wenn der upload oder download läuft unbrauchbar.
Wenn ich den Backgroundworker nutze bekomme ich folgenden Fehler
der zugriff auf das steuerelement ProgressBar1 erfolgte von einem anderen thread als dem thread, für den er erstellt wurde.
Jetzt hab ich gelesen das man das irgendwie mit invoke hinbekommen soll. Ich selbst bin wohl eher ein scripter als richtiger Programmierer. Deshalb meine Frage wie du das gelöst hast mit dem Abbrechen-Event.
Ziel ist ein uploader über sftp zu bauen den man abbrechen kann und der Fortschritt in irgendeiner Form darzustellen. Vielleicht hat ja jemand eine Klasse gebaut wo das alles drin ist...
Kann jemand helfen?
-
Ich beschäftige mich nun eher mit Python, aber die Datei habe ich noch. Musst dir die Stellen selbst raussuchen, aber ich denke, das ist nicht so schwer.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
Imports System.IO Public Class Form6 Inherits ComponentFactory.Krypton.Toolkit.KryptonForm Private WithEvents transfer As SecureFileTransfer Public Event onTransferProgress(ByVal source As String, ByVal destination As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String) Public Function IsURLAvail(ByVal sURL As String) As Boolean ' Prüft, ob die angegebene URL erreichbar ist Try Dim oRequest As Net.HttpWebRequest = Net.HttpWebRequest.Create(sURL) ' Default-Proxy Einstellungen With oRequest .Proxy = System.Net.WebRequest.DefaultWebProxy .Credentials = System.Net.CredentialCache.DefaultCredentials End With Dim oResponse As Net.WebResponse = oRequest.GetResponse oResponse.Close() ' URL ist erreichbar Return True Catch ex As Exception ' URL ist nicht erreichbar Return False End Try End Function Shared Function Decryption(ByVal sText As String) As String Dim zahlenreihe As String = "" Dim alphabet As String = "qewüopgrzntui319adsälö0fhkj246578ycxmbv!""§$%&/()=?-.,;:_'*+#^°<> ßQAYÜÖÄPLMOKNIJBUHVZGCTFXEDRWS" For i = 0 To sText.Length - 1 If alphabet.Contains(sText.Chars(i)) Then Dim pos As Integer = alphabet.IndexOf(sText.Chars(i)) - 1 If zahlenreihe = "" Then zahlenreihe = alphabet.Chars(pos) Else zahlenreihe = zahlenreihe + alphabet.Chars(pos) End If End If Next Return zahlenreihe End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) If IsURLAvail("http://www.d3scene-clan.com/") Then MsgBox("Ihre Datei wird nun hochgeladen. Bitte haben Sie einen Augenblick Geduld.", vbInformation, "Information") Label3.Text = "Datei: " & ListBox1.SelectedItem Button1.Enabled = False 'Background-Worker BackgroundWorker1.RunWorkerAsync() Else MsgBox("Verbindung zu Esport-Masters fehlgeschlagen.", vbCritical, "Fehler") End If End Sub Private Sub _onTransferEnd(ByVal source As String, ByVal destination As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String) Handles transfer.onTransferEnd MsgBox("Datei hochgeladen!") End Sub Private Sub _onTransferStart(ByVal source As String, ByVal destination As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String) Handles transfer.onTransferStart ProgressBar1.Maximum = totalBytes End Sub Private Sub _onTransferProgress(ByVal source As String, ByVal destination As String, ByVal transferredBytes As Integer, ByVal totalBytes As Integer, ByVal message As String) Handles transfer.onTransferProgress ProgressBar1.Value = transferredBytes Label2.Text = "Fortschritt: " & transferredBytes & " / " & totalBytes & " Bytes" End Sub Private Sub Form6_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load PaletteMode = ComponentFactory.Krypton.Toolkit.PaletteMode.SparkleOrange TextBox2.Text = Form2.TextBox1.Text End Sub Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Dim strub As String = Decryption("sptäcäuwbä") Dim strpaw As String = Decryption("Yhz3uiäbdrrwztwviuuwz941") Try transfer = New SecureFileTransfer("ftp.d3scene-clan.com", Integer.Parse("22"), strub, strpaw) transfer.putFile("Matches/" & ListBox1.SelectedItem, "/EML-Umbrella/" & TextBox2.Text & "/" & ListBox1.SelectedItem) Catch ex As Exception End Try Dim objFileSystemObject As Object Dim deletedir As String = "\umbrella\" If System.IO.Directory.Exists(deletedir) Then objFileSystemObject = CreateObject("Scripting.FileSystemObject") objFileSystemObject.GetFolder("\umbrella\").Delete(True) objFileSystemObject = Nothing Else End If Button1.Enabled = True End Sub Private Sub Form4_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing If BackgroundWorker1.IsBusy Then If MsgBox("Ihre Datei wird noch hochgeladen. Möchten Sie den Upload-Vorgang wirklich abbrechen?", vbQuestion + vbYesNo + vbDefaultButton2, "Information") = vbYes Then transfer.cancel() Else e.Cancel = True Exit Sub End If Else End If End Sub Private Sub Form6_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Dir As New DirectoryInfo("Matches") Dim File As FileInfo For Each File In Dir.GetFiles() ListBox1.Items.Add(File.Name) Next End Sub Private Sub KryptonButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If ListBox1.SelectedItem = "" Then MsgBox("Bitte wählen Sie eine Datei aus.", vbInformation, "Information") Else If IsURLAvail("http://www.d3scene-clan.com/") Then MsgBox("Ihre Datei wird nun hochgeladen. Bitte haben Sie einen Augenblick Geduld.", vbInformation, "Information") Label3.Text = "Datei: " & ListBox1.SelectedItem Button1.Enabled = False 'Background-Worker BackgroundWorker1.RunWorkerAsync() Else MsgBox("Verbindung zu Esport-Masters fehlgeschlagen.", vbCritical, "Fehler") End If End If End Sub Shared Sub Show() Throw New NotImplementedException End Sub End Class
Mit freundlichen Grüßen,
Markushttp://www.server-master.eu - Gameserver, Rootserver, Voiceserver and more...
Best Game Server for Low Prices!
-
Danke erstmal, das du die Quellen gesucht und online gestellt hast. Leider ist das Problem noch nicht behoben. Deshalb habe ich ein mini Projekt mit 3 button's erstellt damit es für jeden klarer wird.
1 button hochladen via sftp läuft mit Fortschrittsanzeige (nicht abbrechbar)
2 button backgroundworker läde hoch ohne Fortschrittsanzeige
3 ist der wunsch button der noch nicht geht.
hier zum runterladen. Ich hoffe es kann mir jemand helfen.
sftp_m_backgroundworker.zip
Ähnliche Themen
-
Asynchroner Webservice mit Java
Von 00d4vid im Forum JavaAntworten: 0Letzter Beitrag: 05.03.10, 14:52 -
Asynchroner Request mit jQuery im Safari
Von metty im Forum Javascript & AjaxAntworten: 0Letzter Beitrag: 27.02.09, 12:53 -
[Access/Mysql] Asynchroner Datenabgleich
Von EHS_Megatron im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 28.11.07, 12:16 -
Asynchroner aufruf von donnerwetter
Von duennes im Forum Javascript & AjaxAntworten: 1Letzter Beitrag: 02.08.07, 12:05 -
FTP zu SFTP
Von Teek im Forum Internet, DSL & FlatrateAntworten: 6Letzter Beitrag: 04.08.04, 00:20





Zitieren
Login




