C#一个FTP操作封装类FTPHelper
参考了网上一些代码,作了一些调整优化。001using System;
002using System.Collections.Generic;
003using System.Linq;
004using System.Text;
005using System.Net;
006using System.IO;
007
008public class FTPHelper
009{
010 ///
011 /// FTP请求对象
012 ///
013 FtpWebRequest request = null;
014 ///
015 /// FTP响应对象
016 ///
017 FtpWebResponse response = null;
018 ///
019 /// FTP服务器地址
020 ///
021 public string ftpURI { get; private set; }
022 ///
023 /// FTP服务器IP
024 ///
025 public string ftpServerIP { get; private set; }
026 ///
027 /// FTP服务器默认目录
028 ///
029 public string ftpRemotePath { get; private set; }
030 ///
031 /// FTP服务器登录用户名
032 ///
033 public string ftpUserID { get; private set; }
034 ///
035 /// FTP服务器登录密码
036 ///
037 public string ftpPassword { get; private set; }
038
039 ///
040 /// 初始化
041 ///
042 /// FTP连接地址
043 /// 指定FTP连接成功后的当前目录, 如果不指定即默认为根目录
044 /// 用户名
045 /// 密码
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 ///
068 /// 建立FTP链接,返回响应对象
069 ///
070 /// FTP地址
071 /// 操作命令
072 ///
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 ///
084 /// 建立FTP链接,返回请求对象
085 ///
086 /// FTP地址
087 /// 操作命令
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 ///
098 /// 创建目录
099 ///
100 /// 目录名
101 public void CreateDirectory(string remoteDirectoryName)
102 {
103 response = Open(newUri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory);
104 }
105 ///
106 /// 更改目录或文件名
107 ///
108 /// 当前名称
109 /// 修改后新名称
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 ///
117 /// 切换当前目录
118 ///
119 /// true:绝对路径 false:相对路径
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 ///
130 /// 删除目录(包括下面所有子目录和子文件)
131 ///
132 /// 要删除的带路径目录名:如web/test
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 ///
153 /// 文件上传
154 ///
155 /// 本地文件路径
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;
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 ///
178 /// 删除文件
179 ///
180 /// 要删除的文件名
181 public void DeleteFile(string remoteFileName)
182 {
183 response = Open(newUri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile);
184 }
185
186 ///
187 /// 获取当前目录的文件和一级子目录信息
188 ///
189 ///
190 public List ListFilesAndDirectories()
191 {
192 var fileList = new List();
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-1311:05PM aspnet_client
203 //09-22-1311: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("") > 0 ? true : false,
210 CreateTime = dtDateTime,
211 Name = arrs,
212 Path = ftpRemotePath + "/" + arrs
213 };
214 fileList.Add(model);
215 }
216 }
217 }
218 return fileList;
219 }
220 ///
221 /// 列出当前目录的所有文件
222 ///
223 public List ListFiles()
224 {
225 var listAll = ListFilesAndDirectories();
226 var listFile = listAll.Where(m => m.IsDirectory == false).ToList();
227 return listFile;
228 }
229 ///
230 /// 列出当前目录的所有一级子目录
231 ///
232 public List ListDirectories()
233 {
234 var listAll = ListFilesAndDirectories();
235 var listFile = listAll.Where(m => m.IsDirectory == true).ToList();
236 return listFile;
237 }
238 ///
239 /// 判断当前目录下指定的子目录或文件是否存在
240 ///
241 /// 指定的目录或文件名
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 ///
250 /// 判断当前目录下指定的一级子目录是否存在
251 ///
252 /// 指定的目录名
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 ///
261 /// 判断当前目录下指定的子文件是否存在
262 ///
263 /// 远程文件名
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 ///
273 /// 下载
274 ///
275 /// 下载后的保存路径
276 /// 要下载的文件名
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;
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 ///
304 /// 是否为目录
305 ///
306 public bool IsDirectory { get; set; }
307 ///
308 /// 创建时间
309 ///
310 public DateTime CreateTime { get; set; }
311 ///
312 /// 文件或目录名称
313 ///
314 public string Name { get; set; }
315 ///
316 /// 路径
317 ///
318 public string Path { get; set; }
319}
页:
[1]