using
System;
using
System.Collections.Generic;
using
System.IO;
using
System.Linq;
using
System.Net;
using
System.Text;
using
System.Threading.Tasks;
namespace
ManagementProject
{
public
class
FTPHelper
{
string
ftpRemotePath;
#region 变量属性
/// <summary>
/// Ftp服务器ip
/// </summary>
public
static
string
FtpServerIP =
""
;
/// <summary>
/// Ftp 指定用户名
/// </summary>
public
static
string
FtpUserID =
""
;
/// <summary>
/// Ftp 指定用户密码
/// </summary>
public
static
string
FtpPassword =
""
;
public
static
string
ftpURI =
"ftp://"
+ FtpServerIP +
"/"
;
#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 ex)
{
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 ex)
{
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;
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 ex)
{
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;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(
new
Uri(uri));
reqFTP.Credentials =
new
NetworkCredential(FtpUserID, FtpPassword);
reqFTP.KeepAlive =
false
;
reqFTP.Method = WebRequestMethods.Ftp.AppendFile;
reqFTP.UseBinary =
true
;
reqFTP.ContentLength = fileInf.Length;
int
buffLength = 2048;
byte
[] buff =
new
byte
[buffLength];
FileStream fs = fileInf.OpenRead();
Stream strm =
null
;
try
{
strm = reqFTP.GetRequestStream();
fs.Seek(startfilesize, 0);
int
contentLen = fs.Read(buff, 0, buffLength);
while
(contentLen != 0)
{
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;
}
}
发表评论