2016-03-01 3 views
0

Я работаю над этим в течение нескольких дней и не могу понять, почему я не могу загрузить каждый файл в каталоге из мой сервер. Я успешно могу загрузить самый первый файл после того, как я получу ошибку отказа в доступе.Загрузите каждый файл из каталога сервера с помощью Renci.SshNet

Ниже приведен код, который я использую для подключения к серверу и запуска процесса загрузки.

public void downloadPaperwork() 
    { 
     // Setup Credentials and Server Information 
     ConnectionInfo ConnNfo = new ConnectionInfo(ipAddress, port, serverName, 
      new AuthenticationMethod[]{ 
      // Key Based Authentication (using keys in OpenSSH Format) 
      new PrivateKeyAuthenticationMethod(serverName,new PrivateKeyFile[]{ 
       new PrivateKeyFile(keyFile,password) 
      }), 
      }); 

     using (var sftp = new SftpClient(ConnNfo)) 
     { 
      sftp.Connect(); 

      sftp.ChangeDirectory("/var/www/html/invoices"); 

      List<SftpFile> invoices = sftp.ListDirectory(".").ToList(); 

      foreach (var file in invoices) 
      { 
       string filename = Path.Combine(Application.StartupPath + folder, file.Name); 

       using (var fs = new FileStream(filename, FileMode.Create)) 
       { 
        if(!file.Name.Equals(".") && !file.Name.Equals("..")) 
        { 
         MessageBox.Show(file.Name); 
         sftp.DownloadFile(file.FullName, fs); 
         fs.Close(); 
        } 

       } 
      } 
      sftp.Disconnect(); 
     } 
    } 

Ниже всего исключение, которое я во время выполнения Получать:

System.UnauthorizedAccessException: Access to the path 'C:\Users\*****\Documents\Visual Studio 2015\Projects\********\**********\bin\Debug\****\Invoices' is denied. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) 
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) 
    at System.IO.FileStream..ctor(String path, FileMode mode) 
    at *********.Form1.downloadPaperwork() in C:\Users\******\Documents\Visual Studio 2015\Projects\*********\*********\Secretary Form.cs:line 173 
    at ********.Form1.Form1_Load(Object sender, EventArgs e) in C:\Users\*****\Documents\Visual Studio 2015\Projects\*******\*******\Secretary Form.cs:line 120 
    at System.Windows.Forms.Form.OnLoad(EventArgs e) 
    at System.Windows.Forms.Form.OnCreateControl() 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl() 
    at System.Windows.Forms.Control.WmShowWindow(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.Form.WmShowWindow(Message& m) 
    at System.Windows.Forms.Form.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

Я пытался добавить файл в FileStream, и я не получаю ошибку, но он держит замены одного файла только оставляя меня с последним файлом в каталоге.

Любая помощь была бы принята с благодарностью. Заранее спасибо.

+2

'C: \ Users \ ***** \ Documents \ Visual Studio 2015 \ Projects \ ******** \ ********** \ bin \ Debug \ *** * \ Invoices' - это ошибка, и она выглядит как папка, а не файл. Вам нужно изменить свой код, чтобы пропускать папки (или перемещать папки). – Icemanind

+0

использовать отладчик .. Я уверен, что соединение все еще открыто, когда вы переходите на вторую итерацию? попробуйте проверить состояние соединения sftp. также где invoices, объявленные в этой строке 'foreach (файл var в счетах-фактурах)' – MethodMan

+0

Как мне это сделать? –

ответ

1

Ошибка в том, что вы выбираете каталоги в дополнение к файлам. Я бы просто обернул ваш код в блок try и catch исключение UnauthorizedAccessException и поместил continue в ваш блок catch.