// // Class: sftp // Current CLR: 4.0.30319.34209 // System: Microsoft Visual Studio 10.0 // Author: dani // Created: 4/28/2015 8:53:41 AM // // Copyright (c) 2015 Informatikbüro Daniel Schick. All rights reserved. using System; using System.Diagnostics; using System.Xml; using System.Xml.XPath; using System.Collections.Generic; namespace bsmd.dakosy { /// /// Hilfsklasse zur Kommunikation via SFTP. Wir machen es uns hier leicht und verwenden das beliebte WINSCP im /// Process-Modus. (http://winscp.net/eng/docs/guide_dotnet) /// public static class sftp { public static void Put(string fullPath) { Process winscp = new Process(); winscp.StartInfo.FileName = Properties.Settings.Default.WINSCPFullPath; winscp.StartInfo.Arguments = "/xmllog=\"" + Properties.Settings.Default.SFTPLog + "\""; winscp.StartInfo.UseShellExecute = false; winscp.StartInfo.RedirectStandardInput = true; winscp.StartInfo.RedirectStandardOutput = true; winscp.StartInfo.CreateNoWindow = true; winscp.Start(); // Feed in the scripting commands winscp.StandardInput.WriteLine("option batch abort"); winscp.StandardInput.WriteLine("option confirm off"); winscp.StandardInput.WriteLine("open " + Properties.Settings.Default.SFTPSessionName); winscp.StandardInput.WriteLine("ls"); winscp.StandardInput.WriteLine("put " + fullPath); winscp.StandardInput.Close(); // Collect all output (not used in this example) string 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) XPathDocument log = new XPathDocument(Properties.Settings.Default.SFTPLog); XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable()); ns.AddNamespace("w", @"http://winscp.net/schema/session/1.0"); XPathNavigator nav = log.CreateNavigator(); // Success (0) or error? if (winscp.ExitCode != 0) { Console.WriteLine("Error occured"); // See if there are any messages associated with the error foreach (XPathNavigator message in nav.Select("//w:message", ns)) { Console.WriteLine(message.Value); } } else { // It can be worth looking for directory listing even in case of // error as possibly only upload may fail XPathNodeIterator files = nav.Select("//w:file", ns); Console.WriteLine(string.Format("There are {0} files and subdirectories:", files.Count)); foreach (XPathNavigator file in files) { Console.WriteLine(file.SelectSingleNode("w:filename/@value", ns).Value); } } */ } public static void GetAll(string fullPath) { } } }