123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Threading.Tasks;
- namespace BaseLibComm
- {
- public class FtpClient
- {
- #region 构造函数
- /// <summary>
- /// 创建FTP工具
- /// <para>
- /// 默认不使用SSL,使用二进制传输方式,使用被动模式
- /// </para>
- /// </summary>
- /// <param name="host">主机名称</param>
- /// <param name="userId">用户名</param>
- /// <param name="password">密码</param>
- public FtpClient(string host, string userId, string password)
- : this(host, userId, password, 21, null, false, true, true)
- {
- }
- /// <summary>
- /// 创建FTP工具
- /// </summary>
- /// <param name="host">主机名称</param>
- /// <param name="userId">用户名</param>
- /// <param name="password">密码</param>
- /// <param name="port">端口</param>
- /// <param name="enableSsl">允许Ssl</param>
- /// <param name="proxy">代理</param>
- /// <param name="useBinary">允许二进制</param>
- /// <param name="usePassive">允许被动模式</param>
- public FtpClient(string host, string userId, string password, int port, IWebProxy proxy, bool enableSsl, bool useBinary, bool usePassive)
- {
- this.UserId = userId;
- this.Password = password;
- if (host.ToLower().StartsWith("ftp://"))
- {
- this.host = host;
- }
- else
- {
- this.host = "ftp://" + host;
- }
- this.Port = port;
- this.Proxy = proxy;
- this.EnableSsl = enableSsl;
- this.UseBinary = useBinary;
- this.UsePassive = usePassive;
- }
- #endregion
- #region Property
- private string host = string.Empty;
-
- public string Host
- {
- get
- {
- return this.host ?? string.Empty;
- }
- }
- public string UserId { get; } = string.Empty;// 登录用户名
- public string Password { get; } = string.Empty;// 密码
- public IWebProxy Proxy { get; set; } = null;// 代理
- public int Port { get; set; } = 21;// 端口
- public bool EnableSsl { get; } = false;// EnableSsl 设置是否允许Ssl
- public bool UsePassive { get; set; } = true;// 被动模式 使用被动模式
- public bool UseBinary { get; set; } = true;// 二进制方式
-
- private string remotePath = "/";
-
- public string RemotePath //返回FTP服务器上的当前路径(可以是 / 或 /a/../ 的形式)
- {
- get
- {
- return remotePath;
- }
- set
- {
- string result = "/";
- if (!string.IsNullOrEmpty(value) && value != "/")
- {
- result = "/" + value.TrimStart('/').TrimEnd('/') + "/";
- }
- this.remotePath = result;
- }
- }
-
- #endregion
- #region 创建一个FTP连接
- /// <summary>
- /// 创建一个FTP请求
- /// </summary>
- /// <param name="url">请求地址</param>
- /// <param name="method">请求方法</param>
- /// <returns>FTP请求</returns>
- private FtpWebRequest CreateRequest(string url, string method)
- {
- //建立连接
- FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
- request.Credentials = new NetworkCredential(UserId, Password);
- request.Proxy = Proxy;
- request.KeepAlive = false;//命令执行完毕之后关闭连接
- request.UseBinary = UseBinary;
- request.UsePassive = UsePassive;
- request.EnableSsl = EnableSsl;
- request.Method = method;
- return request;
- }
- #endregion
- #region 上传一个文件到远端路径下
- /// <summary>
- /// 把文件上传到FTP服务器的RemotePath下
- /// </summary>
- /// <param name="localFile">本地文件信息</param>
- /// <param name="remoteFileName">要保存到FTP文件服务器上的名称</param>
- public bool Upload(FileInfo localFile, string remoteFileName)
- {
- bool result = false;
- if (localFile.Exists)
- {
- string url = Host.TrimEnd('/') + RemotePath + remoteFileName;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.UploadFile);
- //上传数据
- using (Stream rs = request.GetRequestStream())
- using (FileStream fs = localFile.OpenRead())
- {
- byte[] buffer = new byte[4096];//4K
- 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;
- }
- return result;
- }
- throw new Exception(string.Format("本地文件不存在,文件路径:{0}", localFile.FullName));
- }
- #endregion
- #region 从FTP服务器上下载文件
- /// <summary>
- /// 从当前目录下下载文件
- /// <para>
- /// 如果本地文件存在,则从本地文件结束的位置开始下载.
- /// </para>
- /// </summary>
- /// <param name="serverName">服务器上的文件名称</param>
- /// <param name="localName">本地文件名称</param>
- /// <returns>返回一个值,指示是否下载成功</returns>
- public bool Download(string serverName, string localName)
- {
- bool result = false;
- using (FileStream fs = new FileStream(localName, FileMode.OpenOrCreate)) //创建或打开本地文件
- {
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath + serverName;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.DownloadFile);
- request.ContentOffset = fs.Length;
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- fs.Position = fs.Length;
- byte[] buffer = new byte[4096];//4K
- 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;
- }
- return result;
- }
- #endregion
- #region 重命名FTP服务器上的文件
- /// <summary>
- /// 文件更名
- /// </summary>
- /// <param name="oldFileName">原文件名</param>
- /// <param name="newFileName">新文件名</param>
- /// <returns>返回一个值,指示更名是否成功</returns>
- public bool Rename(string oldFileName, string newFileName)
- {
- bool result = false;
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath + oldFileName;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.Rename);
- request.RenameTo = newFileName;
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- result = true;
- }
- return result;
- }
- #endregion
- #region 从当前目录下获取文件列表
- /// <summary>
- /// 获取当前目录下文件列表
- /// </summary>
- /// <returns></returns>
- public List<string> GetFileList()
- {
- List<string> result = new List<string>();
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath;//string url = (Host +":"+ Port).TrimEnd('/') + RemotePath;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectory);
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名
- string line = reader.ReadLine();
- while (line != null)
- {
- result.Add(line);
- line = reader.ReadLine();
- }
- }
- return result;
- }
- #endregion
- #region 从FTP服务器上获取文件和文件夹列表
- /// <summary>
- /// 获取详细列表 从FTP服务器上获取文件和文件夹列表
- /// </summary>
- /// <returns></returns>
- public List<string> GetFileDetails()
- {
- List<string> result = new List<string>();
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.ListDirectoryDetails);
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名
- string line = reader.ReadLine();
- while (line != null)
- {
- result.Add(line);
- line = reader.ReadLine();
- }
- }
- return result;
- }
- #endregion
- #region 从FTP服务器上删除文件
- /// <summary>
- /// 删除FTP服务器上的文件
- /// </summary>
- /// <param name="fileName">文件名称</param>
- /// <returns>返回一个值,指示是否删除成功</returns>
- public bool DeleteFile(string fileName)
- {
- bool result = false;
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath + fileName;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.DeleteFile);
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- result = true;
- }
- return result;
- }
- #endregion
- #region 在FTP服务器上创建目录
- /// <summary>
- /// 在当前目录下创建文件夹
- /// </summary>
- /// <param name="dirName">文件夹名称</param>
- /// <returns>返回一个值,指示是否创建成功</returns>
- public bool MakeDirectory(string dirName)
- {
- bool result = false;
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath + dirName;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.MakeDirectory);
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- result = true;
- }
- return result;
- }
- #endregion
- #region 从FTP服务器上删除目录
- /// <summary>
- /// 删除文件夹
- /// </summary>
- /// <param name="dirName">文件夹名称</param>
- /// <returns>返回一个值,指示是否删除成功</returns>
- public bool DeleteDirectory(string dirName)
- {
- bool result = false;
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath + dirName;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.RemoveDirectory);
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- result = true;
- }
- return result;
- }
- #endregion
- #region 从FTP服务器上获取文件大小
- /// <summary>
- /// 获取文件大小
- /// </summary>
- /// <param name="fileName"></param>
- /// <returns></returns>
- public long GetFileSize(string fileName)
- {
- long result = 0;
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath + fileName;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.GetFileSize);
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- result = response.ContentLength;
- }
- return result;
- }
- #endregion
- #region 给FTP服务器上的文件追加内容
- /// <summary>
- /// 给FTP服务器上的文件追加内容
- /// </summary>
- /// <param name="localFile">本地文件</param>
- /// <param name="remoteFileName">FTP服务器上的文件</param>
- /// <returns>返回一个值,指示是否追加成功</returns>
- public bool Append(FileInfo localFile, string remoteFileName)
- {
- if (localFile.Exists)
- {
- using (FileStream fs = new FileStream(localFile.FullName, FileMode.Open))
- {
- return Append(fs, remoteFileName);
- }
- }
- throw new Exception(string.Format("本地文件不存在,文件路径:{0}", localFile.FullName));
- }
- /// <summary>
- /// 给FTP服务器上的文件追加内容
- /// </summary>
- /// <param name="stream">数据流(可通过设置偏移来实现从特定位置开始上传)</param>
- /// <param name="remoteFileName">FTP服务器上的文件</param>
- /// <returns>返回一个值,指示是否追加成功</returns>
- public bool Append(Stream stream, string remoteFileName)
- {
- bool result = false;
- if (stream != null && stream.CanRead)
- {
- //建立连接
- string url = Host.TrimEnd('/') + RemotePath + remoteFileName;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.AppendFile);
- using (Stream rs = request.GetRequestStream())
- {
- //上传数据
- byte[] buffer = new byte[4096];//4K
- int count = stream.Read(buffer, 0, buffer.Length);
- while (count > 0)
- {
- rs.Write(buffer, 0, count);
- count = stream.Read(buffer, 0, buffer.Length);
- }
- result = true;
- }
- }
- return result;
- }
- #endregion
- #region 获取FTP服务器上的当前路径
- /// <summary>
- /// 获取FTP服务器上的当前路径
- /// </summary>
- public string CurrentDirectory
- {
- get
- {
- string result = string.Empty;
- string url = Host.TrimEnd('/') + RemotePath;
- FtpWebRequest request = CreateRequest(url, WebRequestMethods.Ftp.PrintWorkingDirectory);
- using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
- {
- string temp = response.StatusDescription;
- int start = temp.IndexOf('"') + 1;
- int end = temp.LastIndexOf('"');
- if (end >= start)
- {
- result = temp.Substring(start, end - start);
- }
- }
- return result;
- }
- }
- #endregion
- #region 检查当前路径上是否存在某个文件
- /// <summary>
- /// 检查文件是否存在
- /// </summary>
- /// <param name="fileName">要检查的文件名</param>
- /// <returns>返回一个值,指示要检查的文件是否存在</returns>
- public bool CheckFileExist(string fileName)
- {
- bool result = false;
- if (fileName != null && fileName.Trim().Length > 0)
- {
- fileName = fileName.Trim();
- List<string> files = GetFileList();
- if (files != null && files.Count > 0)
- {
- foreach (string file in files)
- {
- if (file.ToLower() == fileName.ToLower())
- {
- result = true;
- break;
- }
- }
- }
- }
- return result;
- }
- #endregion
- }
- }
|