最近在工作中遇到一個需求,需要利用C#串連FTP,在串連過程中遇到一個問題,所以下面這篇文章主要給大家介紹了關於C#串連FTP時路徑問題的解決方案,需要的朋友可以參考借鑒,下面來一起看看吧。
前言
本文主要給大家介紹了關於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”。或者在方法裡面進行替換。代碼如下所示:
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerFilePath.Replace("\\","/")));
這樣就不會跑異常,至於能否串連或者檔案是否存在,請自行查看串連
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("\\","/"))); 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; }
總結