C#开发教程之ftp操作方法整理
1.最近项目开发涉及到ftp操作。发现FtpWebRequest类有些操作很麻烦,
例如创建目录只能创建一级目录,多级就失败。删除目录只能删除最后一级的空目录。同样下载也是。
故写下帮助类方便使用。
2.调用方法展示,
varftp=newFtpHelper("111.111.111.111","xxxxxxx","xxxxxx");//初始化ftp,创建ftp对象 ftp.uploadFile("F:\\wms.zip","aaa//bbb");//参数1本地文件,参数2:ftp的目录 ftp.delDirAll("aaa");//参数要删除的目录的路径 ftp.downloadAllFile("aaa","F:\\myfile");//参数1:要下载的目录,参数2,保存到本地的目录
3.FtpHelper代码。后续再补充说明
1.异常方法委托,通过Lamda委托统一处理异常,方便改写。加了个委托方便控制异常输出
2.递归查找所有目录存入list,然后根据level排序,从最末级开始遍历删除
3.ftp的目录列表比较怪,暂时用截取字符串的获取目录或文件
///<summary> ///ftp帮助类 ///</summary> publicclassFtpHelper { privatestringftpHostIP{get;set;} privatestringusername{get;set;} privatestringpassword{get;set;} privatestringftpURI{get{return$@"ftp://{ftpHostIP}/";}} ///<summary> ///初始化ftp参数 ///</summary> ///<paramname="ftpHostIP">ftp主机IP</param> ///<paramname="username">ftp账户</param> ///<paramname="password">ftp密码</param> publicFtpHelper(stringftpHostIP,stringusername,stringpassword) { this.ftpHostIP=ftpHostIP; this.username=username; this.password=password; } ///<summary> ///异常方法委托,通过Lamda委托统一处理异常,方便改写 ///</summary> ///<paramname="method">当前执行的方法</param> ///<paramname="action"></param> ///<returns></returns> privateboolMethodInvoke(stringmethod,Actionaction) { if(action!=null) { try { action(); //Logger.Write2File($@"FtpHelper.{method}:执行成功"); FluentConsole.Red.Line($@"FtpHelper.{method}:执行成功"); returntrue; } catch(Exceptionex) { FluentConsole.Red.Line($@"FtpHelper.{method}:执行失败",ex.ToString()); //Logger.Write2File(action.GetType().Name,ex.ToString()); returnfalse; } } else { returnfalse; } } ///<summary> ///异常方法委托,通过Lamda委托统一处理异常,方便改写 ///</summary> ///</summary> ///<typeparamname="T"></typeparam> ///<paramname="method"></param> ///<paramname="func"></param> ///<returns></returns> privateTMethodInvoke<T>(stringmethod,Func<T>func) { if(func!=null) { try { FluentConsole.Red.Line($@"FtpHelper.{method}:执行成功"); returnfunc(); //Logger.Write2File($@"FtpHelper.{method}:执行成功"); } catch(Exceptionex) { FluentConsole.Red.Line($@"FtpHelper.{method}:执行失败:{ex}"); //Logger.Write2File($@"FtpHelper.{method}:执行失败",ex.ToString()); returndefault(T); } } else { returndefault(T); } } privateFtpWebRequestGetRequest(stringURI) { //根据服务器信息FtpWebRequest创建类的对象 FtpWebRequestresult=(FtpWebRequest)WebRequest.Create(URI); result.Credentials=newNetworkCredential(username,password); result.KeepAlive=false; result.UsePassive=false; result.UseBinary=true; returnresult; } ///<summary>上传文件</summary> ///<paramname="filePath">需要上传的文件</param> ///<paramname="targetDir">目标路径</param> publicbooluploadFile(stringfilePath,stringdirName="") { FileInfofileInfo=newFileInfo(filePath); if(dirName!="")makeDir(dirName); stringuri=Path.Combine(ftpURI,dirName,fileInfo.Name); returnMethodInvoke($@"uploadFile({filePath},{dirName})",()=> { FtpWebRequestftp=GetRequest(uri); ftp.Method=WebRequestMethods.Ftp.UploadFile; ftp.ContentLength=fileInfo.Length; intbuffLength=2048; byte[]buff=newbyte[buffLength]; intcontentLen; using(FileStreamfs=fileInfo.OpenRead()) { using(Streamstrm=ftp.GetRequestStream()) { contentLen=fs.Read(buff,0,buffLength); while(contentLen!=0) { strm.Write(buff,0,contentLen); contentLen=fs.Read(buff,0,buffLength); } strm.Close(); } fs.Close(); } }); } ///<summary> ///检查目录是否存在 ///</summary> ///<paramname="dirName"></param> ///<paramname="currentDir"></param> ///<returns></returns> publicboolcheckDir(stringdirName,stringcurrentDir="") { stringuri=Path.Combine(ftpURI,currentDir); returnMethodInvoke($@"checkDir({dirName}{currentDir})",()=> { FtpWebRequestftp=GetRequest(uri); ftp.UseBinary=true; ftp.Method=WebRequestMethods.Ftp.ListDirectoryDetails; Streamstream=ftp.GetResponse().GetResponseStream(); using(StreamReadersr=newStreamReader(stream)) { stringline=sr.ReadLine(); while(!string.IsNullOrEmpty(line)) { stringdir=string.Empty; if(line.IndexOf("<DIR>")>-1) { if(line.Substring(line.IndexOf("<DIR>")+5).Trim()==dirName) returntrue; } line=sr.ReadLine(); } sr.Close(); } stream.Close(); returnfalse; }); } ///<summary> ///获取当前目录下的目录及文件 ///</summary> ///paramname="ftpfileList"></param> ///<paramname="dirName"></param> ///<returns></returns> publicList<Ftpfile>getFtpFile(stringdirName) { varftpfileList=newList<Ftpfile>(); stringuri=Path.Combine(ftpURI,dirName); returnMethodInvoke($@"getFile({dirName})",()=> { vara=newList<List<string>>(); FtpWebRequestftp=GetRequest(uri); ftp.Method=WebRequestMethods.Ftp.ListDirectoryDetails; Streamstream=ftp.GetResponse().GetResponseStream(); using(StreamReadersr=newStreamReader(stream)) { stringline=sr.ReadLine(); while(!string.IsNullOrEmpty(line)) { ftpfileList.Add(newFtpfile{isDir=line.IndexOf("<DIR>")>-1,name=line.Substring(39).Trim(),path=Path.Combine(dirName,line.Substring(39).Trim())}); line=sr.ReadLine(); } sr.Close(); } returnftpfileList; }); } ///<summary> ///获取目录下的所有目录及文件包括其子目录和子文件 ///</summary> ///paramname="ftpfileList"></param> ///<paramname="dirName"></param> ///<returns></returns> publicList<Ftpfile>getAllFtpFile(List<Ftpfile>ftpfileList,stringdirName,intlevel=0) { varflist=newList<Ftpfile>(); stringuri=Path.Combine(ftpURI,dirName); returnMethodInvoke($@"getFile({dirName})",()=> { vara=newList<List<string>>(); FtpWebRequestftp=GetRequest(uri); ftp.Method=WebRequestMethods.Ftp.ListDirectoryDetails; Streamstream=ftp.GetResponse().GetResponseStream(); using(StreamReadersr=newStreamReader(stream)) { stringline=sr.ReadLine(); while(!string.IsNullOrEmpty(line)) { flist.Add(newFtpfile{isDir=line.IndexOf("<DIR>")>-1,name=line.Substring(39).Trim(),level=level,path=Path.Combine(dirName,line.Substring(39).Trim())}); ftpfileList.Add(newFtpfile{isDir=line.IndexOf("<DIR>")>-1,name=line.Substring(39).Trim(),level=level,path=Path.Combine(dirName,line.Substring(39).Trim())}); line=sr.ReadLine(); } sr.Close(); } varnflist=flist.Where(x=>x.isDir).ToList(); if(nflist.Count==0) returnftpfileList; else returngetAllFtpFile(ftpfileList,Path.Combine(dirName,nflist.First().name),level+1); }); } ///</summary> ///在ftp服务器上创建指定目录,父目录不存在则创建 ///</summary> ///<paramname="dirName">创建的目录名称</param> publicboolmakeDir(stringdirName) { vardirs=dirName.Split('\\').ToList();//针对多级目录分割 stringcurrentDir=string.Empty; returnMethodInvoke($@"makeDir({dirName})",()=> { foreach(vardirindirs) { if(!checkDir(dir,currentDir))//检查目录不存在则创建 { currentDir=Path.Combine(currentDir,dir); stringuri=Path.Combine(ftpURI,currentDir); FtpWebRequestftp=GetRequest(uri); ftp.Method=WebRequestMethods.Ftp.MakeDirectory; FtpWebResponseresponse=(FtpWebResponse)ftp.GetResponse(); response.Close(); } else { currentDir=Path.Combine(currentDir,dir); } } }); } ///<summary> ///删除单个文件 ///</summary> ///<paramname="filePath"></param> publicbooldelFile(stringfilePath) { stringuri=Path.Combine(ftpURI,filePath); returnMethodInvoke($@"deleteFile({filePath})",()=> { FtpWebRequestftp=GetRequest(uri); ftp.Method=WebRequestMethods.Ftp.DeleteFile; FtpWebResponseresponse=(FtpWebResponse)ftp.GetResponse(); response.Close(); }); } ///<summary> ///删除最末及空目录 ///</summary> ///<paramname="dirName"></param> privatebooldelDir(stringdirName) { stringuri=Path.Combine(ftpURI,dirName); returnMethodInvoke($@"delDir({dirName})",()=> { FtpWebRequestftp=GetRequest(uri); ftp.Method=WebRequestMethods.Ftp.RemoveDirectory; FtpWebResponseresponse=(FtpWebResponse)ftp.GetResponse(); response.Close(); }); } ///<summary>删除目录或者其目录下所有的文件</summary> ///<paramname="dirName">目录名称</param> ///<paramname="ifDelSub">是否删除目录下所有的文件</param> publicvoiddelDirAll(stringdirName) { vardlist=getAllFtpFile(newList<Ftpfile>(),dirName); dlist.OrderByDescending(x=>x.level);//降序排列,先删除末及文件或空目录 stringuri=Path.Combine(ftpURI,dirName); MethodInvoke($@"delDirAll({dirName})",()=> { foreach(varitemindlist) { if(item.isDir)//判断是目录调用目录的删除方法 delDir(item.path); else delFile(item.path); } }); } ///<summary>文件重命名</summary> ///<paramname="currentFilename">当前名称</param> ///<paramname="newFilename">重命名名称</param> ///<paramname="currentFilename">所在的目录</param> publicboolRename(stringcurrentFilename,stringnewFilename,stringdirName="") { stringuri=Path.Combine(ftpURI,dirName,currentFilename); returnMethodInvoke($@"Rename({currentFilename},{newFilename},{dirName})",()=> { FtpWebRequestftp=GetRequest(uri); ftp.Method=WebRequestMethods.Ftp.Rename; ftp.RenameTo=newFilename; FtpWebResponseresponse=(FtpWebResponse)ftp.GetResponse(); response.Close(); }); } ///<summary> ///下载单个文件 ///</summary> ///<paramname="ftpFilePath">从ftp要下载的文件路径</param> ///<paramname="localDir">下载至本地路径</param> ///<paramname="filename">文件名</param> publicbooldownloadFile(stringftpFilePath,stringsaveDir,stringfilename) { stringtmpname=Guid.NewGuid().ToString(); stringuri=Path.Combine(ftpURI,ftpFilePath); returnMethodInvoke($@"downloadFile({ftpFilePath},{saveDir},{filename})",()=> { if(!Directory.Exists(saveDir))Directory.CreateDirectory(saveDir); FtpWebRequestftp=GetRequest(uri); ftp.Method=WebRequestMethods.Ftp.DownloadFile; using(FtpWebResponseresponse=(FtpWebResponse)ftp.GetResponse()) { using(StreamresponseStream=response.GetResponseStream()) { using(FileStreamfs=newFileStream(Path.Combine(saveDir,filename),FileMode.CreateNew)) { byte[]buffer=newbyte[2048]; intread=0; do { read=responseStream.Read(buffer,0,buffer.Length); fs.Write(buffer,0,read); }while(!(read==0)); responseStream.Close(); fs.Flush(); fs.Close(); } responseStream.Close(); } response.Close(); } }); } ///<summary> ///从FTP下载整个文件夹 ///</summary> ///<paramname="dirName">FTP文件夹路径</param> ///<paramname="saveDir">保存的本地文件夹路径</param> publicvoiddownloadAllFile(stringdirName,stringsaveDir) { MethodInvoke($@"downloadAllFile({dirName},{saveDir})",()=> { List<Ftpfile>files=getFtpFile(dirName); if(!Directory.Exists(saveDir)) { Directory.CreateDirectory(saveDir); } foreach(varfinfiles) { if(f.isDir)//文件夹,递归查询 { downloadAllFile(Path.Combine(dirName+f.name),Path.Combine(saveDir+f.name)); } else//文件,直接下载 { downloadFile(Path.Combine(dirName+f.name),saveDir,f.name); } } }); } } publicclassFtpfile { publicintlevel{get;set;}=0; publicboolisDir{get;set;} publicstringname{get;set;} publicstringpath{get;set;}=""; }
以上所述是小编给大家介绍的C#开发教程之ftp操作方法整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!