WinSCP C#首次使用
我在电脑上安装了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
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;
}
}
}