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> |