C# FTP操作类分享
本文实例为大家分享了C#FTP操作类的具体代码,可进行FTP的上传,下载等其他功能,支持断点续传,供大家参考,具体内容如下
FTPHelper
usingSystem;
usingSystem.Collections.Generic;
usingSystem.IO;
usingSystem.Linq;
usingSystem.Net;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceManagementProject
{
publicclassFTPHelper
{
stringftpRemotePath;
#region变量属性
///
///Ftp服务器ip
///
publicstaticstringFtpServerIP="";
///
///Ftp指定用户名
///
publicstaticstringFtpUserID="";
///
///Ftp指定用户密码
///
publicstaticstringFtpPassword="";
publicstaticstringftpURI="ftp://"+FtpServerIP+"/";
#endregion
#region从FTP服务器下载文件,指定本地路径和本地文件名
///
///从FTP服务器下载文件,指定本地路径和本地文件名
///
///远程文件名
///保存本地的文件名(包含路径)
///是否启用身份验证(false:表示允许用户匿名下载)
///报告进度的处理(第一个参数:总大小,第二个参数:当前进度)
///是否下载成功
publicstaticboolFtpDownload(stringremoteFileName,stringlocalFileName,boolifCredential,ActionupdateProgress=null)
{
FtpWebRequestreqFTP,ftpsize;
StreamftpStream=null;
FtpWebResponseresponse=null;
FileStreamoutputStream=null;
try
{
outputStream=newFileStream(localFileName,FileMode.Create);
if(FtpServerIP==null||FtpServerIP.Trim().Length==0)
{
thrownewException("ftp下载目标服务器地址未设置!");
}
Uriuri=newUri("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=newNetworkCredential(FtpUserID,FtpPassword);
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
}
ftpsize.Method=WebRequestMethods.Ftp.GetFileSize;
FtpWebResponsere=(FtpWebResponse)ftpsize.GetResponse();
longtotalBytes=re.ContentLength;
re.Close();
reqFTP.Method=WebRequestMethods.Ftp.DownloadFile;
response=(FtpWebResponse)reqFTP.GetResponse();
ftpStream=response.GetResponseStream();
//更新进度
if(updateProgress!=null)
{
updateProgress((int)totalBytes,0);//更新进度条
}
longtotalDownloadedByte=0;
intbufferSize=2048;
intreadCount;
byte[]buffer=newbyte[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();
returntrue;
}
catch(Exceptionex)
{
returnfalse;
throw;
}
finally
{
if(ftpStream!=null)
{
ftpStream.Close();
}
if(outputStream!=null)
{
outputStream.Close();
}
if(response!=null)
{
response.Close();
}
}
}
///
///从FTP服务器下载文件,指定本地路径和本地文件名(支持断点下载)
///
///远程文件名
///保存本地的文件名(包含路径)
///是否启用身份验证(false:表示允许用户匿名下载)
///已下载文件流大小
///报告进度的处理(第一个参数:总大小,第二个参数:当前进度)
///是否下载成功
publicstaticboolFtpBrokenDownload(stringremoteFileName,stringlocalFileName,boolifCredential,longsize,ActionupdateProgress=null)
{
FtpWebRequestreqFTP,ftpsize;
StreamftpStream=null;
FtpWebResponseresponse=null;
FileStreamoutputStream=null;
try
{
outputStream=newFileStream(localFileName,FileMode.Append);
if(FtpServerIP==null||FtpServerIP.Trim().Length==0)
{
thrownewException("ftp下载目标服务器地址未设置!");
}
Uriuri=newUri("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=newNetworkCredential(FtpUserID,FtpPassword);
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
}
ftpsize.Method=WebRequestMethods.Ftp.GetFileSize;
FtpWebResponsere=(FtpWebResponse)ftpsize.GetResponse();
longtotalBytes=re.ContentLength;
re.Close();
reqFTP.Method=WebRequestMethods.Ftp.DownloadFile;
response=(FtpWebResponse)reqFTP.GetResponse();
ftpStream=response.GetResponseStream();
//更新进度
if(updateProgress!=null)
{
updateProgress((int)totalBytes,0);//更新进度条
}
longtotalDownloadedByte=0;
intbufferSize=2048;
intreadCount;
byte[]buffer=newbyte[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();
returntrue;
}
catch(Exceptionex)
{
returnfalse;
throw;
}
finally
{
if(ftpStream!=null)
{
ftpStream.Close();
}
if(outputStream!=null)
{
outputStream.Close();
}
if(response!=null)
{
response.Close();
}
}
}
///
///从FTP服务器下载文件,指定本地路径和本地文件名
///
///远程文件名
///保存本地的文件名(包含路径)
///是否启用身份验证(false:表示允许用户匿名下载)
///报告进度的处理(第一个参数:总大小,第二个参数:当前进度)
///是否断点下载:true会在localFileName找是否存在已经下载的文件,并计算文件流大小
///是否下载成功
publicstaticboolFtpDownload(stringremoteFileName,stringlocalFileName,boolifCredential,boolbrokenOpen,ActionupdateProgress=null)
{
if(brokenOpen)
{
try
{
longsize=0;
if(File.Exists(localFileName))
{
using(FileStreamoutputStream=newFileStream(localFileName,FileMode.Open))
{
size=outputStream.Length;
}
}
returnFtpBrokenDownload(remoteFileName,localFileName,ifCredential,size,updateProgress);
}
catch
{
throw;
}
}
else
{
returnFtpDownload(remoteFileName,localFileName,ifCredential,updateProgress);
}
}
#endregion
#region上传文件到FTP服务器
///
///上传文件到FTP服务器
///
///本地带有完整路径的文件名
///报告进度的处理(第一个参数:总大小,第二个参数:当前进度)
///是否下载成功
publicstaticboolFtpUploadFile(stringlocalFullPathName,ActionupdateProgress=null)
{
FtpWebRequestreqFTP;
Streamstream=null;
FtpWebResponseresponse=null;
FileStreamfs=null;
try
{
FileInfofinfo=newFileInfo(localFullPathName);
if(FtpServerIP==null||FtpServerIP.Trim().Length==0)
{
thrownewException("ftp上传目标服务器地址未设置!");
}
Uriuri=newUri("ftp://"+FtpServerIP+"/"+finfo.Name);
reqFTP=(FtpWebRequest)FtpWebRequest.Create(uri);
reqFTP.KeepAlive=false;
reqFTP.UseBinary=true;
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);//用户,密码
reqFTP.Method=WebRequestMethods.Ftp.UploadFile;//向服务器发出下载请求命令
reqFTP.ContentLength=finfo.Length;//为request指定上传文件的大小
response=reqFTP.GetResponse()asFtpWebResponse;
reqFTP.ContentLength=finfo.Length;
intbuffLength=1024;
byte[]buff=newbyte[buffLength];
intcontentLen;
fs=finfo.OpenRead();
stream=reqFTP.GetRequestStream();
contentLen=fs.Read(buff,0,buffLength);
intallbye=(int)finfo.Length;
//更新进度
if(updateProgress!=null)
{
updateProgress((int)allbye,0);//更新进度条
}
intstartbye=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();
returntrue;
}
catch(Exceptionex)
{
returnfalse;
throw;
}
finally
{
if(fs!=null)
{
fs.Close();
}
if(stream!=null)
{
stream.Close();
}
if(response!=null)
{
response.Close();
}
}
}
///
///上传文件到FTP服务器(断点续传)
///
///本地文件全路径名称:C:\Users\JianKunKing\Desktop\IronPython脚本测试工具
///远程文件所在文件夹路径
///报告进度的处理(第一个参数:总大小,第二个参数:当前进度)
///
publicstaticboolFtpUploadBroken(stringlocalFullPath,stringremoteFilepath,ActionupdateProgress=null)
{
if(remoteFilepath==null)
{
remoteFilepath="";
}
stringnewFileName=string.Empty;
boolsuccess=true;
FileInfofileInf=newFileInfo(localFullPath);
longallbye=(long)fileInf.Length;
if(fileInf.Name.IndexOf("#")==-1)
{
newFileName=RemoveSpaces(fileInf.Name);
}
else
{
newFileName=fileInf.Name.Replace("#","#");
newFileName=RemoveSpaces(newFileName);
}
longstartfilesize=GetFileSize(newFileName,remoteFilepath);
if(startfilesize>=allbye)
{
returnfalse;
}
longstartbye=startfilesize;
//更新进度
if(updateProgress!=null)
{
updateProgress((int)allbye,(int)startfilesize);//更新进度条
}
stringuri;
if(remoteFilepath.Length==0)
{
uri="ftp://"+FtpServerIP+"/"+newFileName;
}
else
{
uri="ftp://"+FtpServerIP+"/"+remoteFilepath+"/"+newFileName;
}
FtpWebRequestreqFTP;
//根据uri创建FtpWebRequest对象
reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(uri));
//ftp用户名和密码
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
//默认为true,连接不会被关闭
//在一个命令之后被执行
reqFTP.KeepAlive=false;
//指定执行什么命令
reqFTP.Method=WebRequestMethods.Ftp.AppendFile;
//指定数据传输类型
reqFTP.UseBinary=true;
//上传文件时通知服务器文件的大小
reqFTP.ContentLength=fileInf.Length;
intbuffLength=2048;//缓冲大小设置为2kb
byte[]buff=newbyte[buffLength];
//打开一个文件流(System.IO.FileStream)去读上传的文件
FileStreamfs=fileInf.OpenRead();
Streamstrm=null;
try
{
//把上传的文件写入流
strm=reqFTP.GetRequestStream();
//每次读文件流的2kb
fs.Seek(startfilesize,0);
intcontentLen=fs.Read(buff,0,buffLength);
//流内容没有结束
while(contentLen!=0)
{
//把内容从filestream写入uploadstream
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();
}
}
returnsuccess;
}
///
///去除空格
///
///
///
privatestaticstringRemoveSpaces(stringstr)
{
stringa="";
CharEnumeratorCEnumerator=str.GetEnumerator();
while(CEnumerator.MoveNext())
{
byte[]array=newbyte[1];
array=System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString());
intasciicode=(short)(array[0]);
if(asciicode!=32)
{
a+=CEnumerator.Current.ToString();
}
}
stringsdate=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();
returna.Split('.')[a.Split('.').Length-2]+"."+a.Split('.')[a.Split('.').Length-1];
}
///
///获取已上传文件大小
///
///文件名称
///服务器文件路径
///
publicstaticlongGetFileSize(stringfilename,stringremoteFilepath)
{
longfilesize=0;
try
{
FtpWebRequestreqFTP;
FileInfofi=newFileInfo(filename);
stringuri;
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=newNetworkCredential(FtpUserID,FtpPassword);//用户,密码
reqFTP.Method=WebRequestMethods.Ftp.GetFileSize;
FtpWebResponseresponse=(FtpWebResponse)reqFTP.GetResponse();
filesize=response.ContentLength;
returnfilesize;
}
catch
{
return0;
}
}
//publicvoidConnect(Stringpath,stringftpUserID,stringftpPassword)//连接ftp
//{
////根据uri创建FtpWebRequest对象
//reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(path));
////指定数据传输类型
//reqFTP.UseBinary=true;
////ftp用户名和密码
//reqFTP.Credentials=newNetworkCredential(ftpUserID,ftpPassword);
//}
#endregion
#region获取当前目录下明细
///
///获取当前目录下明细(包含文件和文件夹)
///
///
publicstaticstring[]GetFilesDetailList()
{
string[]downloadFiles;
try
{
StringBuilderresult=newStringBuilder();
FtpWebRequestftp;
ftp=(FtpWebRequest)FtpWebRequest.Create(newUri(ftpURI));
ftp.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
ftp.Method=WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponseresponse=ftp.GetResponse();
StreamReaderreader=newStreamReader(response.GetResponseStream(),Encoding.Default);
stringline=reader.ReadLine();
while(line!=null)
{
result.Append(line);
result.Append("\n");
line=reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf("\n"),1);
reader.Close();
response.Close();
returnresult.ToString().Split('\n');
}
catch(Exceptionex)
{
downloadFiles=null;
throwex;
}
}
///
///获取当前目录下文件列表(仅文件)
///
///
publicstaticstring[]GetFileList(stringmask)
{
string[]downloadFiles;
StringBuilderresult=newStringBuilder();
FtpWebRequestreqFTP;
try
{
reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(ftpURI));
reqFTP.UseBinary=true;
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
reqFTP.Method=WebRequestMethods.Ftp.ListDirectory;
WebResponseresponse=reqFTP.GetResponse();
StreamReaderreader=newStreamReader(response.GetResponseStream(),Encoding.Default);
stringline=reader.ReadLine();
while(line!=null)
{
if(mask.Trim()!=string.Empty&&mask.Trim()!="*.*")
{
stringmask_=mask.Substring(0,mask.IndexOf("*"));
if(line.Substring(0,mask_.Length)==mask_)
{
result.Append(line);
result.Append("\n");
}
}
else
{
result.Append(line);
result.Append("\n");
}
line=reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('\n'),1);
reader.Close();
response.Close();
returnresult.ToString().Split('\n');
}
catch(Exceptionex)
{
downloadFiles=null;
throwex;
}
}
///
///获取当前目录下所有的文件夹列表(仅文件夹)
///
///
publicstaticstring[]GetDirectoryList()
{
string[]drectory=GetFilesDetailList();
stringm=string.Empty;
foreach(stringstrindrectory)
{
intdirPos=str.IndexOf("");
if(dirPos>0)
{
/*判断Windows风格*/
m+=str.Substring(dirPos+5).Trim()+"\n";
}
elseif(str.Trim().Substring(0,1).ToUpper()=="D")
{
/*判断Unix风格*/
stringdir=str.Substring(54).Trim();
if(dir!="."&&dir!="..")
{
m+=dir+"\n";
}
}
}
char[]n=newchar[]{'\n'};
returnm.Split(n);
}
#endregion
#region删除文件及文件夹
///
///删除文件
///
///
publicstaticboolDelete(stringfileName)
{
try
{
stringuri=ftpURI+fileName;
FtpWebRequestreqFTP;
reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(uri));
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
reqFTP.KeepAlive=false;
reqFTP.Method=WebRequestMethods.Ftp.DeleteFile;
stringresult=String.Empty;
FtpWebResponseresponse=(FtpWebResponse)reqFTP.GetResponse();
longsize=response.ContentLength;
Streamdatastream=response.GetResponseStream();
StreamReadersr=newStreamReader(datastream);
result=sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
returntrue;
}
catch(Exceptionex)
{
returnfalse;
throwex;
}
}
///
///删除文件夹
///
///
publicstaticvoidRemoveDirectory(stringfolderName)
{
try
{
stringuri=ftpURI+folderName;
FtpWebRequestreqFTP;
reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(uri));
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
reqFTP.KeepAlive=false;
reqFTP.Method=WebRequestMethods.Ftp.RemoveDirectory;
stringresult=String.Empty;
FtpWebResponseresponse=(FtpWebResponse)reqFTP.GetResponse();
longsize=response.ContentLength;
Streamdatastream=response.GetResponseStream();
StreamReadersr=newStreamReader(datastream);
result=sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
}
catch(Exceptionex)
{
throwex;
}
}
#endregion
#region其他操作
///
///获取指定文件大小
///
///
///
publicstaticlongGetFileSize(stringfilename)
{
FtpWebRequestreqFTP;
longfileSize=0;
try
{
reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(ftpURI+filename));
reqFTP.Method=WebRequestMethods.Ftp.GetFileSize;
reqFTP.UseBinary=true;
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
FtpWebResponseresponse=(FtpWebResponse)reqFTP.GetResponse();
StreamftpStream=response.GetResponseStream();
fileSize=response.ContentLength;
ftpStream.Close();
response.Close();
}
catch(Exceptionex)
{
throwex;
}
returnfileSize;
}
///
///判断当前目录下指定的子目录是否存在
///
///指定的目录名
publicboolDirectoryExist(stringRemoteDirectoryName)
{
try
{
string[]dirList=GetDirectoryList();
foreach(stringstrindirList)
{
if(str.Trim()==RemoteDirectoryName.Trim())
{
returntrue;
}
}
returnfalse;
}
catch
{
returnfalse;
}
}
///
///判断当前目录下指定的文件是否存在
///
///远程文件名
publicboolFileExist(stringRemoteFileName)
{
string[]fileList=GetFileList("*.*");
foreach(stringstrinfileList)
{
if(str.Trim()==RemoteFileName.Trim())
{
returntrue;
}
}
returnfalse;
}
///
///创建文件夹
///
///
publicvoidMakeDir(stringdirName)
{
FtpWebRequestreqFTP;
try
{
//dirName=nameofthedirectorytocreate.
reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(ftpURI+dirName));
reqFTP.Method=WebRequestMethods.Ftp.MakeDirectory;
reqFTP.UseBinary=true;
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
FtpWebResponseresponse=(FtpWebResponse)reqFTP.GetResponse();
StreamftpStream=response.GetResponseStream();
ftpStream.Close();
response.Close();
}
catch(Exceptionex)
{
throwex;
}
}
///
///改名
///
///
///
publicvoidReName(stringcurrentFilename,stringnewFilename)
{
FtpWebRequestreqFTP;
try
{
reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(ftpURI+currentFilename));
reqFTP.Method=WebRequestMethods.Ftp.Rename;
reqFTP.RenameTo=newFilename;
reqFTP.UseBinary=true;
reqFTP.Credentials=newNetworkCredential(FtpUserID,FtpPassword);
FtpWebResponseresponse=(FtpWebResponse)reqFTP.GetResponse();
StreamftpStream=response.GetResponseStream();
ftpStream.Close();
response.Close();
}
catch(Exceptionex)
{
throwex;
}
}
///
///移动文件
///
///
///
publicvoidMovieFile(stringcurrentFilename,stringnewDirectory)
{
ReName(currentFilename,newDirectory);
}
///
///切换当前目录
///
///
///true绝对路径false相对路径
publicvoidGotoDirectory(stringDirectoryName,boolIsRoot)
{
if(IsRoot)
{
ftpRemotePath=DirectoryName;
}
else
{
ftpRemotePath+=DirectoryName+"/";
}
ftpURI="ftp://"+FtpServerIP+"/"+ftpRemotePath+"/";
}
#endregion
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。