前言
本文主要給大家介紹了關于C#連接FTP時路徑問題的相關內容,分享出來供大家參考學習,話不多說,來一起看看詳細的介紹:
今天在開發項目時,需要連接FTP獲取文件,其中關鍵的一步就是判斷能否連接FTP以及FTP上的文件是否存在
判斷的代碼如下:
/// <summary>  /// 測試是否可以成功連接FTP和判斷文件是否存在  /// </summary>  /// <param name="ftpServerFilePath">FTP上文件地址</param>  /// <param name="ftpUserId">FTP登陸用戶名</param>  /// <param name="ftpPwd">FTP登陸密碼</param>  /// <param name="errorMsg">返回錯誤消息</param>  /// <returns></returns>  private bool IsCanConnectFtp(string ftpServerFilePath, string ftpUserId, string ftpPwd, out string errorMsg)  {   bool flag = true;   FtpWebResponse ftpResponse = null;   FtpWebRequest ftpRequest = null;   errorMsg = string.Empty;   try   {    ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerFilePath));    ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;    ftpRequest.Timeout = 2 * 1000;//超時時間設置為2秒。    ftpRequest.Credentials = new NetworkCredential(ftpUserId, ftpPwd);    ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();   }   catch (WebException exception)   {    ftpResponse = (FtpWebResponse)exception.Response;    switch (ftpResponse.StatusCode)    {     case FtpStatusCode.ActionNotTakenFileUnavailable:      errorMsg = "下載的文件不存在";      break;     case FtpStatusCode.ActionNotTakenFileUnavailableOrBusy:      errorMsg = "下載的文件正在使用,請稍后再試";      break;     default:      errorMsg = "發生未知錯誤";      break;    }    flag = false;   }   catch   {    errorMsg = "網絡連接發生錯誤,請稍后再試";    flag = true;   }   finally   {    if (ftpResponse != null)    {     ftpResponse.Close();    }   }   return flag;  }當 ftpServerFilePath 的路徑為 “127.0.0.1/1.doc”, 這樣進行傳參時,就會拋異常,異常內容為無效的URi,如下圖

解決方法
這是因為FtpWebRequest.Create 連接時不能識別'/' 這樣的文件路徑標識符,才會拋出上面的異常,因此傳入的參數應該為”127.0.0.1/1.doc”?;蛘咴诜椒ɡ锩孢M行替換。代碼如下所示:
 ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerFilePath.Replace("http://","/")));這樣就不會跑異常,至于能否連接或者文件是否存在,請自行查看連接 
https://msdn.microsoft.com/zh-cn/library/system.net.ftpstatuscode(v=vs.110).aspx
或者自行 google FtpStatusCode 即可。
那么修改后的代碼為:(關于C# 連接完整的FTP 可以仔細 google 查詢,網上多的是,這樣就不累述了)
 /// <summary>  /// 測試是否可以成功連接FTP和判斷文件是否存在  /// </summary>  /// <param name="ftpServerFilePath">FTP上文件地址</param>  /// <param name="ftpUserId">FTP登陸用戶名</param>  /// <param name="ftpPwd">FTP登陸密碼</param>  /// <param name="errorMsg">返回錯誤消息</param>  /// <returns></returns>  private bool IsCanConnectFtp(string ftpServerFilePath, string ftpUserId, string ftpPwd, out string errorMsg)  {   bool flag = true;   FtpWebResponse ftpResponse = null;   FtpWebRequest ftpRequest = null;   errorMsg = string.Empty;   try   {    ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerFilePath.Replace("http://","/")));    ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;    ftpRequest.Timeout = 2 * 1000;//超時時間設置為2秒。    ftpRequest.Credentials = new NetworkCredential(ftpUserId, ftpPwd);    ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();   }   catch (WebException exception)   {    ftpResponse = (FtpWebResponse)exception.Response;    switch (ftpResponse.StatusCode)    {     case FtpStatusCode.ActionNotTakenFileUnavailable:      errorMsg = "下載的文件不存在";      break;     case FtpStatusCode.ActionNotTakenFileUnavailableOrBusy:      errorMsg = "下載的文件正在使用,請稍后再試";      break;     default:      errorMsg = "發生未知錯誤";      break;    }    flag = false;   }   catch   {    errorMsg = "網絡連接發生錯誤,請稍后再試";    flag = true;   }   finally   {    if (ftpResponse != null)    {     ftpResponse.Close();    }   }   return flag;  }總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持
新聞熱點
疑難解答