本文是利用c#实现FTP客户端的小例子,主要实现上,传下载,删除等功能,以供学习分享使用。
<>强思路:强>
通过读取FTP站点的目录信息,列出对应的文件及文件夹。
双击目录,则显示子目录,如果是文件,则点击右键,进行下载和删除操作。
通过读取本地电脑的目录,以树状结构展示,选择本地文件,右键进行上传操作。
<强>涉及知识点:强>
FtpWebRequest【实现文件传输协议(FTP)客户端】/FtpWebResponse【封装文件传输协议(FTP)服务器对请求的响应】FTP的操作主要集中在两个类中。
FlowLayoutPanel 【流布局面板】表示一个沿水平或垂直方向动态排放其内容的面板。
ContextMenuStrip【快捷菜单】主要用于右键菜单。
资源文件:资源用于存放图片及其他资源。
<>强效果图>强如下
左边:双击文件夹进入子目录,点击工具栏按钮”上级目录“返回。文件点击右键进行操作。
右边:文件夹则点击前面+号展开。文件则点击右键进行上传。
核心代码如下
使用系统; 使用System.Collections.Generic; 使用先; 使用来; 使用System.Net; 使用text; 使用System.Threading; 使用System.Threading.Tasks; 名称空间FtpClient { 公开课FtpHelper { #地区属性与构造函数///& lt; summary>///IP地址///& lt;/summary> 公共字符串IpAddr{得到;设置;}///& lt; summary>///相对路径///& lt;/summary> 公共字符串RelatePath{得到;设置;}///& lt; summary>///端口号///& lt;/summary> 公共字符串端口{得到;设置;}///& lt; summary>///用户名///& lt;/summary> 公共字符串的用户名{;设置;}///& lt; summary>///密码///& lt;/summary> 公共字符串密码{得到;设置;} 公共FtpHelper () { } 港口ipAddr公共FtpHelper(字符串,字符串,字符串的用户名,字符串密码){ 这一点。IpAddr=IpAddr; 这一点。端口=端口; 这一点。用户名=用户名; 这一点。密码=密码; } # endregion #地区方法///& lt; summary>///下载文件///& lt;/summary>///& lt;参数name=" filePath祝辞& lt;/param>///& lt;参数name=" isOk祝辞& lt;/param> 公共空间下载(字符串filePath bool isOk) { 字符串方法=WebRequestMethods.Ftp.DownloadFile; var statusCode=FtpStatusCode.DataAlreadyOpen; FtpWebResponse响应=callFtp(方法); ReadByBytes (filePath、响应statusCode isOk); } 公共空间上传(字符串文件,bool isOk) { isOk=false; FileInfo fi=new FileInfo(文件); 文件流fs=fi.OpenRead (); 长度=fs.Length; 字符串uri=字符串。格式(“ftp://{0}:{1}{2}”,这一点。IpAddr,这。港口,this.RelatePath); FtpWebRequest请求=(FtpWebRequest) WebRequest.Create (uri); 请求。凭证=new NetworkCredential(用户名、密码); 请求。方法=WebRequestMethods.Ftp.UploadFile; 请求。UseBinary=true; 请求。ContentLength=长度; 请求。Timeout=10 * 1000; 试一试 { 流流=request.GetRequestStream (); int BufferLength=2048;//2 k byte [] b=新的字节(BufferLength); int我; ((我=fs。读(b, 0, BufferLength))比;0) { 流。写(0 b,我); } stream.Close (); stream.Dispose (); isOk=true; } 捕获(异常交货) { Console.WriteLine (ex.ToString ()); } 最后{ 如果(请求!=null) { request.Abort (); 请求=零; } } }///& lt; summary>///删除文件///& lt;/summary>///& lt;参数name=" isOk祝辞& lt;/param>///& lt; returns> & lt;/returns> bool isOk公共string [] DeleteFile () { 字符串方法=WebRequestMethods.Ftp.DeleteFile; var statusCode=FtpStatusCode.FileActionOK; FtpWebResponse响应=callFtp(方法); statusCode,返回ReadByLine(反应isOk); }///& lt; summary>///展示目录///& lt;/summary> 公共string [] ListDirectory (bool isOk) { 字符串方法=WebRequestMethods.Ftp.ListDirectoryDetails; var statusCode=FtpStatusCode.DataAlreadyOpen; FtpWebResponse响应=callFtp(方法); statusCode,返回ReadByLine(反应isOk); }///& lt; summary>///设置上级目录///& lt;/summary> 公共空间SetPrePath () { 字符串relatePath=this.RelatePath; 如果(string.IsNullOrEmpty (relatePath) | | relatePath.LastIndexOf ("/")==0) { relatePath=" "; } 其他{ relatePath=relatePath。Substring (0, relatePath.LastIndexOf ("/")); } 这一点。RelatePath=RelatePath; } # endregion #地区私有方法///& lt; summary>///调用Ftp,将命令发往Ftp并返回信息///& lt;/summary>///& lt;参数name=胺椒ā痹谝⑼鵉tp的命令& lt;/param>///& lt; returns> & lt;/returns> 私人FtpWebResponse callFtp (string方法) { 字符串uri=字符串。格式(“ftp://{0}:{1}{2}”,这一点。IpAddr,这。港口,this.RelatePath); FtpWebRequest请求;请求=(FtpWebRequest) FtpWebRequest.Create (uri); 请求。UseBinary=true; 请求。UsePassive=true; 请求。凭证=new NetworkCredential(用户名、密码); 请求。KeepAlive=false; 请求。方法=方法; FtpWebResponse响应=(FtpWebResponse) request.GetResponse (); 返回响应; }///& lt; summary>///按行读?//& lt;/summary>///& lt;参数name=跋煊Α弊4? lt;/param>///& lt;参数name=" statusCode祝辞& lt;/param>///& lt;参数name=" isOk祝辞& lt;/param>///& lt; returns> & lt;/returns> 私人string [] ReadByLine (FtpWebResponse响应,FtpStatusCode statusCode, bool isOk) { Listc#实现FTP客户端的案例