C#一个FTP操作封装类FTPHelper

提供了一个简单易用的FTP文件操作类,支持FTP链接、目录创建、文件上传、下载及多种文件管理功能。

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

001using System;
002using System.Collections.Generic;
003using System.Linq;
004using System.Text;
005using System.Net;
006using System.IO;
007 
008public 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 
301public 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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值