- <pre class="csharp" name="code"><pre class="csharp" name="code">using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using System.IO;
- namespace JianKunKing.Common.Ftp
- {
- /// <summary>
- /// ftp方式文件下载上传
- /// </summary>
- public static class FileUpDownload
- {
- #region 变量属性
- /// <summary>
- /// Ftp服务器ip
- /// </summary>
- public static string FtpServerIP = string.Empty;
- /// <summary>
- /// Ftp 指定用户名
- /// </summary>
- public static string FtpUserID = string.Empty;
- /// <summary>
- /// Ftp 指定用户密码
- /// </summary>
- public static string FtpPassword = string.Empty;
- #endregion
- #region 从FTP服务器下载文件,指定本地路径和本地文件名
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpDownload(string remoteFileName, string localFileName, bool ifCredential, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP, ftpsize;
- Stream ftpStream = null;
- FtpWebResponse response = null;
- FileStream outputStream = null;
- try
- {
- outputStream = new FileStream(localFileName, FileMode.Create);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp下载目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + remoteFileName);
- ftpsize = (FtpWebRequest)FtpWebRequest.Create(uri);
- ftpsize.UseBinary = true;
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.UseBinary = true;
- reqFTP.KeepAlive = false;
- if (ifCredential)//使用用户身份认证
- {
- ftpsize.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- }
- ftpsize.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse();
- long totalBytes = re.ContentLength;
- re.Close();
- reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
- response = (FtpWebResponse)reqFTP.GetResponse();
- ftpStream = response.GetResponseStream();
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, 0);//更新进度条
- }
- long totalDownloadedByte = 0;
- int bufferSize = 2048;
- int readCount;
- byte[] buffer = new byte[bufferSize];
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- while (readCount > 0)
- {
- totalDownloadedByte = readCount + totalDownloadedByte;
- outputStream.Write(buffer, 0, readCount);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, (int)totalDownloadedByte);//更新进度条
- }
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- }
- ftpStream.Close();
- outputStream.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (ftpStream != null)
- {
- ftpStream.Close();
- }
- if (outputStream != null)
- {
- outputStream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名(支持断点下载)
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="size">已下载文件流大小</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpBrokenDownload(string remoteFileName, string localFileName, bool ifCredential, long size, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP, ftpsize;
- Stream ftpStream = null;
- FtpWebResponse response = null;
- FileStream outputStream = null;
- try
- {
- outputStream = new FileStream(localFileName, FileMode.Append);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp下载目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + remoteFileName);
- ftpsize = (FtpWebRequest)FtpWebRequest.Create(uri);
- ftpsize.UseBinary = true;
- ftpsize.ContentOffset = size;
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.UseBinary = true;
- reqFTP.KeepAlive = false;
- reqFTP.ContentOffset = size;
- if (ifCredential)//使用用户身份认证
- {
- ftpsize.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- }
- ftpsize.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse();
- long totalBytes = re.ContentLength;
- re.Close();
- reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
- response = (FtpWebResponse)reqFTP.GetResponse();
- ftpStream = response.GetResponseStream();
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, 0);//更新进度条
- }
- long totalDownloadedByte = 0;
- int bufferSize = 2048;
- int readCount;
- byte[] buffer = new byte[bufferSize];
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- while (readCount > 0)
- {
- totalDownloadedByte = readCount + totalDownloadedByte;
- outputStream.Write(buffer, 0, readCount);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, (int)totalDownloadedByte);//更新进度条
- }
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- }
- ftpStream.Close();
- outputStream.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (ftpStream != null)
- {
- ftpStream.Close();
- }
- if (outputStream != null)
- {
- outputStream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <param name="brokenOpen">是否断点下载:true 会在localFileName 找是否存在已经下载的文件,并计算文件流大小</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpDownload(string remoteFileName, string localFileName, bool ifCredential, bool brokenOpen, Action<int, int> updateProgress = null)
- {
- if (brokenOpen)
- {
- try
- {
- long size = 0;
- if (File.Exists(localFileName))
- {
- using (FileStream outputStream = new FileStream(localFileName, FileMode.Open))
- {
- size = outputStream.Length;
- }
- }
- return FtpBrokenDownload(remoteFileName, localFileName, ifCredential, size, updateProgress);
- }
- catch
- {
- throw;
- }
- }
- else
- {
- return FtpDownload(remoteFileName, localFileName, ifCredential, updateProgress);
- }
- }
- #endregion
- #region 上传文件到FTP服务器
- /// <summary>
- /// 上传文件到FTP服务器
- /// </summary>
- /// <param name="localFullPath">本地带有完整路径的文件名</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpUploadFile(string localFullPathName, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP;
- Stream stream = null;
- FtpWebResponse response = null;
- FileStream fs = null;
- try
- {
- FileInfo finfo = new FileInfo(localFullPathName);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp上传目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + finfo.Name);
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.KeepAlive = false;
- reqFTP.UseBinary = true;
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);//用户,密码
- reqFTP.Method = WebRequestMethods.Ftp.UploadFile;//向服务器发出下载请求命令
- reqFTP.ContentLength = finfo.Length;//为request指定上传文件的大小
- response = reqFTP.GetResponse() as FtpWebResponse;
- reqFTP.ContentLength = finfo.Length;
- int buffLength = 1024;
- byte[] buff = new byte[buffLength];
- int contentLen;
- fs = finfo.OpenRead();
- stream = reqFTP.GetRequestStream();
- contentLen = fs.Read(buff, 0, buffLength);
- int allbye = (int)finfo.Length;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, 0);//更新进度条
- }
- int startbye = 0;
- while (contentLen != 0)
- {
- startbye = contentLen + startbye;
- stream.Write(buff, 0, contentLen);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startbye);//更新进度条
- }
- contentLen = fs.Read(buff, 0, buffLength);
- }
- stream.Close();
- fs.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- }
- if (stream != null)
- {
- stream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 上传文件到FTP服务器(断点续传)
- /// </summary>
- /// <param name="localFullPath">本地文件全路径名称:C:UsersJianKunKingDesktopIronPython脚本测试工具</param>
- /// <param name="remoteFilepath">远程文件所在文件夹路径</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns></returns>
- public static bool FtpUploadBroken(string localFullPath, string remoteFilepath, Action<int, int> updateProgress = null)
- {
- if (remoteFilepath == null)
- {
- remoteFilepath = "";
- }
- string newFileName = string.Empty;
- bool success = true;
- FileInfo fileInf = new FileInfo(localFullPath);
- long allbye = (long)fileInf.Length;
- if (fileInf.Name.IndexOf("#") == -1)
- {
- newFileName = RemoveSpaces(fileInf.Name);
- }
- else
- {
- newFileName = fileInf.Name.Replace("#", "#");
- newFileName = RemoveSpaces(newFileName);
- }
- long startfilesize = GetFileSize(newFileName, remoteFilepath);
- if (startfilesize >= allbye)
- {
- return false;
- }
- long startbye = startfilesize;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startfilesize);//更新进度条
- }
- string uri;
- if (remoteFilepath.Length == 0)
- {
- uri = "ftp://" + FtpServerIP + "/" + newFileName;
- }
- else
- {
- uri = "ftp://" + FtpServerIP + "/" + remoteFilepath + "/" + newFileName;
- }
- FtpWebRequest reqFTP;
- // 根据uri创建FtpWebRequest对象
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
- // ftp用户名和密码
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- // 默认为true,连接不会被关闭
- // 在一个命令之后被执行
- reqFTP.KeepAlive = false;
- // 指定执行什么命令
- reqFTP.Method = WebRequestMethods.Ftp.AppendFile;
- // 指定数据传输类型
- reqFTP.UseBinary = true;
- // 上传文件时通知服务器文件的大小
- reqFTP.ContentLength = fileInf.Length;
- int buffLength = 2048;// 缓冲大小设置为2kb
- byte[] buff = new byte[buffLength];
- // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
- FileStream fs = fileInf.OpenRead();
- Stream strm = null;
- try
- {
- // 把上传的文件写入流
- strm = reqFTP.GetRequestStream();
- // 每次读文件流的2kb
- fs.Seek(startfilesize, 0);
- int contentLen = fs.Read(buff, 0, buffLength);
- // 流内容没有结束
- while (contentLen != 0)
- {
- // 把内容从file stream 写入 upload stream
- strm.Write(buff, 0, contentLen);
- contentLen = fs.Read(buff, 0, buffLength);
- startbye += contentLen;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startbye);//更新进度条
- }
- }
- // 关闭两个流
- strm.Close();
- fs.Close();
- }
- catch
- {
- success = false;
- throw;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- }
- if (strm != null)
- {
- strm.Close();
- }
- }
- return success;
- }
- /// <summary>
- /// 去除空格
- /// </summary>
- /// <param name="str"></param>
- /// <returns></returns>
- private static string RemoveSpaces(string str)
- {
- string a = "";
- CharEnumerator CEnumerator = str.GetEnumerator();
- while (CEnumerator.MoveNext())
- {
- byte[] array = new byte[1];
- array = System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString());
- int asciicode = (short)(array[0]);
- if (asciicode != 32)
- {
- a += CEnumerator.Current.ToString();
- }
- }
- string sdate = System.DateTime.Now.Year.ToString() + System.DateTime.Now.Month.ToString() + System.DateTime.Now.Day.ToString() + System.DateTime.Now.Hour.ToString()
- + System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Second.ToString() + System.DateTime.Now.Millisecond.ToString();
- return a.Split('.')[a.Split('.').Length - 2] + "." + a.Split('.')[a.Split('.').Length - 1];
- }
- /// <summary>
- /// 获取已上传文件大小
- /// </summary>
- /// <param name="filename">文件名称</param>
- /// <param name="path">服务器文件路径</param>
- /// <returns></returns>
- public static long GetFileSize(string filename, string remoteFilepath)
- {
- long filesize = 0;
- try
- {
- FtpWebRequest reqFTP;
- FileInfo fi = new FileInfo(filename);
- string uri;
- if (remoteFilepath.Length == 0)
- {
- uri = "ftp://" + FtpServerIP + "/" + fi.Name;
- }
- else
- {
- uri = "ftp://" + FtpServerIP + "/" + remoteFilepath + "/" + fi.Name;
- }
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.KeepAlive = false;
- reqFTP.UseBinary = true;
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);//用户,密码
- reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
- filesize = response.ContentLength;
- return filesize;
- }
- catch
- {
- return 0;
- }
- }
- //public void Connect(String path, string ftpUserID, string ftpPassword)//连接ftp
- //{
- // // 根据uri创建FtpWebRequest对象
- // reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
- // // 指定数据传输类型
- // reqFTP.UseBinary = true;
- // // ftp用户名和密码
- // reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
- //}
- #endregion
- }
- }</pre><br></pre>
- <pre class="csharp" name="code">using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using System.IO;
- namespace JianKunKing.Common.Ftp
- {
- /// <summary>
- /// ftp方式文件下载上传
- /// </summary>
- public static class FileUpDownload
- {
- #region 变量属性
- /// <summary>
- /// Ftp服务器ip
- /// </summary>
- public static string FtpServerIP = string.Empty;
- /// <summary>
- /// Ftp 指定用户名
- /// </summary>
- public static string FtpUserID = string.Empty;
- /// <summary>
- /// Ftp 指定用户密码
- /// </summary>
- public static string FtpPassword = string.Empty;
- #endregion
- #region 从FTP服务器下载文件,指定本地路径和本地文件名
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpDownload(string remoteFileName, string localFileName, bool ifCredential, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP, ftpsize;
- Stream ftpStream = null;
- FtpWebResponse response = null;
- FileStream outputStream = null;
- try
- {
- outputStream = new FileStream(localFileName, FileMode.Create);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp下载目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + remoteFileName);
- ftpsize = (FtpWebRequest)FtpWebRequest.Create(uri);
- ftpsize.UseBinary = true;
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.UseBinary = true;
- reqFTP.KeepAlive = false;
- if (ifCredential)//使用用户身份认证
- {
- ftpsize.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- }
- ftpsize.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse();
- long totalBytes = re.ContentLength;
- re.Close();
- reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
- response = (FtpWebResponse)reqFTP.GetResponse();
- ftpStream = response.GetResponseStream();
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, 0);//更新进度条
- }
- long totalDownloadedByte = 0;
- int bufferSize = 2048;
- int readCount;
- byte[] buffer = new byte[bufferSize];
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- while (readCount > 0)
- {
- totalDownloadedByte = readCount + totalDownloadedByte;
- outputStream.Write(buffer, 0, readCount);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, (int)totalDownloadedByte);//更新进度条
- }
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- }
- ftpStream.Close();
- outputStream.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (ftpStream != null)
- {
- ftpStream.Close();
- }
- if (outputStream != null)
- {
- outputStream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名(支持断点下载)
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="size">已下载文件流大小</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpBrokenDownload(string remoteFileName, string localFileName, bool ifCredential, long size, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP, ftpsize;
- Stream ftpStream = null;
- FtpWebResponse response = null;
- FileStream outputStream = null;
- try
- {
- outputStream = new FileStream(localFileName, FileMode.Append);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp下载目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + remoteFileName);
- ftpsize = (FtpWebRequest)FtpWebRequest.Create(uri);
- ftpsize.UseBinary = true;
- ftpsize.ContentOffset = size;
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.UseBinary = true;
- reqFTP.KeepAlive = false;
- reqFTP.ContentOffset = size;
- if (ifCredential)//使用用户身份认证
- {
- ftpsize.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- }
- ftpsize.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse();
- long totalBytes = re.ContentLength;
- re.Close();
- reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
- response = (FtpWebResponse)reqFTP.GetResponse();
- ftpStream = response.GetResponseStream();
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, 0);//更新进度条
- }
- long totalDownloadedByte = 0;
- int bufferSize = 2048;
- int readCount;
- byte[] buffer = new byte[bufferSize];
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- while (readCount > 0)
- {
- totalDownloadedByte = readCount + totalDownloadedByte;
- outputStream.Write(buffer, 0, readCount);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, (int)totalDownloadedByte);//更新进度条
- }
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- }
- ftpStream.Close();
- outputStream.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (ftpStream != null)
- {
- ftpStream.Close();
- }
- if (outputStream != null)
- {
- outputStream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <param name="brokenOpen">是否断点下载:true 会在localFileName 找是否存在已经下载的文件,并计算文件流大小</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpDownload(string remoteFileName, string localFileName, bool ifCredential, bool brokenOpen, Action<int, int> updateProgress = null)
- {
- if (brokenOpen)
- {
- try
- {
- long size = 0;
- if (File.Exists(localFileName))
- {
- using (FileStream outputStream = new FileStream(localFileName, FileMode.Open))
- {
- size = outputStream.Length;
- }
- }
- return FtpBrokenDownload(remoteFileName, localFileName, ifCredential, size, updateProgress);
- }
- catch
- {
- throw;
- }
- }
- else
- {
- return FtpDownload(remoteFileName, localFileName, ifCredential, updateProgress);
- }
- }
- #endregion
- #region 上传文件到FTP服务器
- /// <summary>
- /// 上传文件到FTP服务器
- /// </summary>
- /// <param name="localFullPath">本地带有完整路径的文件名</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpUploadFile(string localFullPathName, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP;
- Stream stream = null;
- FtpWebResponse response = null;
- FileStream fs = null;
- try
- {
- FileInfo finfo = new FileInfo(localFullPathName);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp上传目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + finfo.Name);
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.KeepAlive = false;
- reqFTP.UseBinary = true;
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);//用户,密码
- reqFTP.Method = WebRequestMethods.Ftp.UploadFile;//向服务器发出下载请求命令
- reqFTP.ContentLength = finfo.Length;//为request指定上传文件的大小
- response = reqFTP.GetResponse() as FtpWebResponse;
- reqFTP.ContentLength = finfo.Length;
- int buffLength = 1024;
- byte[] buff = new byte[buffLength];
- int contentLen;
- fs = finfo.OpenRead();
- stream = reqFTP.GetRequestStream();
- contentLen = fs.Read(buff, 0, buffLength);
- int allbye = (int)finfo.Length;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, 0);//更新进度条
- }
- int startbye = 0;
- while (contentLen != 0)
- {
- startbye = contentLen + startbye;
- stream.Write(buff, 0, contentLen);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startbye);//更新进度条
- }
- contentLen = fs.Read(buff, 0, buffLength);
- }
- stream.Close();
- fs.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- }
- if (stream != null)
- {
- stream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 上传文件到FTP服务器(断点续传)
- /// </summary>
- /// <param name="localFullPath">本地文件全路径名称:C:UsersJianKunKingDesktopIronPython脚本测试工具</param>
- /// <param name="remoteFilepath">远程文件所在文件夹路径</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns></returns>
- public static bool FtpUploadBroken(string localFullPath, string remoteFilepath, Action<int, int> updateProgress = null)
- {
- if (remoteFilepath == null)
- {
- remoteFilepath = "";
- }
- string newFileName = string.Empty;
- bool success = true;
- FileInfo fileInf = new FileInfo(localFullPath);
- long allbye = (long)fileInf.Length;
- if (fileInf.Name.IndexOf("#") == -1)
- {
- newFileName = RemoveSpaces(fileInf.Name);
- }
- else
- {
- newFileName = fileInf.Name.Replace("#", "#");
- newFileName = RemoveSpaces(newFileName);
- }
- long startfilesize = GetFileSize(newFileName, remoteFilepath);
- if (startfilesize >= allbye)
- {
- return false;
- }
- long startbye = startfilesize;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startfilesize);//更新进度条
- }
- string uri;
- if (remoteFilepath.Length == 0)
- {
- uri = "ftp://" + FtpServerIP + "/" + newFileName;
- }
- else
- {
- uri = "ftp://" + FtpServerIP + "/" + remoteFilepath + "/" + newFileName;
- }
- FtpWebRequest reqFTP;
- // 根据uri创建FtpWebRequest对象
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
- // ftp用户名和密码
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- // 默认为true,连接不会被关闭
- // 在一个命令之后被执行
- reqFTP.KeepAlive = false;
- // 指定执行什么命令
- reqFTP.Method = WebRequestMethods.Ftp.AppendFile;
- // 指定数据传输类型
- reqFTP.UseBinary = true;
- // 上传文件时通知服务器文件的大小
- reqFTP.ContentLength = fileInf.Length;
- int buffLength = 2048;// 缓冲大小设置为2kb
- byte[] buff = new byte[buffLength];
- // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
- FileStream fs = fileInf.OpenRead();
- Stream strm = null;
- try
- {
- // 把上传的文件写入流
- strm = reqFTP.GetRequestStream();
- // 每次读文件流的2kb
- fs.Seek(startfilesize, 0);
- int contentLen = fs.Read(buff, 0, buffLength);
- // 流内容没有结束
- while (contentLen != 0)
- {
- // 把内容从file stream 写入 upload stream
- strm.Write(buff, 0, contentLen);
- contentLen = fs.Read(buff, 0, buffLength);
- startbye += contentLen;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startbye);//更新进度条
- }
- }
- // 关闭两个流
- strm.Close();
- fs.Close();
- }
- catch
- {
- success = false;
- throw;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- }
- if (strm != null)
- {
- strm.Close();
- }
- }
- return success;
- }
- /// <summary>
- /// 去除空格
- /// </summary>
- /// <param name="str"></param>
- /// <returns></returns>
- private static string RemoveSpaces(string str)
- {
- string a = "";
- CharEnumerator CEnumerator = str.GetEnumerator();
- while (CEnumerator.MoveNext())
- {
- byte[] array = new byte[1];
- array = System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString());
- int asciicode = (short)(array[0]);
- if (asciicode != 32)
- {
- a += CEnumerator.Current.ToString();
- }
- }
- string sdate = System.DateTime.Now.Year.ToString() + System.DateTime.Now.Month.ToString() + System.DateTime.Now.Day.ToString() + System.DateTime.Now.Hour.ToString()
- + System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Second.ToString() + System.DateTime.Now.Millisecond.ToString();
- return a.Split('.')[a.Split('.').Length - 2] + "." + a.Split('.')[a.Split('.').Length - 1];
- }
- /// <summary>
- /// 获取已上传文件大小
- /// </summary>
- /// <param name="filename">文件名称</param>
- /// <param name="path">服务器文件路径</param>
- /// <returns></returns>
- public static long GetFileSize(string filename, string remoteFilepath)
- {
- long filesize = 0;
- try
- {
- FtpWebRequest reqFTP;
- FileInfo fi = new FileInfo(filename);
- string uri;
- if (remoteFilepath.Length == 0)
- {
- uri = "ftp://" + FtpServerIP + "/" + fi.Name;
- }
- else
- {
- uri = "ftp://" + FtpServerIP + "/" + remoteFilepath + "/" + fi.Name;
- }
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.KeepAlive = false;
- reqFTP.UseBinary = true;
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);//用户,密码
- reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
- filesize = response.ContentLength;
- return filesize;
- }
- catch
- {
- return 0;
- }
- }
- //public void Connect(String path, string ftpUserID, string ftpPassword)//连接ftp
- //{
- // // 根据uri创建FtpWebRequest对象
- // reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
- // // 指定数据传输类型
- // reqFTP.UseBinary = true;
- // // ftp用户名和密码
- // reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
- //}
- #endregion
- }
- }</pre><br>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using System.IO;
- namespace JianKunKing.Common.Ftp
- {
- /// <summary>
- /// ftp方式文件下载上传
- /// </summary>
- public static class FileUpDownload
- {
- #region 变量属性
- /// <summary>
- /// Ftp服务器ip
- /// </summary>
- public static string FtpServerIP = string.Empty;
- /// <summary>
- /// Ftp 指定用户名
- /// </summary>
- public static string FtpUserID = string.Empty;
- /// <summary>
- /// Ftp 指定用户密码
- /// </summary>
- public static string FtpPassword = string.Empty;
- #endregion
- #region 从FTP服务器下载文件,指定本地路径和本地文件名
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpDownload(string remoteFileName, string localFileName, bool ifCredential, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP, ftpsize;
- Stream ftpStream = null;
- FtpWebResponse response = null;
- FileStream outputStream = null;
- try
- {
- outputStream = new FileStream(localFileName, FileMode.Create);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp下载目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + remoteFileName);
- ftpsize = (FtpWebRequest)FtpWebRequest.Create(uri);
- ftpsize.UseBinary = true;
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.UseBinary = true;
- reqFTP.KeepAlive = false;
- if (ifCredential)//使用用户身份认证
- {
- ftpsize.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- }
- ftpsize.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse();
- long totalBytes = re.ContentLength;
- re.Close();
- reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
- response = (FtpWebResponse)reqFTP.GetResponse();
- ftpStream = response.GetResponseStream();
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, 0);//更新进度条
- }
- long totalDownloadedByte = 0;
- int bufferSize = 2048;
- int readCount;
- byte[] buffer = new byte[bufferSize];
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- while (readCount > 0)
- {
- totalDownloadedByte = readCount + totalDownloadedByte;
- outputStream.Write(buffer, 0, readCount);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, (int)totalDownloadedByte);//更新进度条
- }
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- }
- ftpStream.Close();
- outputStream.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (ftpStream != null)
- {
- ftpStream.Close();
- }
- if (outputStream != null)
- {
- outputStream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名(支持断点下载)
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="size">已下载文件流大小</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpBrokenDownload(string remoteFileName, string localFileName, bool ifCredential, long size, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP, ftpsize;
- Stream ftpStream = null;
- FtpWebResponse response = null;
- FileStream outputStream = null;
- try
- {
- outputStream = new FileStream(localFileName, FileMode.Append);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp下载目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + remoteFileName);
- ftpsize = (FtpWebRequest)FtpWebRequest.Create(uri);
- ftpsize.UseBinary = true;
- ftpsize.ContentOffset = size;
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.UseBinary = true;
- reqFTP.KeepAlive = false;
- reqFTP.ContentOffset = size;
- if (ifCredential)//使用用户身份认证
- {
- ftpsize.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- }
- ftpsize.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse();
- long totalBytes = re.ContentLength;
- re.Close();
- reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
- response = (FtpWebResponse)reqFTP.GetResponse();
- ftpStream = response.GetResponseStream();
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, 0);//更新进度条
- }
- long totalDownloadedByte = 0;
- int bufferSize = 2048;
- int readCount;
- byte[] buffer = new byte[bufferSize];
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- while (readCount > 0)
- {
- totalDownloadedByte = readCount + totalDownloadedByte;
- outputStream.Write(buffer, 0, readCount);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)totalBytes, (int)totalDownloadedByte);//更新进度条
- }
- readCount = ftpStream.Read(buffer, 0, bufferSize);
- }
- ftpStream.Close();
- outputStream.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (ftpStream != null)
- {
- ftpStream.Close();
- }
- if (outputStream != null)
- {
- outputStream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 从FTP服务器下载文件,指定本地路径和本地文件名
- /// </summary>
- /// <param name="remoteFileName">远程文件名</param>
- /// <param name="localFileName">保存本地的文件名(包含路径)</param>
- /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <param name="brokenOpen">是否断点下载:true 会在localFileName 找是否存在已经下载的文件,并计算文件流大小</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpDownload(string remoteFileName, string localFileName, bool ifCredential, bool brokenOpen, Action<int, int> updateProgress = null)
- {
- if (brokenOpen)
- {
- try
- {
- long size = 0;
- if (File.Exists(localFileName))
- {
- using (FileStream outputStream = new FileStream(localFileName, FileMode.Open))
- {
- size = outputStream.Length;
- }
- }
- return FtpBrokenDownload(remoteFileName, localFileName, ifCredential, size, updateProgress);
- }
- catch
- {
- throw;
- }
- }
- else
- {
- return FtpDownload(remoteFileName, localFileName, ifCredential, updateProgress);
- }
- }
- #endregion
- #region 上传文件到FTP服务器
- /// <summary>
- /// 上传文件到FTP服务器
- /// </summary>
- /// <param name="localFullPath">本地带有完整路径的文件名</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns>是否下载成功</returns>
- public static bool FtpUploadFile(string localFullPathName, Action<int, int> updateProgress = null)
- {
- FtpWebRequest reqFTP;
- Stream stream = null;
- FtpWebResponse response = null;
- FileStream fs = null;
- try
- {
- FileInfo finfo = new FileInfo(localFullPathName);
- if (FtpServerIP == null || FtpServerIP.Trim().Length == 0)
- {
- throw new Exception("ftp上传目标服务器地址未设置!");
- }
- Uri uri = new Uri("ftp://" + FtpServerIP + "/" + finfo.Name);
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.KeepAlive = false;
- reqFTP.UseBinary = true;
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);//用户,密码
- reqFTP.Method = WebRequestMethods.Ftp.UploadFile;//向服务器发出下载请求命令
- reqFTP.ContentLength = finfo.Length;//为request指定上传文件的大小
- response = reqFTP.GetResponse() as FtpWebResponse;
- reqFTP.ContentLength = finfo.Length;
- int buffLength = 1024;
- byte[] buff = new byte[buffLength];
- int contentLen;
- fs = finfo.OpenRead();
- stream = reqFTP.GetRequestStream();
- contentLen = fs.Read(buff, 0, buffLength);
- int allbye = (int)finfo.Length;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, 0);//更新进度条
- }
- int startbye = 0;
- while (contentLen != 0)
- {
- startbye = contentLen + startbye;
- stream.Write(buff, 0, contentLen);
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startbye);//更新进度条
- }
- contentLen = fs.Read(buff, 0, buffLength);
- }
- stream.Close();
- fs.Close();
- response.Close();
- return true;
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- }
- if (stream != null)
- {
- stream.Close();
- }
- if (response != null)
- {
- response.Close();
- }
- }
- }
- /// <summary>
- /// 上传文件到FTP服务器(断点续传)
- /// </summary>
- /// <param name="localFullPath">本地文件全路径名称:C:UsersJianKunKingDesktopIronPython脚本测试工具</param>
- /// <param name="remoteFilepath">远程文件所在文件夹路径</param>
- /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param>
- /// <returns></returns>
- public static bool FtpUploadBroken(string localFullPath, string remoteFilepath, Action<int, int> updateProgress = null)
- {
- if (remoteFilepath == null)
- {
- remoteFilepath = "";
- }
- string newFileName = string.Empty;
- bool success = true;
- FileInfo fileInf = new FileInfo(localFullPath);
- long allbye = (long)fileInf.Length;
- if (fileInf.Name.IndexOf("#") == -1)
- {
- newFileName = RemoveSpaces(fileInf.Name);
- }
- else
- {
- newFileName = fileInf.Name.Replace("#", "#");
- newFileName = RemoveSpaces(newFileName);
- }
- long startfilesize = GetFileSize(newFileName, remoteFilepath);
- if (startfilesize >= allbye)
- {
- return false;
- }
- long startbye = startfilesize;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startfilesize);//更新进度条
- }
- string uri;
- if (remoteFilepath.Length == 0)
- {
- uri = "ftp://" + FtpServerIP + "/" + newFileName;
- }
- else
- {
- uri = "ftp://" + FtpServerIP + "/" + remoteFilepath + "/" + newFileName;
- }
- FtpWebRequest reqFTP;
- // 根据uri创建FtpWebRequest对象
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
- // ftp用户名和密码
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);
- // 默认为true,连接不会被关闭
- // 在一个命令之后被执行
- reqFTP.KeepAlive = false;
- // 指定执行什么命令
- reqFTP.Method = WebRequestMethods.Ftp.AppendFile;
- // 指定数据传输类型
- reqFTP.UseBinary = true;
- // 上传文件时通知服务器文件的大小
- reqFTP.ContentLength = fileInf.Length;
- int buffLength = 2048;// 缓冲大小设置为2kb
- byte[] buff = new byte[buffLength];
- // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
- FileStream fs = fileInf.OpenRead();
- Stream strm = null;
- try
- {
- // 把上传的文件写入流
- strm = reqFTP.GetRequestStream();
- // 每次读文件流的2kb
- fs.Seek(startfilesize, 0);
- int contentLen = fs.Read(buff, 0, buffLength);
- // 流内容没有结束
- while (contentLen != 0)
- {
- // 把内容从file stream 写入 upload stream
- strm.Write(buff, 0, contentLen);
- contentLen = fs.Read(buff, 0, buffLength);
- startbye += contentLen;
- //更新进度
- if (updateProgress != null)
- {
- updateProgress((int)allbye, (int)startbye);//更新进度条
- }
- }
- // 关闭两个流
- strm.Close();
- fs.Close();
- }
- catch
- {
- success = false;
- throw;
- }
- finally
- {
- if (fs != null)
- {
- fs.Close();
- }
- if (strm != null)
- {
- strm.Close();
- }
- }
- return success;
- }
- /// <summary>
- /// 去除空格
- /// </summary>
- /// <param name="str"></param>
- /// <returns></returns>
- private static string RemoveSpaces(string str)
- {
- string a = "";
- CharEnumerator CEnumerator = str.GetEnumerator();
- while (CEnumerator.MoveNext())
- {
- byte[] array = new byte[1];
- array = System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString());
- int asciicode = (short)(array[0]);
- if (asciicode != 32)
- {
- a += CEnumerator.Current.ToString();
- }
- }
- string sdate = System.DateTime.Now.Year.ToString() + System.DateTime.Now.Month.ToString() + System.DateTime.Now.Day.ToString() + System.DateTime.Now.Hour.ToString()
- + System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Second.ToString() + System.DateTime.Now.Millisecond.ToString();
- return a.Split('.')[a.Split('.').Length - 2] + "." + a.Split('.')[a.Split('.').Length - 1];
- }
- /// <summary>
- /// 获取已上传文件大小
- /// </summary>
- /// <param name="filename">文件名称</param>
- /// <param name="path">服务器文件路径</param>
- /// <returns></returns>
- public static long GetFileSize(string filename, string remoteFilepath)
- {
- long filesize = 0;
- try
- {
- FtpWebRequest reqFTP;
- FileInfo fi = new FileInfo(filename);
- string uri;
- if (remoteFilepath.Length == 0)
- {
- uri = "ftp://" + FtpServerIP + "/" + fi.Name;
- }
- else
- {
- uri = "ftp://" + FtpServerIP + "/" + remoteFilepath + "/" + fi.Name;
- }
- reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
- reqFTP.KeepAlive = false;
- reqFTP.UseBinary = true;
- reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);//用户,密码
- reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
- FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
- filesize = response.ContentLength;
- return filesize;
- }
- catch
- {
- return 0;
- }
- }
- //public void Connect(String path, string ftpUserID, string ftpPassword)//连接ftp
- //{
- // // 根据uri创建FtpWebRequest对象
- // reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
- // // 指定数据传输类型
- // reqFTP.UseBinary = true;
- // // ftp用户名和密码
- // reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
- //}
- #endregion
- }
- }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; namespace JianKunKing.Common.Ftp { /// <summary> /// ftp方式文件下载上传 /// </summary> public static class FileUpDownload { #region 变量属性 /// <summary> /// Ftp服务器ip /// </summary> public static string FtpServerIP = string.Empty; /// <summary> /// Ftp 指定用户名 /// </summary> public static string FtpUserID = string.Empty; /// <summary> /// Ftp 指定用户密码 /// </summary> public static string FtpPassword = string.Empty; #endregion #region 从FTP服务器下载文件,指定本地路径和本地文件名 /// <summary> /// 从FTP服务器下载文件,指定本地路径和本地文件名 /// </summary> /// <param name="remoteFileName">远程文件名</param> /// <param name="localFileName">保存本地的文件名(包含路径)</param> /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param> /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param> /// <returns>是否下载成功</returns> public static bool FtpDownload(string remoteFileName, string localFileName, bool ifCredential, Action<int, int> updateProgress = null) { FtpWebRequest reqFTP, ftpsize; Stream ftpStream = null; FtpWebResponse response = null; FileStream outputStream = null; try { outputStream = new FileStream(localFileName, FileMode.Create); if (FtpServerIP == null || FtpServerIP.Trim().Length == 0) { throw new Exception("ftp下载目标服务器地址未设置!"); } Uri uri = new Uri("ftp://" + FtpServerIP + "/" + remoteFileName); ftpsize = (FtpWebRequest)FtpWebRequest.Create(uri); ftpsize.UseBinary = true; reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri); reqFTP.UseBinary = true; reqFTP.KeepAlive = false; if (ifCredential)//使用用户身份认证 { ftpsize.Credentials = new NetworkCredential(FtpUserID, FtpPassword); reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword); } ftpsize.Method = WebRequestMethods.Ftp.GetFileSize; FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse(); long totalBytes = re.ContentLength; re.Close(); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; response = (FtpWebResponse)reqFTP.GetResponse(); ftpStream = response.GetResponseStream(); //更新进度 if (updateProgress != null) { updateProgress((int)totalBytes, 0);//更新进度条 } long totalDownloadedByte = 0; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); while (readCount > 0) { totalDownloadedByte = readCount + totalDownloadedByte; outputStream.Write(buffer, 0, readCount); //更新进度 if (updateProgress != null) { updateProgress((int)totalBytes, (int)totalDownloadedByte);//更新进度条 } readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); return true; } catch (Exception) { return false; throw; } finally { if (ftpStream != null) { ftpStream.Close(); } if (outputStream != null) { outputStream.Close(); } if (response != null) { response.Close(); } } } /// <summary> /// 从FTP服务器下载文件,指定本地路径和本地文件名(支持断点下载) /// </summary> /// <param name="remoteFileName">远程文件名</param> /// <param name="localFileName">保存本地的文件名(包含路径)</param> /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param> /// <param name="size">已下载文件流大小</param> /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param> /// <returns>是否下载成功</returns> public static bool FtpBrokenDownload(string remoteFileName, string localFileName, bool ifCredential, long size, Action<int, int> updateProgress = null) { FtpWebRequest reqFTP, ftpsize; Stream ftpStream = null; FtpWebResponse response = null; FileStream outputStream = null; try { outputStream = new FileStream(localFileName, FileMode.Append); if (FtpServerIP == null || FtpServerIP.Trim().Length == 0) { throw new Exception("ftp下载目标服务器地址未设置!"); } Uri uri = new Uri("ftp://" + FtpServerIP + "/" + remoteFileName); ftpsize = (FtpWebRequest)FtpWebRequest.Create(uri); ftpsize.UseBinary = true; ftpsize.ContentOffset = size; reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri); reqFTP.UseBinary = true; reqFTP.KeepAlive = false; reqFTP.ContentOffset = size; if (ifCredential)//使用用户身份认证 { ftpsize.Credentials = new NetworkCredential(FtpUserID, FtpPassword); reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword); } ftpsize.Method = WebRequestMethods.Ftp.GetFileSize; FtpWebResponse re = (FtpWebResponse)ftpsize.GetResponse(); long totalBytes = re.ContentLength; re.Close(); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; response = (FtpWebResponse)reqFTP.GetResponse(); ftpStream = response.GetResponseStream(); //更新进度 if (updateProgress != null) { updateProgress((int)totalBytes, 0);//更新进度条 } long totalDownloadedByte = 0; int bufferSize = 2048; int readCount; byte[] buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, 0, bufferSize); while (readCount > 0) { totalDownloadedByte = readCount + totalDownloadedByte; outputStream.Write(buffer, 0, readCount); //更新进度 if (updateProgress != null) { updateProgress((int)totalBytes, (int)totalDownloadedByte);//更新进度条 } readCount = ftpStream.Read(buffer, 0, bufferSize); } ftpStream.Close(); outputStream.Close(); response.Close(); return true; } catch (Exception) { return false; throw; } finally { if (ftpStream != null) { ftpStream.Close(); } if (outputStream != null) { outputStream.Close(); } if (response != null) { response.Close(); } } } /// <summary> /// 从FTP服务器下载文件,指定本地路径和本地文件名 /// </summary> /// <param name="remoteFileName">远程文件名</param> /// <param name="localFileName">保存本地的文件名(包含路径)</param> /// <param name="ifCredential">是否启用身份验证(false:表示允许用户匿名下载)</param> /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param> /// <param name="brokenOpen">是否断点下载:true 会在localFileName 找是否存在已经下载的文件,并计算文件流大小</param> /// <returns>是否下载成功</returns> public static bool FtpDownload(string remoteFileName, string localFileName, bool ifCredential, bool brokenOpen, Action<int, int> updateProgress = null) { if (brokenOpen) { try { long size = 0; if (File.Exists(localFileName)) { using (FileStream outputStream = new FileStream(localFileName, FileMode.Open)) { size = outputStream.Length; } } return FtpBrokenDownload(remoteFileName, localFileName, ifCredential, size, updateProgress); } catch { throw; } } else { return FtpDownload(remoteFileName, localFileName, ifCredential, updateProgress); } } #endregion #region 上传文件到FTP服务器 /// <summary> /// 上传文件到FTP服务器 /// </summary> /// <param name="localFullPath">本地带有完整路径的文件名</param> /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param> /// <returns>是否下载成功</returns> public static bool FtpUploadFile(string localFullPathName, Action<int, int> updateProgress = null) { FtpWebRequest reqFTP; Stream stream = null; FtpWebResponse response = null; FileStream fs = null; try { FileInfo finfo = new FileInfo(localFullPathName); if (FtpServerIP == null || FtpServerIP.Trim().Length == 0) { throw new Exception("ftp上传目标服务器地址未设置!"); } Uri uri = new Uri("ftp://" + FtpServerIP + "/" + finfo.Name); reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri); reqFTP.KeepAlive = false; reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);//用户,密码 reqFTP.Method = WebRequestMethods.Ftp.UploadFile;//向服务器发出下载请求命令 reqFTP.ContentLength = finfo.Length;//为request指定上传文件的大小 response = reqFTP.GetResponse() as FtpWebResponse; reqFTP.ContentLength = finfo.Length; int buffLength = 1024; byte[] buff = new byte[buffLength]; int contentLen; fs = finfo.OpenRead(); stream = reqFTP.GetRequestStream(); contentLen = fs.Read(buff, 0, buffLength); int allbye = (int)finfo.Length; //更新进度 if (updateProgress != null) { updateProgress((int)allbye, 0);//更新进度条 } int startbye = 0; while (contentLen != 0) { startbye = contentLen + startbye; stream.Write(buff, 0, contentLen); //更新进度 if (updateProgress != null) { updateProgress((int)allbye, (int)startbye);//更新进度条 } contentLen = fs.Read(buff, 0, buffLength); } stream.Close(); fs.Close(); response.Close(); return true; } catch (Exception) { return false; throw; } finally { if (fs != null) { fs.Close(); } if (stream != null) { stream.Close(); } if (response != null) { response.Close(); } } } /// <summary> /// 上传文件到FTP服务器(断点续传) /// </summary> /// <param name="localFullPath">本地文件全路径名称:C:UsersJianKunKingDesktopIronPython脚本测试工具</param> /// <param name="remoteFilepath">远程文件所在文件夹路径</param> /// <param name="updateProgress">报告进度的处理(第一个参数:总大小,第二个参数:当前进度)</param> /// <returns></returns> public static bool FtpUploadBroken(string localFullPath, string remoteFilepath, Action<int, int> updateProgress = null) { if (remoteFilepath == null) { remoteFilepath = ""; } string newFileName = string.Empty; bool success = true; FileInfo fileInf = new FileInfo(localFullPath); long allbye = (long)fileInf.Length; if (fileInf.Name.IndexOf("#") == -1) { newFileName = RemoveSpaces(fileInf.Name); } else { newFileName = fileInf.Name.Replace("#", "#"); newFileName = RemoveSpaces(newFileName); } long startfilesize = GetFileSize(newFileName, remoteFilepath); if (startfilesize >= allbye) { return false; } long startbye = startfilesize; //更新进度 if (updateProgress != null) { updateProgress((int)allbye, (int)startfilesize);//更新进度条 } string uri; if (remoteFilepath.Length == 0) { uri = "ftp://" + FtpServerIP + "/" + newFileName; } else { uri = "ftp://" + FtpServerIP + "/" + remoteFilepath + "/" + newFileName; } FtpWebRequest reqFTP; // 根据uri创建FtpWebRequest对象 reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); // ftp用户名和密码 reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword); // 默认为true,连接不会被关闭 // 在一个命令之后被执行 reqFTP.KeepAlive = false; // 指定执行什么命令 reqFTP.Method = WebRequestMethods.Ftp.AppendFile; // 指定数据传输类型 reqFTP.UseBinary = true; // 上传文件时通知服务器文件的大小 reqFTP.ContentLength = fileInf.Length; int buffLength = 2048;// 缓冲大小设置为2kb byte[] buff = new byte[buffLength]; // 打开一个文件流 (System.IO.FileStream) 去读上传的文件 FileStream fs = fileInf.OpenRead(); Stream strm = null; try { // 把上传的文件写入流 strm = reqFTP.GetRequestStream(); // 每次读文件流的2kb fs.Seek(startfilesize, 0); int contentLen = fs.Read(buff, 0, buffLength); // 流内容没有结束 while (contentLen != 0) { // 把内容从file stream 写入 upload stream strm.Write(buff, 0, contentLen); contentLen = fs.Read(buff, 0, buffLength); startbye += contentLen; //更新进度 if (updateProgress != null) { updateProgress((int)allbye, (int)startbye);//更新进度条 } } // 关闭两个流 strm.Close(); fs.Close(); } catch { success = false; throw; } finally { if (fs != null) { fs.Close(); } if (strm != null) { strm.Close(); } } return success; } /// <summary> /// 去除空格 /// </summary> /// <param name="str"></param> /// <returns></returns> private static string RemoveSpaces(string str) { string a = ""; CharEnumerator CEnumerator = str.GetEnumerator(); while (CEnumerator.MoveNext()) { byte[] array = new byte[1]; array = System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString()); int asciicode = (short)(array[0]); if (asciicode != 32) { a += CEnumerator.Current.ToString(); } } string sdate = System.DateTime.Now.Year.ToString() + System.DateTime.Now.Month.ToString() + System.DateTime.Now.Day.ToString() + System.DateTime.Now.Hour.ToString() + System.DateTime.Now.Minute.ToString() + System.DateTime.Now.Second.ToString() + System.DateTime.Now.Millisecond.ToString(); return a.Split('.')[a.Split('.').Length - 2] + "." + a.Split('.')[a.Split('.').Length - 1]; } /// <summary> /// 获取已上传文件大小 /// </summary> /// <param name="filename">文件名称</param> /// <param name="path">服务器文件路径</param> /// <returns></returns> public static long GetFileSize(string filename, string remoteFilepath) { long filesize = 0; try { FtpWebRequest reqFTP; FileInfo fi = new FileInfo(filename); string uri; if (remoteFilepath.Length == 0) { uri = "ftp://" + FtpServerIP + "/" + fi.Name; } else { uri = "ftp://" + FtpServerIP + "/" + remoteFilepath + "/" + fi.Name; } reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri); reqFTP.KeepAlive = false; reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(FtpUserID, FtpPassword);//用户,密码 reqFTP.Method = WebRequestMethods.Ftp.GetFileSize; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); filesize = response.ContentLength; return filesize; } catch { return 0; } } //public void Connect(String path, string ftpUserID, string ftpPassword)//连接ftp //{ // // 根据uri创建FtpWebRequest对象 // reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path)); // // 指定数据传输类型 // reqFTP.UseBinary = true; // // ftp用户名和密码 // reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); //} #endregion } }
调用实例:
下载(不需要带iis部分的路径):
- FileUpDownload.FtpServerIP = "192.168.1.1";
- FileUpDownload.FtpUserID = "ftpTest001";
- FileUpDownload.FtpPassword = "aaaaaa";
- FileUpDownload.FtpDownload("Beyond Compare(绿色免安装).zip",
- Application.StartupPath + "/downloads/crm2.ra6", false);
FileUpDownload.FtpServerIP = "192.168.1.1"; FileUpDownload.FtpUserID = "ftpTest001"; FileUpDownload.FtpPassword = "aaaaaa"; FileUpDownload.FtpDownload("Beyond Compare(绿色免安装).zip", Application.StartupPath + "/downloads/crm2.ra6", false);
之前的上传的文件目录:
上传(不需要带iis部分的路径):- OpenFileDialog op = new OpenFileDialog();
- op.InitialDirectory = Application.StartupPath;
- op.RestoreDirectory = true;
- op.Filter = "压缩文件(*.zip)|*.zip|压缩文件(*.rar)|*.rar|所有文件(*.*)|*.*";
- if (op.ShowDialog() == DialogResult.OK)
- {
- string aa = op.FileName;
- FileUpDownload.FtpServerIP = "192.168.1.1";
- FileUpDownload.FtpUserID = "ftpTest001";
- FileUpDownload.FtpPassword = "aaaaaa";
- //全路径
- FileUpDownload.FtpUploadFile(aa);
- }
OpenFileDialog op = new OpenFileDialog(); op.InitialDirectory = Application.StartupPath; op.RestoreDirectory = true; op.Filter = "压缩文件(*.zip)|*.zip|压缩文件(*.rar)|*.rar|所有文件(*.*)|*.*"; if (op.ShowDialog() == DialogResult.OK) { string aa = op.FileName; FileUpDownload.FtpServerIP = "192.168.1.1"; FileUpDownload.FtpUserID = "ftpTest001"; FileUpDownload.FtpPassword = "aaaaaa"; //全路径 FileUpDownload.FtpUploadFile(aa); }
IIS下搭建FTP服务器:点击打开链接
参考文章:点击打开链接
小注:
多线程下载:
将文件分段,分段后,每段启用一个线程来下载(提供一个属性或者入参,来控制启用多少个线程),下载完成后,将文件拼起来(跟断点续传的原理差不多)
具体可以百度搜索:c# ftp 多线程 下载
将文件分段,分段后,每段启用一个线程来下载(提供一个属性或者入参,来控制启用多少个线程),下载完成后,将文件拼起来(跟断点续传的原理差不多)
具体可以百度搜索:c# ftp 多线程 下载