c# - 使用 SSH.NET 库从 SFTP 下载文件

标签 c# .net ssh sftp

string host = @"ftphost";
string username = "user";
string password = "********";
string localFileName  = System.IO.Path.GetFileName(@"localfilename");
string remoteDirectory = "/export/";
using (var sftp = new SftpClient(host, username, password))
{
    sftp.Connect();
    var files = sftp.ListDirectory(remoteDirectory);
    foreach (var file in files)
    {
        if (!file.Name.StartsWith("."))
        {
            string remoteFileName = file.Name;
            if (file.LastWriteTime.Date == DateTime.Today)

            Console.WriteLine(file.FullName);

            File.OpenWrite(localFileName);

            string sDir = @"localpath";

            Stream file1 = File.OpenRead(remoteDirectory + file.Name);
            sftp.DownloadFile(remoteDirectory, file1);
        }
    }
}

我正在使用 SSH.NET (Renci.SshNet) 库来处理 SFTP 服务器。我需要做的是根据今天的日期从 SFTP 服务器上的特定文件夹中获取文件。然后将这些文件从 SFTP 服务器复制到本地驱动器(我的服务器)。

上面是我的代码,但它不起作用。有时它说文件不存在,但有时我要下载的文件不在我的本地服务器上,但我需要下载当天上传到远程文件夹的所有文件。

谁能看一下,看看哪里出了问题?我相信这与流部分有关。除了上传文件外,我还使用过 FTP,我使用了一些以前的代码,并认为我可以逆转这个过程,但这是行不通的。我使用的代码基于此 example .

最佳答案

使用 SSH.NET 库下载文件的简单工作代码是:

using (Stream fileStream = File.Create(@"C:\target\local\path\file.zip"))
{
    sftp.DownloadFile("/source/remote/path/file.zip", fileStream);
}

另见 Downloading a directory using SSH.NET SFTP in C# .


解释一下为什么您的代码不起作用:

SftpClient.DownloadFile 的第二个参数是一个用于写入下载内容的流。

您传递的是读取流而不是写入流。此外,您打开读取流的路径是一个远程路径,无法使用仅在本地文件上运行的 File 类。

只需丢弃 File.OpenRead 行并使用之前的 File.OpenWrite 调用的结果(您现在根本没有使用):

Stream file1 = File.OpenWrite(localFileName);

sftp.DownloadFile(file.FullName, file1);

或者更好的是,使用 File.Create 丢弃本地文件可能具有的任何先前内容。

我不确定您的 localFileName 是否应该包含完整路径,或者只是文件名。因此,如有必要,您可能还需要添加路径(将 localFileNamesDir 结合起来?)

关于c# - 使用 SSH.NET 库从 SFTP 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23703040/

相关文章:

c# - exe安装抛出错误该模块预计包含程序集 list .Net Core

c# - 是否可以使用挂起写入、总写入和写入总字节数来优化写入调度程序?

c# - xpath 表达式 count() 失败并出现异常,表达式必须评估为节点集

python-3.x - 通过Shh和Xming的Raspberry Pi Tkinter

ssh - Chef : deploy a server with root ssh access disabled?

c# - 我们如何定义字符串常量而不是数组

时间:: how to read from specific index in List<person>

c# - 如果删除元素,List<T> 会缩小大小

c# - 在类的所有实例中引发事件

java - 如何通过使用 JAVA 中的 pem 文件连接到服务器来跟踪远程服务器中的后端日志