使用Renci.ShNet从服务器目录中下载每个文件

问题描述:

我一直在这工作了几天,似乎无法弄清楚为什么我无法下载目录中的每个文件我的服务器。在获得访问被拒绝错误后,我成功地能够下载第一个文件。使用Renci.ShNet从服务器目录中下载每个文件

下面是我用来连接到服务器并开始下载过程的代码。

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(); 
     } 
    } 

下面是整个例外,在运行时我recive:

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) 

我试着将文件添加到文件流,我没有得到一个错误,但它使替换一个文件只留下目录中的最后一个文件。

任何帮助将不胜感激。提前致谢。

+2

'C:\ Users \ ***** \ Documents \ Visual Studio 2015 \ Projects \ ******** \ ********** \ bin \ Debug \ *** * \ Invoices'是错误的地方,它看起来像一个文件夹而不是文件。您需要修改代码以跳过文件夹(或遍历文件夹)。 – Icemanind

+0

使用调试器..我确定在第二次迭代时连接仍然打开?尝试检查sftp连接状态。也是在这行'foreach(发票var文件)声明发票' – MethodMan

+0

我该怎么做呢? –

错误是因为除了文件之外您正在提取目录。我只是将您的代码包含在try块中,catchUnauthorizedAccessException例外,并将continue放入您的catch块中。