WinSCP C#首次使用

WinSCP C#首次使用,c#,sftp,winscp,winscp-net,C#,Sftp,Winscp,Winscp Net,我在电脑上安装了WinSCP,希望通过C#控制台应用程序连接到另一台服务器 using WinSCP; namespace WINSCP_SFTP { class Program { static void Main(string[] args) { try { Console.WriteLine("test"); SessionOpt

我在电脑上安装了WinSCP,希望通过C#控制台应用程序连接到另一台服务器

 using WinSCP;
namespace WINSCP_SFTP
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("test");
                SessionOptions sessionOptions = new SessionOptions
                {
                   Protocol = Protocol.Sftp,
                   HostName = "hostname",
                   UserName = "user",
                   Password = "password"
                 };

                 using (Session session = new Session())
                 {
                    session.ExecutablePath = @"C:\Program Files\WinSCP";
                    session.Open(sessionOptions);

                    Console.WriteLine(session.Opened);
                 }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadLine();
        }
    }
}
但是如果我运行.exe,应用程序甚至在第一个console.writeline出现之前就崩溃了。。知道我做错了什么吗

更新:
弹出一个警报,提示:WINSCP_SFTP已停止工作。。然后在cmd行中出现一个文本:未处理的异常。。我试着做了一次尝试..抓住了我的全部代码,但它也没有抓住错误

出现错误(来自web的图片,而不是我的应用程序的屏幕截图):

尝试类似的方法(这来自windows web服务)

winscp.exe必须位于应用程序的根目录中

编辑:请参阅winscp.net/eng/docs/library\u安装“WinSCP.NET程序集与WinSCP WinSCP.exe交互。默认情况下,它会在存储程序集的同一文件夹中查找winscp.exe。因此,您应该将包解压缩到已安装/解压缩WinSCP的同一文件夹中。您还可以将所有二进制文件winscp.exe和winscpnet.dll复制到单独的文件夹中。“尝试将.exe放入应用程序文件夹中

要将winSCP dll合并到exe中,请读取


请发布有关崩溃的所有相关信息,特别是确切的错误消息。如果可用,回溯也会很有用。崩溃的原因是什么?检查计算机的事件日志,或者在Visual Studio中运行它,看看它说了些什么。这当然对我们来说非常重要,因为我们能够帮助您找出问题所在sue是。弹出一个警告,上面写着:WINSCP_SFTP已停止工作。然后在cmd行中出现一个文本:未处理的异常。可能是因为在我的本地pc上,我的visual studio带有.dll,但应用程序运行在服务器上?因此,为了澄清:我在服务器上安装了WINSCP,它位于上面的路径中。您需要告诉我们实际异常是为了让我们能够帮助您。并检查Windows日志下的应用程序日志。它可能会列出应用程序异常消息和详细信息。通过更新您的问题向我们提供这些信息。发布调用WinSCP的随机代码如何回答此问题(关于崩溃)?@FrédéricHamidi首先,这不是随机的,我的笨家伙,这是一个工作代码的例子。其次,我从未见过它像OP那样被调用,你像我一样做,就像他们的文档描述的那样,除非你当然是从命令行运行它,而他们不是。我想我的问题是我安装的winscp不正确..但是不要知道W如何正确地安装它。因为你的答案与解决方案无关,所以我否决了。评论在回答时并不重要,因为评论被认为是短暂的,而且如果你反而显示了如何检索异常细节,很多评论是可以避免的。对话已结束。WinScp可以打开1个会话并继续,或者需要打开新会话,就像按按钮一样。文件上载/下载我不确定,我每次都创建了新会话以上载/下载
using WinSCP;

try
{
    SessionOptions sessionOptions = new SessionOptions
    {
        Protocol = Protocol.Sftp,
        HostName = EdiConfiguration.FtpIpAddressOrHostName,
        UserName = EdiConfiguration.FtpUserName,
        Password = EdiConfiguration.FtpPassword,
        SshHostKeyFingerprint = EdiConfiguration.SshHostKeyFingerprint,
        PortNumber = EdiConfiguration.FtpPortNumber
    };

    using (Session session = new Session())
    {
        session.Open(sessionOptions);

        TransferOptions transferOptions = new TransferOptions();
        transferOptions.TransferMode = TransferMode.Binary;
        transferOptions.ResumeSupport.State = TransferResumeSupportState.Off;

        // Download the files in the OUT directory.
        TransferOperationResult transferOperationResult = session.GetFiles(EdiConfiguration.FtpDirectory, EdiConfiguration.IncommingFilePath, false, transferOptions);

        // Check and throw if there are any errors with the transfer operation.
        transferOperationResult.Check();

        // Remove files that have been downloaded.
        foreach (TransferEventArgs transfer in transferOperationResult.Transfers)
        {
            RemovalOperationResult removalResult = session.RemoveFiles(session.EscapeFileMask(transfer.FileName));

            if (!removalResult.IsSuccess)
            {
                eventLogUtility.WriteToEventLog("There was an error removing the file: " + transfer.FileName + " from " + sessionOptions.HostName + ".", EventLogEntryType.Error);
            }
        }
    }
}
catch (SessionLocalException sle)
{
    string errorDetail = "WinSCP: There was an error communicating with winscp process. winscp cannot be found or executed.";
    errorDetail += Environment.NewLine + "Message:" + sle.Message;
    errorDetail += Environment.NewLine + "Target Site:" + sle.TargetSite;
    errorDetail += Environment.NewLine + "Inner Exception:" + sle.InnerException;
    errorDetail += Environment.NewLine + "Stacktrace: " + sle.StackTrace;
    eventLogUtility.WriteToEventLog(errorDetail, EventLogEntryType.Error);
}
catch (SessionRemoteException sre)
{
    string errorDetail = "WinSCP: Error is reported by the remote server; Local error occurs in WinSCP console session, such as error reading local file.";
    errorDetail += Environment.NewLine + "Message:" + sre.Message;
    errorDetail += Environment.NewLine + "Target Site:" + sre.TargetSite;
    errorDetail += Environment.NewLine + "Inner Exception:" + sre.InnerException;
    errorDetail += Environment.NewLine + "Stacktrace: " + sre.StackTrace;
    eventLogUtility.WriteToEventLog(errorDetail, EventLogEntryType.Error);
}
catch (Exception ex)
{
    eventLogUtility.WriteToEventLog("Error in ProcessEdi() while downloading EDI files via FTP: Message:" + ex.Message + "Stacktrace: " + ex.StackTrace, EventLogEntryType.Error);
}
//Using WinSCP to upload and download files
using System;
using System.Configuration;`
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Text;

using log4net;
using log4net.Config;

using WinSCP;

namespace SynchSubscriptions
{
    public class Program
    {
        // Initialize logger
        private static readonly ILog Logger = LogManager.GetLogger(typeof(Program));

        public static void Main(string[] args)
        {
            Download();
            UploadFile();
        }

        public static void Download()
        {           
            try
            {
                string ftpurl = ConfigurationManager.AppSettings["FTPUrl"];
                string ftpusername = ConfigurationManager.AppSettings["FTPUsername"];
                string ftppassword = ConfigurationManager.AppSettings["FTPPassword"];
                string ftpSSHFingerPrint = ConfigurationManager.AppSettings["SSHFingerPrint"];

                string ftpfilepath = ConfigurationManager.AppSettings["FtpFilePath"];
                string Download = ConfigurationManager.AppSettings["Download"];

                SessionOptions sessionOptions = new SessionOptions
                {
                    Protocol = Protocol.Sftp,
                    HostName = ftpurl,
                    UserName = ftpusername,
                    Password = ftppassword,
                    PortNumber = 22,
                    SshHostKeyFingerprint = ftpSSHFingerPrint
                };           

                using (Session session = new Session())
                {
                    session.SessionLogPath = "";
                    session.Open(sessionOptions);
                    RemoteDirectoryInfo directory = session.ListDirectory("/Export/");
                    foreach (RemoteFileInfo fileInfo in directory.Files)
                    {
                    TransferOptions transferOptions = new TransferOptions();
                    transferOptions.TransferMode = TransferMode.Binary;
                    transferOptions.FilePermissions = null; 
                    transferOptions.PreserveTimestamp = false;  
                    transferOptions.ResumeSupport.State = TransferResumeSupportState.Off;
                    TransferOperationResult transferResult;
                    transferResult = session.GetFiles("/Export/" + fileInfo.Name, Download, false, transferOptions);
                    transferResult.Check();
                    }
                }
            }
            catch (Exception ex)
            {              
            }
        }


        private static bool UploadFile()
        {
            bool success = false;
            string sourcefilepath = "Input File Path";
            try
            {
                string ftpurl = ConfigurationManager.AppSettings["FTPUrl"];
                string ftpusername = ConfigurationManager.AppSettings["FTPUsername"];
                string ftppassword = ConfigurationManager.AppSettings["FTPPassword"];
                string ftpSSHFingerPrint = ConfigurationManager.AppSettings["SSHFingerPrint"];

                string ftpfilepath = ConfigurationManager.AppSettings["FtpFilePath"];

                SessionOptions sessionOptions = new SessionOptions
                {
                    Protocol = Protocol.Sftp,
                    HostName = ftpurl,
                    UserName = ftpusername,
                    Password = ftppassword,
                    SshHostKeyFingerprint = ftpSSHFingerPrint
                };

                string filename = Path.GetFileName(sourcefilepath);
                string ftpfullpath = ftpurl + "/" + filename;

                using (Session session = new Session())
                {
                    // Connect
                    session.Open(sessionOptions);

                    // Upload files
                    TransferOptions transferOptions = new TransferOptions();
                    transferOptions.TransferMode = TransferMode.Binary;

                    TransferOperationResult transferResult = session.PutFiles(sourcefilepath, ftpfilepath, false, transferOptions);

                    // Throw on any error
                    transferResult.Check();

                    // Print results
                    foreach (TransferEventArgs transfer in transferResult.Transfers)
                    {                      
                        success = true;
                    }
                }

                // Delete the file after uploading
                if (File.Exists(sourcefilepath))
                {
                    File.Delete(sourcefilepath);
                }
            }
            catch (Exception ex)
            {               
            }
            return success;
        }     
    }
}