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

use*_*153 33 .net c# 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有人可以看看,看看有什么问题吗?我认为它与流部分有关.除了上传文件之外,我还使用过FTP,我之前使用了一些以前的代码,并认为我可以改变这个过程,但这样做无效.我使用的代码基于这个例子.

Mar*_*ryl 35

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

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

另请参阅使用C#中的SSH.NET SFTP下载目录.


要解释一下,为什么你的代码不起作用:

第二个参数SftpClient.DownloadFile是将下载内容写入的流.

您正在传入读取流而不是写入流.此外,您打开读取流的路径是一个远程路径,对于File仅在本地文件上运行的类不起作用.

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

Stream file1 = File.OpenWrite(localFileName);

sftp.DownloadFile(file.FullName, file1);
Run Code Online (Sandbox Code Playgroud)

甚至更好,用于File.Create丢弃本地文件可能具有的任何先前内容.

我不确定你localFileName是应该保留完整路径还是文件名.因此,如果需要,您可能还需要添加路径(localFileNamesDir?结合使用)

  • `var file1 = File.OpenWrite(localFileName); sftp.DownloadFile(file.FullName,file1);` (3认同)

Mer*_*rey 15

虽然该示例有效,但它不是处理流的正确方法......

您需要确保使用using子句关闭文件/流.此外,添加try/catch来处理IO错误...

       public void DownloadAll()
    {
        string host = @"sftp.domain.com";
        string username = "myusername";
        string password = "mypassword";

        string remoteDirectory = "/RemotePath/";
        string localDirectory = @"C:\LocalDriveFolder\Downloaded\";

        using (var sftp = new SftpClient(host, username, password))
        {
            sftp.Connect();
            var files = sftp.ListDirectory(remoteDirectory);

            foreach (var file in files)
            {
                string remoteFileName = file.Name;
                if ((!file.Name.StartsWith(".")) && ((file.LastWriteTime.Date == DateTime.Today))

                    using (Stream file1 = File.OpenWrite(localDirectory + remoteFileName))
                    { 
                        sftp.DownloadFile(remoteDirectory + remoteFileName, file1);
                    }
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

我的@Merak Marey代码版本。我正在检查文件是否已经存在以及.txt和其他文件的不同下载目录

        static void DownloadAll()
    {
        string host = "xxx.xxx.xxx.xxx";
        string username = "@@@";
        string password = "123";string remoteDirectory = "/IN/";
        string finalDir = "";
        string localDirectory = @"C:\filesDN\";
        string localDirectoryZip = @"C:\filesDN\ZIP\";
        using (var sftp = new SftpClient(host, username, password))
        {
            Console.WriteLine("Connecting to " + host + " as " + username);
            sftp.Connect();
            Console.WriteLine("Connected!");
            var files = sftp.ListDirectory(remoteDirectory);

            foreach (var file in files)
            {

                string remoteFileName = file.Name;

                if ((!file.Name.StartsWith(".")) && ((file.LastWriteTime.Date == DateTime.Today)))
                { 

                    if (!file.Name.Contains(".TXT"))
                    {
                        finalDir = localDirectoryZip;
                    } 
                    else 
                    {
                        finalDir = localDirectory;
                    }


                    if (File.Exists(finalDir  + file.Name))
                    {
                        Console.WriteLine("File " + file.Name + " Exists");
                    }else{
                        Console.WriteLine("Downloading file: " + file.Name);
                          using (Stream file1 = File.OpenWrite(finalDir + remoteFileName))
                    {
                        sftp.DownloadFile(remoteDirectory + remoteFileName, file1);
                    }
                    }
                }
            }



            Console.ReadLine();

        }
Run Code Online (Sandbox Code Playgroud)