zoukankan      html  css  js  c++  java
  • C#一个FTP操作封装类FTPHelper

    参考了网上一些代码,作了一些调整优化。

    001 using System;
    002 using System.Collections.Generic;
    003 using System.Linq;
    004 using System.Text;
    005 using System.Net;
    006 using System.IO;
    007  
    008 public class FTPHelper
    009 {
    010     /// <summary>
    011     /// FTP请求对象
    012     /// </summary>
    013     FtpWebRequest request = null;
    014     /// <summary>
    015     /// FTP响应对象
    016     /// </summary>
    017     FtpWebResponse response = null;
    018     /// <summary>
    019     /// FTP服务器地址
    020     /// </summary>
    021     public string ftpURI { getprivate set; }
    022     /// <summary>
    023     /// FTP服务器IP
    024     /// </summary>
    025     public string ftpServerIP { getprivate set; }
    026     /// <summary>
    027     /// FTP服务器默认目录
    028     /// </summary>
    029     public string ftpRemotePath { getprivate set; }
    030     /// <summary>
    031     /// FTP服务器登录用户名
    032     /// </summary>
    033     public string ftpUserID { getprivate set; }
    034     /// <summary>
    035     /// FTP服务器登录密码
    036     /// </summary>
    037     public string ftpPassword { getprivate set; }
    038  
    039     /// <summary> 
    040     /// 初始化
    041     /// </summary> 
    042     /// <param name="FtpServerIP">FTP连接地址</param> 
    043     /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param> 
    044     /// <param name="FtpUserID">用户名</param> 
    045     /// <param name="FtpPassword">密码</param> 
    046     public FTPHelper(string ftpServerIP, string ftpRemotePath, string ftpUserID, stringftpPassword)
    047     {
    048         this.ftpServerIP = ftpServerIP;
    049         this.ftpRemotePath = ftpRemotePath;
    050         this.ftpUserID = ftpUserID;
    051         this.ftpPassword = ftpPassword;
    052         this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
    053     }
    054     ~FTPHelper()
    055     {
    056         if (response != null)
    057         {
    058             response.Close();
    059             response = null;
    060         }
    061         if (request != null)
    062         {
    063             request.Abort();
    064             request = null;
    065         }
    066     }
    067     /// <summary>
    068     /// 建立FTP链接,返回响应对象
    069     /// </summary>
    070     /// <param name="uri">FTP地址</param>
    071     /// <param name="ftpMethod">操作命令</param>
    072     /// <returns></returns>
    073     private FtpWebResponse Open(Uri uri, string ftpMethod)
    074     {
    075         request = (FtpWebRequest)FtpWebRequest.Create(uri);
    076         request.Method = ftpMethod;
    077         request.UseBinary = true;
    078         request.KeepAlive = false;
    079         request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);
    080         return (FtpWebResponse)request.GetResponse();
    081     }
    082  
    083     /// <summary>      
    084     /// 建立FTP链接,返回请求对象      
    085     /// </summary>     
    086     /// <param name="uri">FTP地址</param>      
    087     /// <param name="ftpMethod">操作命令</param>      
    088     private FtpWebRequest OpenRequest(Uri uri, string ftpMethod)
    089     {
    090         request = (FtpWebRequest)WebRequest.Create(uri);
    091         request.Method = ftpMethod;
    092         request.UseBinary = true;
    093         request.KeepAlive = false;
    094         request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);
    095         return request;
    096     }
    097     /// <summary>
    098     /// 创建目录
    099     /// </summary>
    100     /// <param name="remoteDirectoryName">目录名</param>
    101     public void CreateDirectory(string remoteDirectoryName)
    102     {
    103         response = Open(newUri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory);
    104     }
    105     /// <summary>
    106     /// 更改目录或文件名
    107     /// </summary>
    108     /// <param name="currentName">当前名称</param>
    109     /// <param name="newName">修改后新名称</param>
    110     public void ReName(string currentName, string newName)
    111     {
    112         request = OpenRequest(newUri(ftpURI + currentName), WebRequestMethods.Ftp.Rename);
    113         request.RenameTo = newName;
    114         response = (FtpWebResponse)request.GetResponse();
    115     }  
    116     /// <summary> 
    117     /// 切换当前目录 
    118     /// </summary> 
    119     /// <param name="IsRoot">true:绝对路径 false:相对路径</param>  
    120     public void GotoDirectory(string DirectoryName, bool IsRoot)
    121     {
    122         if (IsRoot)
    123             ftpRemotePath = DirectoryName;
    124         else
    125             ftpRemotePath += "/" + DirectoryName;
    126  
    127         ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
    128     }      
    129     /// <summary>
    130     /// 删除目录(包括下面所有子目录和子文件)
    131     /// </summary>
    132     /// <param name="remoteDirectoryName">要删除的带路径目录名:如web/test</param>
    133     /*
    134      * 例:删除test目录
    135      FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password");                 
    136      helper.RemoveDirectory("web/test");
    137      */
    138     public void RemoveDirectory(string remoteDirectoryName)
    139     {
    140         GotoDirectory(remoteDirectoryName, true);
    141         var listAll = ListFilesAndDirectories();
    142         foreach (var m in listAll)
    143         {
    144             if(m.IsDirectory)          
    145                 RemoveDirectory(m.Path);          
    146             else          
    147                 DeleteFile(m.Name);          
    148         }
    149         GotoDirectory(remoteDirectoryName, true);
    150         response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);
    151     }
    152     /// <summary>
    153     /// 文件上传
    154     /// </summary>
    155     /// <param name="localFilePath">本地文件路径</param>
    156     public void Upload(string localFilePath)
    157     {
    158         FileInfo fileInf = new FileInfo(localFilePath);
    159         request = OpenRequest(newUri(ftpURI + fileInf.Name), WebRequestMethods.Ftp.UploadFile);
    160         request.ContentLength = fileInf.Length;
    161         int buffLength = 2048;
    162         byte[] buff = new byte[buffLength];
    163         int contentLen;
    164         using (var fs = fileInf.OpenRead())
    165         {
    166             using (var strm = request.GetRequestStream())
    167             {
    168                 contentLen = fs.Read(buff, 0, buffLength);
    169                 while (contentLen != 0)
    170                 {
    171                     strm.Write(buff, 0, contentLen);
    172                     contentLen = fs.Read(buff, 0, buffLength);
    173                 }
    174             }
    175         }
    176     }
    177     /// <summary> 
    178     /// 删除文件 
    179     /// </summary> 
    180     /// <param name="remoteFileName">要删除的文件名</param>
    181     public void DeleteFile(string remoteFileName)
    182     {
    183         response = Open(newUri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile);
    184     }
    185  
    186     /// <summary>
    187     /// 获取当前目录的文件和一级子目录信息
    188     /// </summary>
    189     /// <returns></returns>
    190     public List<FileStruct> ListFilesAndDirectories()
    191     {
    192         var fileList = new List<FileStruct>();
    193         response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails);
    194         using (var stream = response.GetResponseStream())
    195         {
    196             using (var sr = new StreamReader(stream))
    197             {
    198                 string line = null;
    199                 while ((line = sr.ReadLine()) != null)
    200                 {
    201                     //line的格式如下:
    202                     //08-18-13  11:05PM       <DIR>          aspnet_client
    203                     //09-22-13  11:39PM                 2946 Default.aspx
    204                     DateTime dtDate = DateTime.ParseExact(line.Substring(0, 8), "MM-dd-yy"null);
    205                     DateTime dtDateTime = DateTime.Parse(dtDate.ToString("yyyy-MM-dd") + line.Substring(8, 9));
    206                     string[] arrs = line.Split(' ');
    207                     var model = new FileStruct()
    208                     {
    209                         IsDirectory = line.IndexOf("<DIR>") > 0 ? true false,
    210                         CreateTime = dtDateTime,
    211                         Name = arrs[arrs.Length - 1],
    212                         Path = ftpRemotePath + "/" + arrs[arrs.Length - 1]
    213                     };
    214                     fileList.Add(model);
    215                 }
    216             }
    217         }
    218         return fileList;
    219     }
    220     /// <summary>      
    221     /// 列出当前目录的所有文件      
    222     /// </summary>      
    223     public List<FileStruct> ListFiles()
    224     {
    225         var listAll = ListFilesAndDirectories();
    226         var listFile = listAll.Where(m => m.IsDirectory == false).ToList();
    227         return listFile;
    228     }
    229     /// <summary>      
    230     /// 列出当前目录的所有一级子目录      
    231     /// </summary>      
    232     public List<FileStruct> ListDirectories()
    233     {
    234         var listAll = ListFilesAndDirectories();
    235         var listFile = listAll.Where(m => m.IsDirectory == true).ToList();
    236         return listFile;
    237     }
    238     /// <summary>      
    239     /// 判断当前目录下指定的子目录或文件是否存在      
    240     /// </summary>      
    241     /// <param name="remoteName">指定的目录或文件名</param>     
    242     public bool IsExist(string remoteName)
    243     {
    244         var list = ListFilesAndDirectories();
    245         if (list.Count(m => m.Name == remoteName) > 0)
    246             return true;
    247         return false;
    248     }
    249     /// <summary>      
    250     /// 判断当前目录下指定的一级子目录是否存在      
    251     /// </summary>      
    252     /// <param name="RemoteDirectoryName">指定的目录名</param>     
    253     public bool IsDirectoryExist(string remoteDirectoryName)
    254     {
    255         var listDir = ListDirectories();
    256         if (listDir.Count(m => m.Name == remoteDirectoryName) > 0)
    257             return true;
    258         return false;
    259     }
    260     /// <summary>      
    261     /// 判断当前目录下指定的子文件是否存在     
    262     /// </summary>      
    263     /// <param name="RemoteFileName">远程文件名</param>      
    264     public bool IsFileExist(string remoteFileName)
    265     {
    266         var listFile = ListFiles();
    267         if (listFile.Count(m => m.Name == remoteFileName) > 0)
    268             return true;
    269         return false;
    270     }
    271  
    272     /// <summary>
    273     /// 下载
    274     /// </summary>
    275     /// <param name="saveFilePath">下载后的保存路径</param>
    276     /// <param name="downloadFileName">要下载的文件名</param>
    277     public void Download(string saveFilePath, string downloadFileName)
    278     {
    279         using (FileStream outputStream = new FileStream(saveFilePath + "\"+ downloadFileName, FileMode.Create))
    280         {
    281             response = Open(newUri(ftpURI + downloadFileName), WebRequestMethods.Ftp.DownloadFile);
    282             using (Stream ftpStream = response.GetResponseStream())
    283             {
    284                 long cl = response.ContentLength;
    285                 int bufferSize = 2048;
    286                 int readCount;
    287                 byte[] buffer = new byte[bufferSize];
    288                 readCount = ftpStream.Read(buffer, 0, bufferSize);
    289                 while (readCount > 0)
    290                 {
    291                     outputStream.Write(buffer, 0, readCount);
    292                     readCount = ftpStream.Read(buffer, 0, bufferSize);
    293                 }
    294             }
    295         }
    296     }
    297  
    298     
    299 }
    300  
    301 public class FileStruct
    302 {
    303     /// <summary>
    304     /// 是否为目录
    305     /// </summary>
    306     public bool IsDirectory { getset; }
    307     /// <summary>
    308     /// 创建时间
    309     /// </summary>
    310     public DateTime CreateTime { getset; }
    311     /// <summary>
    312     /// 文件或目录名称
    313     /// </summary>
    314     public string Name { getset; }
    315     /// <summary>
    316     /// 路径
    317     /// </summary>
    318     public string Path { getset; }
    319 }
  • 相关阅读:
    CentOS 6 安装 python and pip
    Qt for Windows:Qt 5.4.0 MinGW 静态编译版本制作 (转)
    Vim 扩展工具 vim-ide (转)
    centos yum 完全卸载依赖
    Linux修改Shell命令提示符及颜色
    tmux 命令
    网络分析shell脚本(实时流量+连接统计)
    ICMP:Internet控制报文协议
    读《分布式一致性原理》zookeeper运维
    同网段和不同网段设备通信原理详解
  • 原文地址:https://www.cnblogs.com/gc2013/p/3658622.html
Copyright © 2011-2022 走看看