[csharp] view plain copy
-
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:\Users\JianKunKing\Desktop\IronPython脚本测试工具</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);
之前的上传的文件目录:

上传(不需要带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); -
}

IIS下搭建FTP服务器:点击打开链接
参考文章:点击打开链接
小注:
多线程下载:
将文件分段,分段后,每段启用一个线程来下载(提供一个属性或者入参,来控制启用多少个线程),下载完成后,将文件拼起来(跟断点续传的原理差不多)
具体可以百度搜索:c# ftp 多线程 下载
&spm=1001.2101.3001.5002&articleId=81109690&d=1&t=3&u=b54ebf17d12c47d0aafe068a12fcd58a)
536

被折叠的 条评论
为什么被折叠?



