Differences
This shows you the differences between the selected revisions of the page.
| 2010-09-07 | 2010-10-17 | ||
| script_vbnet_robust_example (martin) | removing "robust" vb.net code (martin) | ||
| Line 239: | Line 239: | ||
| </code> | </code> | ||
| - | Modified the above example to be a more robust vb.net function implementation: | ||
| - | <code> | ||
| - | Imports System | ||
| - | Imports System.IO | ||
| - | Imports System.Diagnostics | ||
| - | Imports System.Xml | ||
| - | Imports System.Xml.XPath | ||
| - | Imports System.Configuration.ConfigurationManager | ||
| - | |||
| - | Public Class SFTP | ||
| - | ' SFTP support, built on WinSCP | ||
| - | Public Shared Function PutSFTP(ByRef filename As String, ByRef remotehost As String, ByRef username As String, ByRef password As String, _ | ||
| - | Optional ByVal outfilename As String = Nothing, Optional ByVal output As String = Nothing, | ||
| - | Optional ByRef errmsg As String = Nothing) As Boolean | ||
| - | |||
| - | ' Run hidden WinSCP process | ||
| - | Dim winscp As Process = New Process() | ||
| - | Dim logname As String = Path.ChangeExtension(Path.GetTempFileName, "xml") | ||
| - | With winscp.StartInfo | ||
| - | ' SFTPExecutable needs to be defined in app.config to point to winscp.com | ||
| - | Try | ||
| - | .FileName = AppSettings("SFTPExecutable") | ||
| - | If .FileName Is Nothing OrElse .FileName.Length = 0 Then Throw (New Exception("from PutSFTP: SFTPExecutable not set in config file.")) | ||
| - | Catch ex As Exception | ||
| - | errmsg = ex.Message | ||
| - | Return False | ||
| - | End Try | ||
| - | .Arguments = "/log=" + logname | ||
| - | .UseShellExecute = False | ||
| - | .RedirectStandardInput = True | ||
| - | .RedirectStandardOutput = True | ||
| - | .CreateNoWindow = True | ||
| - | End With | ||
| - | Try | ||
| - | winscp.Start() | ||
| - | Catch ex As Exception | ||
| - | errmsg = "from PutSFTP: Could not run the WinSCP executable " & winscp.StartInfo.FileName & Environment.NewLine & ex.Message | ||
| - | Return False | ||
| - | End Try | ||
| - | |||
| - | ' Feed in the scripting commands | ||
| - | With winscp.StandardInput | ||
| - | .WriteLine("option batch abort") | ||
| - | .WriteLine("option confirm off") | ||
| - | .WriteLine("open sftp://" & username & ":" & password & "@" & remotehost) | ||
| - | If outfilename Is Nothing Then .WriteLine("put " & filename) Else .WriteLine("put " & filename & " """ & outfilename & """") | ||
| - | .Close() | ||
| - | End With | ||
| - | If Not output Is Nothing Then output = winscp.StandardOutput.ReadToEnd() | ||
| - | |||
| - | ' Wait until WinSCP finishes | ||
| - | winscp.WaitForExit() | ||
| - | |||
| - | ' Parse and interpret the XML log | ||
| - | ' (Note that in case of fatal failure the log file may not exist at all) | ||
| - | If Not File.Exists(logname) Then | ||
| - | errmsg = "from PutSFTP: The WinSCP executable appears to have crashed." | ||
| - | Return False | ||
| - | End If | ||
| - | |||
| - | Dim log As XPathDocument = New XPathDocument(logname) | ||
| - | Dim ns As XmlNamespaceManager = New XmlNamespaceManager(New NameTable()) | ||
| - | ns.AddNamespace("w", "http://winscp.net/schema/session/1.0") | ||
| - | Dim nav As XPathNavigator = log.CreateNavigator() | ||
| - | |||
| - | ' Success (0) or error? | ||
| - | Dim status As Boolean = (winscp.ExitCode = 0) | ||
| - | If Not status Then | ||
| - | errmsg = "from PutSFTP: There was an error transferring " & filename & "." | ||
| - | ' See if there are any messages associated with the error | ||
| - | For Each message As XPathNavigator In nav.Select("//w:message", ns) | ||
| - | errmsg &= Environment.NewLine & message.Value | ||
| - | Next message | ||
| - | End If | ||
| - | |||
| - | Try | ||
| - | My.Computer.FileSystem.DeleteFile(logname) | ||
| - | Catch ex As Exception | ||
| - | ' at least we tried to clean up | ||
| - | End Try | ||
| - | |||
| - | Return status | ||
| - | End Function | ||
| - | End Class | ||
| - | </code> | ||