123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using System.IO;
- using System.Threading;
- namespace SiwiFms.Helper
- {
- public class FtpHelper
- {
- // 默认常量定义
- public static 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(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)
- {
- }
- public FtpHelper(string host, string username, string password,int port)
- : this(host, username, password, port, 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连接中的异常
- throw ex;
- }
- }
- return result;
- }
- //main函数
- //static void Main(string[] args)
- //{
- // FtpHelper ftpHelper = new FtpHelper("ftp://192.168.202.54/", "fileftp", "123456");
- // ftpHelper.RemotePath = "fsa/";
- // //下载
- // //ftpHelper.Download("java.rar", "D:\\java1.rar");
- // //上传
- // FileInfo fileInfo = new FileInfo("Z:\\A.nc");
- // ftpHelper.Upload(fileInfo, "K.txt");
- //}
- }
- }
|