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操作方法整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!