【发布时间】:2019-05-14 21:47:10
【问题描述】:
当我从另一台服务器下载文件时,它可以工作。我可以删除文件并获取目录列表,但无法下载文件。我得到的唯一例外是“没有这样的文件”,即使我使用从 ListDirectory 调用返回的文件。工作的服务器安装了 SSH 密钥,而没有安装的服务器没有安装 SSH 密钥。 Renci.SshNet 是否只能从安装了 SSH 的服务器进行 ftp?
private void button7_Click(object sender, EventArgs e)
{
string host = "ether4";
string pathLocalFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "factor_out.txt");
using (SftpClient sftp = new SftpClient(host, _username, _password))
{
try
{
sftp.Connect();
var files = sftp.ListDirectory("/factor/dktest/pdi");
sftp.ChangeDirectory("/factor/dktest/pdi");
Debug.Print(sftp.WorkingDirectory); // <-- /factor/dktest/pdi
foreach (var file in files)
{
using (Stream fileStream = File.OpenWrite(pathLocalFile))
{
//if (!file.Name.StartsWith("."))
// sftp.DownloadFile(file.Name, fileStream); // <-- Exception thrown here
if (!file.FullName.EndsWith("."))
{
sftp.DownloadFile(file.FullName, fileStream); // <-- Exception thrown here
break;
}
}
}
sftp.Disconnect();
}
catch (Exception er)
{
Console.WriteLine("An exception has been caught " + er.ToString()); // No Such File
}
}
}
完整的错误信息是“没有这样的文件”。 没有内部异常。 HResult = -2146233088。
file.FullName = "/factor/dktest/pdi/gl_accounts.txt"
StackTrace
at Renci.SshNet.Common.AsyncResult.EndInvoke()
at Renci.SshNet.Sftp.SftpSession.EndOpen(SftpOpenAsyncResult asyncResult)
at Renci.SshNet.ServiceFactory.CreateSftpFileReader(String fileName, ISftpSession sftpSession, UInt32 bufferSize)
at Renci.SshNet.SftpClient.InternalDownloadFile(String path, Stream output, SftpDownloadAsyncResult asyncResult, Action`1 downloadCallback)
at Renci.SshNet.SftpClient.DownloadFile(String path, Stream output, Action`1 downloadCallback)
at FtpTesting.frmSshNet.button7_Click(Object sender, EventArgs e) in C:\\Development\\FtpTesting\\FtpTesting\\frmSshNet.cs:line 98"
【问题讨论】:
-
异常发生时
file.FullName的值是多少? + 向我们展示完整的异常调用堆栈和错误消息。 -
我安装了 FluentFTP 并使用了它,它运行良好。我希望有一套 SFTP 和 FTP 代码,但如果需要,我会使用两套。
-
我迷路了。 FluentFTP 是 FTP 客户端。 SSH.NET 是 SFTP 客户端。你怎么能用 FluentFTP 代替 SSH.NET?
-
我想将 Ssh.NET 用于 FTP 和 SFTP。我的部分问题是这是否可能(我找不到任何说明这是不可能的)。我能够使用 SSH.NET 运行命令、导航文件系统和删除文件,只是无法下载文件。如果事实证明这是不可能的,我将不得不让我的应用程序能够同时使用这两者。我可能会让用户在设置表单中选中一个框。
-
SSH.NET 是 SSH/SFTP 库。 FTP 是一个完全不相关的协议。您不能指望图书馆记录它不支持的协议。