C# FTP上传下载(支持断点续传)
2023-09-14 09:02:10 时间
/// 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;
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;
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)
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;
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;
// 把上传的文件写入流
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;
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
将文件分段,分段后,每段启用一个线程来下载(提供一个属性或者入参,来控制启用多少个线程),下载完成后,将文件拼起来(跟断点续传的原理差不多)
具体可以百度搜索:c# ftp 多线程 下载
C# FTP操作 原文 http://www.cnblogs.com/T-J-D/archive/2013/09/25/3339086.html using System; using System.Collections.
FtpClient文件下载 : http://download.csdn.net/detail/pukuimin1226/4388499 第一种不使用WebClient private void ftp_op1() {...
FileUpDownload.FtpServerIP = "192.168.1.1"; FileUpDownload.FtpUserID = "ftpTest001"; FileUpDownload.FtpPassword = "aaaaaa"; FileUpDownload.FtpDownload("Beyond Compare(绿色免安装).zip", Application.StartupPath + "/downloads/crm2.ra6", false);
之前的上传的文件目录:
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操作 原文 http://www.cnblogs.com/T-J-D/archive/2013/09/25/3339086.html using System; using System.Collections.
FtpClient文件下载 : http://download.csdn.net/detail/pukuimin1226/4388499 第一种不使用WebClient private void ftp_op1() {...
相关文章
- C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
- C#常用 API函数大全[通俗易懂]
- C# HttpClient使用和注意事项,.NET Framework连接池并发限制
- EntityFramework数据持久化复习资料3、C#拓展方法与yield关键字使用
- 使用FTP连接Linux服务器:简单步骤指南(ftp连接linux服务器)
- Linux下FTP服务器性能测试(linux测试ftp)
- Linux命令连接FTP服务器的技巧(linux命令连接ftp)
- 玩转 Linux:FTP 服务安装与配置(ftp服务linux)
- 服务Linux系统无FTP服务可用(linux没有ftp)
- 解决Linux FTP连接失败问题(ftp连接不上linux)
- Linux安装FTP的步骤指南(linux怎样安装ftp)
- 服务Linux下查看FTP服务的技巧(linux怎么查看ftp)
- 开启Linux服务器FTP功能(linux服务器开ftp)
- Linux下搭建FTP服务器简易教程(linux的ftp连接)
- Linux中建立FTP服务器的指南(linux创建ftp服务器)
- 使用Linux系统管理FTP客户端(ftp客户端linux)
- Mono 4.0发布,支持C# 6
- Linux下如何限制FTP访问?(linux限制ftp)
- Linux系统下安装FTP服务的详细教程(linux安装ftp教程)
- Linux 下快速搭建FTP服务器(linux打开ftp)
- 器Linux下快速搭建FTP服务器的简易指南(linux创建ftp服务)
- 数据库FTP实现Oracle数据库连接的技术方案(ftp连接oracle)
- C#学习基础概念二十五问11-15
- C#面向对象的基本原则
- 关于c#连接ftp进行上传下载实现原理及代码
- c#打印预览控件中实现用鼠标移动页面功能代码分享
- C#中Params的用法
- C#实现快捷键的几种常用方法汇总