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,Action updateProgress=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 } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。