C# 實現FTP下載文件##
初學C# 需要用到FTP下載文件,在這里記錄一下。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.IO;
using System.Threading;
namespace FtpUtils
{
class FtpHelper
{
// 默認常量定義
private static readonly string rootPath = "/";
private static readonly int defaultReadWriteTimeout = 300000;
private static readonly int defaultFtpPort = 21;
#region 設置初始化參數
private string host = string.Empty;
public string Host
{
get
{
return this.host ?? string.Empty;
}
}
private string username = string.Empty;
public string Username
{
get
{
return this.username;
}
}
private string password = string.Empty;
public string Password
{
get
{
return this.password;
}
}
IWebProxy proxy = null;
public IWebProxy Proxy
{
get
{
return this.proxy;
}
set
{
this.proxy = value;
}
}
private int port = defaultFtpPort;
public int Port
{
get
{
return port;
}
set
{
this.port = value;
}
}
private bool enableSsl = false;
public bool EnableSsl
{
get
{
return enableSsl;
}
}
private bool usePassive = true;
public bool UsePassive
{
get
{
return usePassive;
}
set
{
this.usePassive = value;
}
}
private bool useBinary = true;
public bool UserBinary
{
get
{
return useBinary;
}
set
{
this.useBinary = value;
}
}
private string remotePath = rootPath;
public string RemotePath
{
get
{
return remotePath;
}
set
{
string result = rootPath;
if (!string.IsNullOrEmpty(value) && value != rootPath)
{
result = Path.Combine(Path.Combine(rootPath, value.TrimStart('/').TrimEnd('/')), "/"); // 進行路徑的拼接
}
this.remotePath = result;
}
}
private int readWriteTimeout = defaultReadWriteTimeout;
public int ReadWriteTimeout
{
get
{
return readWriteTimeout;
}
set
{
this.readWriteTimeout = value;
}
}
#endregion
#region 構造函數
public FtpHelper(string host,string username, string password)
: this(host, username, password, defaultFtpPort, null, false, true, true, defaultReadWriteTimeout)
{
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="host">主機名</param>
/// <param name="username">用戶名</param>
/// <param name="password">密碼</param>
/// <param name="port">端口號 默認21</param>
/// <param name="proxy">代理 默認沒有</param>
/// <param name="enableSsl">是否使用ssl 默認不用</param>
/// <param name="useBinary">使用二進制</param>
/// <param name="usePassive">獲取或設置客戶端應用程序的數據傳輸過程的行為</param>
/// <param name="readWriteTimeout">讀寫超時時間 默認5min</param>
public FtpHelper(string host, string username, string password, int port, IWebProxy proxy, bool enableSsl, bool useBinary, bool usePassive, int readWriteTimeout)
{
this.host = host.ToLower().StartsWith("ftp://") ? host : "ftp://" + host;
this.username = username;
this.password = password;
this.port = port;
this.proxy = proxy;
this.enableSsl = enableSsl;
this.useBinary = useBinary;
this.usePassive = usePassive;
this.readWriteTimeout = readWriteTimeout;
}
#endregion
/// <summary>
/// 拼接URL
/// </summary>
/// <param name="host">主機名</param>
/// <param name="remotePath">地址</param>
/// <param name="fileName">文件名</param>
/// <returns>返回完整的URL</returns>
private string UrlCombine(string host, string remotePath, string fileName)
{
string result = new Uri(new Uri(new Uri(host.TrimEnd('/')), remotePath), fileName).ToString(); ;
return result;
}
/// <summary>
/// 創建連接
/// </summary>
/// <param name="url">地址</param>
/// <param name="method">方法</param>
/// <returns>返回 request對象</returns>
private FtpWebRequest CreateConnection(string url, string method)
{
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(this.username, this.password);
request.Proxy = this.proxy;
request.KeepAlive = false;
request.UseBinary = useBinary;
request.UsePassive = usePassive;
request.EnableSsl = enableSsl;
request.Method = method;
Console.WriteLine(request);
return request;
}
/// <summary>
/// 上傳文件
/// </summary>
/// <param name="localFile">本地文件</param>
/// <param name="remoteFileName">上傳文件名</param>
/// <returns>上傳成功返回 true</returns>
public bool Upload(FileInfo localFile, string remoteFileName)
{
bool result = false;
if (localFile.Exists)
{
try
{
string url = UrlCombine(Host, RemotePath, remoteFileName);
FtpWebRequest request = CreateConnection(url, WebRequestMethods.Ftp.UploadFile);
using (Stream rs = request.GetRequestStream())
using (FileStream fs = localFile.OpenRead())
{
byte[] buffer = new byte[1024 * 4];
int count = fs.Read(buffer, 0, buffer.Length);
while (count > 0)
{
rs.Write(buffer, 0, count);
count = fs.Read(buffer, 0, buffer.Length);
}
fs.Close();
result = true;
}
}
catch (WebException ex)
{
MessageBox.Show(ex.Message);
}
return result;
}
// 處理本地文件不存在的情況
return false;
}
/// <summary>
/// 下載文件
/// </summary>
/// <param name="serverName">服務器文件名稱</param>
/// <param name="localName">需要保存在本地的文件名稱</param>
/// <returns>下載成功返回 true</returns>
public bool Download(string serverName, string localName)
{
bool result = false;
using (FileStream fs = new FileStream(localName, FileMode.OpenOrCreate))
{
try
{
string url = UrlCombine(Host, RemotePath, serverName);
Console.WriteLine(url);
FtpWebRequest request = CreateConnection(url, WebRequestMethods.Ftp.DownloadFile);
request.ContentOffset = fs.Length;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
fs.Position = fs.Length;
byte[] buffer = new byte[1024 * 4];
int count = response.GetResponseStream().Read(buffer, 0, buffer.Length);
while (count > 0)
{
fs.Write(buffer, 0, count);
count = response.GetResponseStream().Read(buffer, 0, buffer.Length);
}
response.GetResponseStream().Close();
}
result = true;
}
catch (WebException ex)
{
// 處理ftp連接中的異常
}
}
return result;
}
}
}
具體FtpWebRequest查看文檔:
https://msdn.microsoft.com/zh-cn/library/system.net.ftpwebrequest.usepassive(v=vs.110).aspx