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
是否应该包含完整路径,或者只是文件名。因此,如有必要,您可能还需要添加路径(将 localFileName
与 sDir
结合起来?)
关于c# - 使用 SSH.NET 库从 SFTP 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23703040/