2016-09-08 3 views
5

Я использую SSH.NET в C# 2015.SSH.NET Загрузить всю папку

С помощью этого метода я могу загрузить файл на свой SFTP-сервер.

public void upload() 
{ 
    const int port = 22; 
    const string host = "*****"; 
    const string username = "*****"; 
    const string password = "*****"; 
    const string workingdirectory = "*****"; 
    string uploadfolder = @"C:\test\file.txt"; 

    Console.WriteLine("Creating client and connecting"); 
    using (var client = new SftpClient(host, port, username, password)) 
    { 
     client.Connect(); 
     Console.WriteLine("Connected to {0}", host); 

     client.ChangeDirectory(workingdirectory); 
     Console.WriteLine("Changed directory to {0}", workingdirectory); 

     using (var fileStream = new FileStream(uploadfolder, FileMode.Open)) 
     { 
      Console.WriteLine("Uploading {0} ({1:N0} bytes)", 
           uploadfolder, fileStream.Length); 
      client.BufferSize = 4 * 1024; // bypass Payload error large files 
      client.UploadFile(fileStream, Path.GetFileName(uploadfolder)); 
     } 
    } 
} 

Которая отлично работает для одного файла. Теперь я хочу загрузить всю папку/каталог.

Кто-нибудь теперь, как этого достичь?

ответ

5

Нет волшебного пути. Вы должны перечислять файлы и загружать их один за другим:

void UploadDirectory(SftpClient client, string localPath, string remotePath) 
{ 
    Console.WriteLine("Uploading directory {0} to {1}", localPath, remotePath); 

    IEnumerable<FileSystemInfo> infos = 
     new DirectoryInfo(localPath).EnumerateFileSystemInfos(); 
    foreach (FileSystemInfo info in infos) 
    { 
     if (info.Attributes.HasFlag(FileAttributes.Directory)) 
     { 
      string subPath = remotePath + "/" + info.Name; 
      if (!client.Exists(subPath)) 
      { 
       client.CreateDirectory(subPath); 
      } 
      UploadDirectory(client, info.FullName, remotePath + "/" + info.Name); 
     } 
     else 
     { 
      using (Stream fileStream = new FileStream(info.FullName, FileMode.Open)) 
      { 
       Console.WriteLine(
        "Uploading {0} ({1:N0} bytes)", 
        info.FullName, ((FileInfo)info).Length); 

       client.UploadFile(fileStream, remotePath + "/" + info.Name); 
      } 
     } 
    } 
} 
+0

Хорошо, может быть, вы можете привести пример о том, как «переписывать в подкаталоги»? – Francis

+0

См. Мой обновленный ответ. –

+0

Отличный thx для экономии моего времени. –

Смежные вопросы