ftp文件操作类
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Net;
6 using System.IO;
7 using System.Data;
8 using System.ComponentModel;
9 using System.Windows.Forms;
10 using System.Text.RegularExpressions;
11 using System.Globalization;
12 using System.Collections;
13
14 namespace ESIMRobot
15 {
16 #region 文件信息结构
17 public struct FileStruct
18 {
19 public string Flags;
20 public string Owner;
21 public string Group;
22 public bool IsDirectory;
23 public DateTime CreateTime;
24 public string Name;
25 }
26 public enum FileListStyle
27 {
28 UnixStyle,
29 WindowsStyle,
30 Unknown
31 }
32 #endregion
33
34 /// <summary>
35 /// ftp文件上传、下载操作类
36 /// </summary>
37 public class FTPHelper
38 {
39 private string ftpServerURL;
40 private string ftpUser;
41 private string ftpPassWord;
42
43 /// <summary>
44 ///
45 /// </summary>
46 /// <param name="ftpServerURL">ftp服务器路径</param>
47 /// <param name="ftpUser">ftp用户名</param>
48 /// <param name="ftpPassWord">ftp用户名</param>
49 public FTPHelper(string ftpServerURL, string ftpUser, string ftpPassWord)
50 {
51 this.ftpServerURL = ftpServerURL;
52 this.ftpUser = ftpUser;
53 this.ftpPassWord = ftpPassWord;
54 }
55 /// <summary>
56 ///通过用户名,密码连接到FTP服务器
57 /// </summary>
58 /// <param name="ftpUser">ftp用户名,匿名为“”</param>
59 /// <param name="ftpPassWord">ftp登陆密码,匿名为“”</param>
60 public FTPHelper(string ftpUser, string ftpPassWord)
61 {
62 this.ftpUser = ftpUser;
63 this.ftpPassWord = ftpPassWord;
64 }
65
66 /// <summary>
67 /// 匿名访问
68 /// </summary>
69 public FTPHelper(string ftpURL)
70 {
71 this.ftpUser = "";
72 this.ftpPassWord = "";
73 }
74
75
76 //**************************************************** Start_1 *********************************************************//
77 /// <summary>
78 /// 从FTP下载文件到本地服务器,支持断点下载
79 /// </summary>
80 /// <param name="ftpFilePath">ftp文件路径,如"ftp://localhost/test.txt"</param>
81 /// <param name="saveFilePath">保存文件的路径,如C:\\test.txt</param>
82 public void BreakPointDownLoadFile(string ftpFilePath, string saveFilePath)
83 {
84 System.IO.FileStream fs = null;
85 System.Net.FtpWebResponse ftpRes = null;
86 System.IO.Stream resStrm = null;
87 try
88 {
89 //下载文件的URI
90 Uri uri = new Uri(ftpFilePath);
91 //设定下载文件的保存路径
92 string downFile = saveFilePath;
93
94 //FtpWebRequest的作成
95 System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest)
96 System.Net.WebRequest.Create(uri);
97 //设定用户名和密码
98 ftpReq.Credentials = new System.Net.NetworkCredential(ftpUser, ftpPassWord);
99 //MethodにWebRequestMethods.Ftp.DownloadFile("RETR")设定
100 ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
101 //要求终了后关闭连接
102 ftpReq.KeepAlive = false;
103 //使用ASCII方式传送
104 ftpReq.UseBinary = false;
105 //设定PASSIVE方式无效
106 ftpReq.UsePassive = false;
107
108 //判断是否继续下载
109 //继续写入下载文件的FileStream
110 if (System.IO.File.Exists(downFile))
111 {
112 //继续下载
113 ftpReq.ContentOffset = (new System.IO.FileInfo(downFile)).Length;
114 fs = new System.IO.FileStream(
115 downFile, System.IO.FileMode.Append, System.IO.FileAccess.Write);
116 }
117 else
118 {
119 //一般下载
120 fs = new System.IO.FileStream(
121 downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);
122 }
123
124 //取得FtpWebResponse
125 ftpRes = (System.Net.FtpWebResponse)ftpReq.GetResponse();
126 //为了下载文件取得Stream
127 resStrm = ftpRes.GetResponseStream();
128 //写入下载的数据
129 byte[] buffer = new byte[1024];
130 while (true)
131 {
132 int readSize = resStrm.Read(buffer, 0, buffer.Length);
133 if (readSize == 0)
134 break;
135 fs.Write(buffer, 0, readSize);
136 }
137 }
138 catch (Exception ex)
139 {
140 throw new Exception("从ftp服务器下载文件出错,文件名:" + ftpFilePath + "异常信息:" + ex.ToString());
141 }
142 finally
143 {
144 fs.Close();
145 resStrm.Close();
146 ftpRes.Close();
147 }
148 }
149
150
151 #region
152 //从FTP上下载整个文件夹,包括文件夹下的文件和文件夹函数列表
153
154 /// <summary>
155 /// 从ftp下载文件到本地服务器
156 /// </summary>
157 /// <param name="ftpFilePath">要下载的ftp文件路径,如ftp://192.168.1.104/capture-2.avi</param>
158 /// <param name="saveFilePath">本地保存文件的路径,如(@"d:\capture-22.avi"</param>
159 public void DownLoadFile(string ftpFilePath, string saveFilePath)
160 {
161 Stream responseStream = null;
162 FileStream fileStream = null;
163 StreamReader reader = null;
164 try
165 {
166 // string downloadUrl = "ftp://192.168.1.104/capture-2.avi";
167 FtpWebRequest downloadRequest = (FtpWebRequest)WebRequest.Create(ftpFilePath);
168 downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile;
169 downloadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
170 FtpWebResponse downloadResponse = (FtpWebResponse)downloadRequest.GetResponse();
171 responseStream = downloadResponse.GetResponseStream();
172
173 fileStream = File.Create(saveFilePath);
174 byte[] buffer = new byte[1024];
175 int bytesRead;
176 while (true)
177 {
178 bytesRead = responseStream.Read(buffer, 0, buffer.Length);
179 if (bytesRead == 0)
180 break;
181 fileStream.Write(buffer, 0, bytesRead);
182 }
183 }
184 catch (Exception ex)
185 {
186 throw new Exception("从ftp服务器下载文件出错,文件名:" + ftpFilePath + "异常信息:" + ex.ToString());
187 }
188 finally
189 {
190 if (reader != null)
191 {
192 reader.Close();
193 }
194 if (responseStream != null)
195 {
196 responseStream.Close();
197 }
198 if (fileStream != null)
199 {
200 fileStream.Close();
201 }
202 }
203 }
204
205
206 /// <summary>
207 /// 列出当前目录下的所有文件和目录
208 /// </summary>
209 /// <param name="ftpDirPath">FTP目录</param>
210 /// <returns></returns>
211 public List<FileStruct> ListCurrentDirFilesAndChildDirs(string ftpDirPath)
212 {
213 WebResponse webresp = null;
214 StreamReader ftpFileListReader = null;
215 FtpWebRequest ftpRequest = null;
216 try
217 {
218 ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpDirPath));
219 ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
220 ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
221 webresp = ftpRequest.GetResponse();
222 ftpFileListReader = new StreamReader(webresp.GetResponseStream(),Encoding.GetEncoding("UTF-8"));
223 }
224 catch (Exception ex)
225 {
226 throw new Exception("获取文件列表出错,错误信息如下:" + ex.ToString());
227 }
228 string Datastring = ftpFileListReader.ReadToEnd();
229 return GetListX(Datastring);
230
231 }
232
233 /// <summary>
234 /// 列出当前目录下的所有文件
235 /// </summary>
236 /// <param name="ftpDirPath">FTP目录</param>
237 /// <returns></returns>
238 public List<FileStruct> ListCurrentDirFiles(string ftpDirPath)
239 {
240 List<FileStruct> listAll = ListCurrentDirFilesAndChildDirs(ftpDirPath);
241 List<FileStruct> listFile = new List<FileStruct>();
242 foreach (FileStruct file in listAll)
243 {
244 if (!file.IsDirectory)
245 {
246 listFile.Add(file);
247 }
248 }
249 return listFile;
250 }
251
252
253 /// <summary>
254 /// 列出当前目录下的所有子目录
255 /// </summary>
256 /// <param name="ftpDirath">FRTP目录</param>
257 /// <returns>目录列表</returns>
258 public List<FileStruct> ListCurrentDirChildDirs(string ftpDirath)
259 {
260 List<FileStruct> listAll = ListCurrentDirFilesAndChildDirs(ftpDirath);
261 List<FileStruct> listDirectory = new List<FileStruct>();
262 foreach (FileStruct file in listAll)
263 {
264 if (file.IsDirectory)
265 {
266 listDirectory.Add(file);
267 }
268 }
269 return listDirectory;
270 }
271
272
273 /// <summary>
274 /// 获得文件和目录列表(返回类型为: List<FileStruct> )
275 /// </summary>
276 /// <param name="datastring">FTP返回的列表字符信息</param>
277 private List<FileStruct> GetListX(string datastring)
278 {
279 List<FileStruct> myListArray = new List<FileStruct>();
280 string[] dataRecords = datastring.Split('\n');
281 FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);
282 foreach (string s in dataRecords)
283 {
284 if (_directoryListStyle != FileListStyle.Unknown && s != "")
285 {
286 FileStruct f = new FileStruct();
287 f.Name = "..";
288 switch (_directoryListStyle)
289 {
290 case FileListStyle.UnixStyle:
291 f = ParseFileStructFromUnixStyleRecord(s);
292 break;
293 case FileListStyle.WindowsStyle:
294 f = ParseFileStructFromWindowsStyleRecord(s);
295 break;
296 }
297 if (!(f.Name == "." || f.Name == ".."))
298 {
299 myListArray.Add(f);
300 }
301 }
302 }
303 return myListArray;
304 }
305 /// <summary>
306 /// 从Unix格式中返回文件信息
307 /// </summary>
308 /// <param name="Record">文件信息</param>
309 private FileStruct ParseFileStructFromUnixStyleRecord(string Record)
310 {
311 FileStruct f = new FileStruct();
312 string processstr = Record.Trim();
313 f.Flags = processstr.Substring(0, 10);
314 f.IsDirectory = (f.Flags[0] == 'd');
315 processstr = (processstr.Substring(11)).Trim();
316 cutSubstringFromStringWithTrim(ref processstr, ' ', 0); //跳过一部分
317 f.Owner = cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
318 f.Group = cutSubstringFromStringWithTrim(ref processstr, ' ', 0);
319 cutSubstringFromStringWithTrim(ref processstr, ' ', 0); //跳过一部分
320 string yearOrTime = processstr.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[2];
321 if (yearOrTime.IndexOf(":") >= 0) //time
322 {
323 processstr = processstr.Replace(yearOrTime, DateTime.Now.Year.ToString());
324 }
325 f.CreateTime = DateTime.Parse(cutSubstringFromStringWithTrim(ref processstr, ' ', 8));
326 f.Name = processstr; //最后就是名称
327 return f;
328 }
329
330 /// <summary>
331 /// 从Windows格式中返回文件信息
332 /// </summary>
333 /// <param name="Record">文件信息</param>
334 private FileStruct ParseFileStructFromWindowsStyleRecord(string Record)
335 {
336 FileStruct f = new FileStruct();
337 string processstr = Record.Trim();
338 string dateStr = processstr.Substring(0, 8);
339 processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();
340 string timeStr = processstr.Substring(0, 7);
341 processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();
342 DateTimeFormatInfo myDTFI = new CultureInfo("en-US", false).DateTimeFormat;
343 myDTFI.ShortTimePattern = "t";
344 f.CreateTime = DateTime.Parse(dateStr + " " + timeStr, myDTFI);
345 if (processstr.Substring(0, 5) == "<DIR>")
346 {
347 f.IsDirectory = true;
348 processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();
349 }
350 else
351 {
352 string[] strs = processstr.Split(new char[] { ' ' }, 2);// StringSplitOptions.RemoveEmptyEntries); // true);
353 processstr = strs[1];
354 f.IsDirectory = false;
355 }
356 f.Name = processstr;
357 return f;
358 }
359
360
361 /// <summary>
362 /// 按照一定的规则进行字符串截取
363 /// </summary>
364 /// <param name="s">截取的字符串</param>
365 /// <param name="c">查找的字符</param>
366 /// <param name="startIndex">查找的位置</param>
367 private string cutSubstringFromStringWithTrim(ref string s, char c, int startIndex)
368 {
369 int pos1 = s.IndexOf(c, startIndex);
370 string retString = s.Substring(0, pos1);
371 s = (s.Substring(pos1)).Trim();
372 return retString;
373 }
374
375
376 /// <summary>
377 /// 判断文件列表的方式Window方式还是Unix方式
378 /// </summary>
379 /// <param name="recordList">文件信息列表</param>
380 private FileListStyle GuessFileListStyle(string[] recordList)
381 {
382 foreach (string s in recordList)
383 {
384 if (s.Length > 10
385 && Regex.IsMatch(s.Substring(0, 10), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))
386 {
387 return FileListStyle.UnixStyle;
388 }
389 else if (s.Length > 8
390 && Regex.IsMatch(s.Substring(0, 8), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))
391 {
392 return FileListStyle.WindowsStyle;
393 }
394 }
395 return FileListStyle.Unknown;
396 }
397
398
399 /// <summary>
400 /// 从FTP下载整个文件夹
401 /// </summary>
402 /// <param name="ftpDirPath">FTP文件夹路径</param>
403 /// <param name="saveDirPath">保存的本地文件夹路径</param>
404 /// 调用实例: DownFtpDir("FTP://192.168.1.113/WangJin", @"C:\QMDownload\SoftMgr");
405 /// 当调用的时候先判断saveDirPath的子目录中是否有WangJin目录,有则执行,没有创建后执行
406 /// 最终文件保存在@"C:\QMDownload\SoftMgr\WangJin"下
407 public bool DownFtpDir(string ftpDirPath, string saveDirPath)
408 {
409 bool success = true;
410 try
411 {
412 List<FileStruct> files = ListCurrentDirFilesAndChildDirs(ftpDirPath);
413 if (!Directory.Exists(saveDirPath))
414 {
415 Directory.CreateDirectory(saveDirPath);
416 }
417 foreach (FileStruct f in files)
418 {
419 if (f.IsDirectory) //文件夹,递归查询
420 {
421 DownFtpDir(ftpDirPath + "/" + f.Name, saveDirPath + "\\" + f.Name);
422 }
423 else //文件,直接下载
424 {
425 DownLoadFile(ftpDirPath + "/" + f.Name, saveDirPath + "\\" + f.Name);
426 }
427 }
428 }
429 catch (Exception e)
430 {
431 MessageBox.Show(e.Message);
432 success = false;
433 }
434 return success;
435 }
436 #endregion
437
438
439
440 /// <summary>
441 /// 列出当前目录下的所有子目录和文件到TreeView控件中
442 /// </summary>
443 /// <param name="ftpDirPath"> FTP服务器目录 </param>
444 /// <param name="treeview">显示到TreeView控件中</param>
445 /// <param name="treenode">TreeView控件的子节点</param>
446 public void ListCurrentDirFilesAndDirToTreeView(string ftpDirPath, TreeView treeview, TreeNode treenode)
447 {
448 if (ftpDirPath == "")
449 {
450 ftpDirPath = ftpServerURL;
451 }
452 if (treeview != null)
453 {
454 treeview.Nodes.Clear();
455 treenode = treeview.Nodes.Add(ftpDirPath);
456 }
457 List<FileStruct> files = ListCurrentDirFilesAndChildDirs(ftpDirPath);
458 foreach (FileStruct f in files)
459 {
460 if (f.IsDirectory) //如果为目录(文件夹),递归调用
461 {
462 TreeNode td = treenode.Nodes.Add(f.Name);
463 ListCurrentDirFilesAndDirToTreeView(ftpDirPath + "/" + f.Name, null, td);
464 }
465 else //如果为文件,直接加入到节点中
466 {
467 treenode.Nodes.Add(f.Name);
468 }
469 }
470 }
471 //************************************* End_1 ****************************//
472
473
474
475
476 //************************************ Start_2 ***************************//
477 /// <summary>
478 /// 检测文件或文件目录是否存在
479 /// </summary>
480 /// <param name="ftpDirPath">ftp服务器中的目录路径</param>
481 /// <param name="ftpDirORFileName">待检测的文件或文件名</param>
482 /// <returns></returns>
483 /// 操作实例: ftpclient.fileOrDirCheckExist("FTP://192.168.1.113/Record/", "")
484 /// ftpclient.fileOrDirCheckExist("FTP://192.168.1.113/RecordFile/", "333.txt")
485 public bool fileOrDirCheckExist(string ftpDirPath, string ftpDirORFileName)
486 {
487 bool success = true;
488 FtpWebRequest ftpWebRequest = null;
489 WebResponse webResponse = null;
490 StreamReader reader = null;
491 try
492 {
493 string url = ftpDirPath + ftpDirORFileName;
494 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
495 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
496 ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory;
497 ftpWebRequest.KeepAlive = false;
498 webResponse = ftpWebRequest.GetResponse();
499 reader = new StreamReader(webResponse.GetResponseStream());
500 string line = reader.ReadLine();
501 while (line != null)
502 {
503 if (line == ftpDirORFileName)
504 {
505 break;
506 }
507 line = reader.ReadLine();
508 }
509 }
510 catch (Exception)
511 {
512 success = false;
513 }
514 finally
515 {
516 if (reader != null)
517 {
518 reader.Close();
519 }
520 if (webResponse != null)
521 {
522 webResponse.Close();
523 }
524 }
525 return success;
526 }
527
528
529 /// <summary>
530 /// 获得文件和目录列表(返回类型为:FileStruct)
531 /// </summary>
532 /// <param name="datastring">FTP返回的列表字符信息</param>
533 public FileStruct GetList(string datastring)
534 {
535 FileStruct f = new FileStruct();
536 string[] dataRecords = datastring.Split('\n');
537 FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);
538 if (_directoryListStyle != FileListStyle.Unknown && datastring != "")
539 {
540
541 switch (_directoryListStyle)
542 {
543 case FileListStyle.UnixStyle:
544 f = ParseFileStructFromUnixStyleRecord(datastring);
545 break;
546 case FileListStyle.WindowsStyle:
547 f = ParseFileStructFromWindowsStyleRecord(datastring);
548 break;
549 }
550 }
551 return f;
552 }
553
554
555 /// <summary>
556 /// 上传
557 /// </summary>
558 /// <param name="localFilePath">本地文件名路径</param>
559 /// <param name="ftpDirPath">上传到ftp中目录的路径</param>
560 /// <param name="ftpFileName">上传到ftp中目录的文件名</param>
561 /// <param name="fileLength">限制上传文件的大小(Bytes为单位)</param>
562 /// 操作实例: ftpclient.fileUpload(@"E:\bin\Debug\Web\RecordFile\wangjin\wangjin.txt", "FTP://192.168.1.113/Record/","123.txt",0 );
563 public bool UploadFile(FileInfo localFilePath, string ftpDirPath, string ftpFileName, long fileLength)
564 {
565 bool success = true;
566 long filesize = 0;
567 FtpWebRequest ftpWebRequest = null;
568 FileStream localFileStream = null;
569 Stream requestStream = null;
570 if (fileLength > 0)
571 {
572 filesize = fileLength * 1024 * 1024;
573 }
574 if (localFilePath.Length <= filesize || filesize == 0)
575 {
576 if (fileOrDirCheckExist(ftpDirPath.Substring(0, ftpDirPath.LastIndexOf(@"/") + 1), ftpDirPath.Substring(ftpDirPath.LastIndexOf(@"/") + 1)))
577 {
578 try
579 {
580 string uri = ftpDirPath + ftpFileName;
581 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
582 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
583 ftpWebRequest.UseBinary = true;
584 ftpWebRequest.KeepAlive = false;
585 ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
586 ftpWebRequest.ContentLength = localFilePath.Length;
587 int buffLength = 2048; //定义缓存大小2KB
588 byte[] buff = new byte[buffLength];
589 int contentLen;
590 localFileStream = localFilePath.OpenRead();
591 requestStream = ftpWebRequest.GetRequestStream();
592 contentLen = localFileStream.Read(buff, 0, buffLength);
593 while (contentLen != 0)
594 {
595 requestStream.Write(buff, 0, contentLen);
596 contentLen = localFileStream.Read(buff, 0, buffLength);
597 }
598 }
599 catch (Exception)
600 {
601 success = false;
602 }
603 finally
604 {
605 if (requestStream != null)
606 {
607 requestStream.Close();
608 }
609 if (localFileStream != null)
610 {
611 localFileStream.Close();
612 }
613 }
614 }
615 else
616 {
617 success = false;
618 MessageBox.Show("FTP文件路径不存在!");
619 }
620 }
621 else
622 {
623 success = false;
624 MessageBox.Show("文件大小超过设置范围!" + "\n" + "文件实际大小为:" + localFilePath.Length + "\n" + "允许上传阈值为:" + (5 * 1024 * 1024).ToString());
625 }
626 return success;
627 }
628
629 /// <summary>
630 /// 下载文件
631 /// </summary>
632 /// <param name="ftpFilePath">需要下载的文件名路径</param>
633 /// <param name="localFilePath">本地保存的文件名路径)</param>
634 /// 操作实例: ftpclient.fileDownload(@"E:\bin\Debug\Web\RecordFile\wangjin\459.txt", "FTP://192.168.1.113/Record/123.txt");
635 public bool DownloadFile( string localFilePath, string ftpFilePath)
636 {
637 bool success = true;
638 FtpWebRequest ftpWebRequest = null;
639 FtpWebResponse ftpWebResponse = null;
640 Stream ftpResponseStream = null;
641 FileStream outputStream = null;
642 try
643 {
644 outputStream = new FileStream(localFilePath, FileMode.Create);
645 string uri = ftpFilePath;
646 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
647 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
648 ftpWebRequest.UseBinary = true;
649 ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
650 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
651 ftpResponseStream = ftpWebResponse.GetResponseStream();
652 long contentLength = ftpWebResponse.ContentLength;
653 int bufferSize = 2048;
654 byte[] buffer = new byte[bufferSize];
655 int readCount;
656 readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
657 while (readCount > 0)
658 {
659 outputStream.Write(buffer, 0, readCount);
660 readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
661 }
662 }
663 catch (Exception)
664 {
665 success = false;
666 }
667 finally
668 {
669 if (outputStream != null)
670 {
671 outputStream.Close();
672 }
673 if (ftpResponseStream != null)
674 {
675 ftpResponseStream.Close();
676 }
677 if (ftpWebResponse != null)
678 {
679 ftpWebResponse.Close();
680 }
681 }
682 return success;
683 }
684
685
686 /// <summary>
687 /// 重命名
688 /// </summary>
689 /// <param name="ftpDirPath">ftp服务器中的目录</param>
690 /// <param name="currentFilename">当前要修改的文件名</param>
691 /// <param name="newFilename">修改后的新文件名</param>
692 /// 操作实例: ftpclientxy.fileRename("FTP://192.168.1.113/RecordFile/", "123.txt", "333.txt");
693 public bool RenameFile(string ftpDirPath, string currentFileName, string newFileName)
694 {
695 bool success = true;
696 FtpWebRequest ftpWebRequest = null;
697 FtpWebResponse ftpWebResponse = null;
698 Stream ftpResponseStream = null;
699 if (fileOrDirCheckExist(ftpDirPath.Substring(0, ftpDirPath.LastIndexOf(@"/") + 1), ftpDirPath.Substring(ftpDirPath.LastIndexOf(@"/") + 1)))
700 {
701 try
702 {
703 string uri = ftpDirPath + currentFileName;
704 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
705 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
706 ftpWebRequest.UseBinary = true;
707 ftpWebRequest.Method = WebRequestMethods.Ftp.Rename;
708 ftpWebRequest.RenameTo = newFileName;
709 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
710 ftpResponseStream = ftpWebResponse.GetResponseStream();
711 }
712 catch (Exception)
713 {
714 success = false;
715 }
716 finally
717 {
718 if (ftpResponseStream != null)
719 {
720 ftpResponseStream.Close();
721 }
722 if (ftpWebResponse != null)
723 {
724 ftpWebResponse.Close();
725 }
726 }
727 }
728 else
729 {
730 success = false;
731 MessageBox.Show("FTP文件路径不存在!");
732 }
733 return success;
734 }
735
736 /// <summary>
737 /// 在目录下创建子目录
738 /// </summary>
739 /// <param name="ftpDirPath">ftp服务器中的目录</param>
740 /// <param name="ftpFileDir">待创建的子目录</param>
741 /// <returns></returns>
742 /// 操作实例: ftpclient.fileDirMake("FTP://192.168.1.113/RecordFile/", "WangJinFile")
743 public bool MakeDir(string ftpDirPath, string ftpFileDir)
744 {
745 bool success = true;
746 FtpWebRequest ftpWebRequest = null;
747 WebResponse webResponse = null;
748 StreamReader reader = null;
749 try
750 {
751 string url = ftpDirPath + ftpFileDir;
752 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
753 // 指定数据传输类型
754 ftpWebRequest.UseBinary = true;
755 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
756 ftpWebRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
757 webResponse = ftpWebRequest.GetResponse();
758 }
759 catch (Exception)
760 {
761 success = false;
762 }
763 finally
764 {
765 if (reader != null)
766 {
767 reader.Close();
768 }
769 if (webResponse != null)
770 {
771 webResponse.Close();
772 }
773 }
774 return success;
775 }
776
777
778 /// <summary>
779 /// 删除目录中的文件
780 /// </summary>
781 /// <param name="ftpDirPath"></param>
782 /// <param name="ftpFileName"></param>
783 /// <returns></returns>
784 /// 操作实例: ftpclient.fileDelete("FTP://192.168.1.113/RecordFile/WangJinFile/", "333.txt")
785 public bool DeleteFile(string ftpDirPath, string ftpFileName)
786 {
787 bool success = true;
788 FtpWebRequest ftpWebRequest = null;
789 FtpWebResponse ftpWebResponse = null;
790 Stream ftpResponseStream = null;
791 StreamReader streamReader = null;
792 try
793 {
794 string uri = ftpDirPath + ftpFileName;
795 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
796 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
797 ftpWebRequest.KeepAlive = false;
798 ftpWebRequest.Method = WebRequestMethods.Ftp.DeleteFile;
799 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
800 long size = ftpWebResponse.ContentLength;
801 ftpResponseStream = ftpWebResponse.GetResponseStream();
802 streamReader = new StreamReader(ftpResponseStream);
803 string result = String.Empty;
804 result = streamReader.ReadToEnd();
805 }
806 catch (Exception)
807 {
808 success = false;
809 }
810 finally
811 {
812 if (streamReader != null)
813 {
814 streamReader.Close();
815 }
816 if (ftpResponseStream != null)
817 {
818 ftpResponseStream.Close();
819 }
820 if (ftpWebResponse != null)
821 {
822 ftpWebResponse.Close();
823 }
824 }
825 return success;
826 }
827
828 /// <summary>
829 /// 获取目录的子目录数组
830 /// </summary>
831 /// <param name="ftpDirPath"></param>
832 /// <returns></returns>
833 /// 操作实例: string []filedir = ftpclient.GetDeleteFolderArray("FTP://192.168.1.113/WangJinFile/");
834 public string[] GetDirArray(string ftpDirPath)
835 {
836 string[] deleteFolders;
837 FtpWebRequest ftpWebRequest = null;
838 FtpWebResponse ftpWebResponse = null;
839 Stream ftpResponseStream = null;
840 StreamReader streamReader = null;
841 StringBuilder result = new StringBuilder();
842 try
843 {
844 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpDirPath));
845 ftpWebRequest.UseBinary = true;
846 ftpWebRequest.UsePassive = false;
847 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
848 ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
849 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
850 Encoding encoding = Encoding.GetEncoding("UTF-8");
851 ftpResponseStream = ftpWebResponse.GetResponseStream();
852 streamReader = new StreamReader(ftpResponseStream, encoding);
853 streamReader = new StreamReader(ftpResponseStream);
854 String line = streamReader.ReadLine();
855 bool flag = false;
856 while (line != null)
857 {
858 FileStruct f = new FileStruct();
859 f = GetList(line);
860 String fileName = f.Name;
861 if (f.IsDirectory)
862 {
863 result.Append(fileName);
864 result.Append("\n");
865 flag = true;
866 line = streamReader.ReadLine();
867 continue;
868 }
869 line = streamReader.ReadLine();
870 }
871 streamReader.Close();
872 ftpWebResponse.Close();
873 if (flag)
874 {
875 result.Remove(result.ToString().LastIndexOf("\n"), 1);
876 return result.ToString().Split('\n');
877 }
878 else
879 {
880 deleteFolders = null;
881 return deleteFolders;
882 }
883 }
884 catch (Exception ex)
885 {
886 MessageBox.Show(ex.ToString(), "获取文件夹数组过程中出现异常");
887 deleteFolders = null;
888 return deleteFolders;
889 }
890 }
891
892 /// <summary>
893 /// 获取目录中文件数组
894 /// </summary>
895 /// <param name="ftpDirPath"></param>
896 /// <returns></returns>
897 /// 操作实例: string []filedir_Childrenfiles = ftpclient.GetDeleteFolderArray("FTP://192.168.1.113/WangJinFile/");
898 public string[] GetFileArray(string ftpDirPath)
899 {
900 string[] DeleteFiles;
901 FtpWebRequest ftpWebRequest = null;
902 FtpWebResponse ftpWebResponse = null;
903 Stream ftpResponseStream = null;
904 StreamReader streamReader = null;
905 StringBuilder result = new StringBuilder();
906 try
907 {
908 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpDirPath));
909 ftpWebRequest.UseBinary = true;
910 ftpWebRequest.UsePassive = false;
911 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
912 ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
913 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
914 Encoding encoding = Encoding.GetEncoding("UTF-8");
915 ftpResponseStream = ftpWebResponse.GetResponseStream();
916 streamReader = new StreamReader(ftpResponseStream, encoding);
917 streamReader = new StreamReader(ftpResponseStream);
918 String line = streamReader.ReadLine();
919 bool flag = false;
920 while (line != null)
921 {
922 FileStruct f = new FileStruct();
923 f = GetList(line);
924 String fileName = f.Name;
925 //排除非文件夹
926 if (!f.IsDirectory)
927 {
928 result.Append(fileName);
929 result.Append("\n");
930 flag = true;
931 line = streamReader.ReadLine();
932 continue;
933 }
934 line = streamReader.ReadLine();
935 }
936 streamReader.Close();
937 ftpWebResponse.Close();
938 if (flag)
939 {
940 result.Remove(result.ToString().LastIndexOf("\n"), 1);
941 return result.ToString().Split('\n');
942 }
943 else
944 {
945 DeleteFiles = null;
946 return DeleteFiles;
947 }
948 }
949 catch (Exception ex)
950 {
951 MessageBox.Show(ex.ToString(), "获取文件数组过程中出现异常");
952 DeleteFiles = null;
953 return DeleteFiles;
954 }
955 }
956
957 /// <summary>
958 /// 删除目录中的文件
959 /// </summary>
960 /// <param name="ftpFilePath"> 待删除的目录中的文件路径</param>
961 /// <returns></returns>
962 /// ftpclient.DeleteChilderFile("FTP://192.168.1.113/WangJinFile/bin/From1.cs")
963 private bool DeleteFile(string ftpFilePath)
964 {
965 bool success = true;
966 FtpWebRequest ftpWebRequest = null;
967 FtpWebResponse ftpWebResponse = null;
968 try
969 {
970 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpFilePath));
971 ftpWebRequest.UseBinary = true;
972 ftpWebRequest.UsePassive = false;
973 ftpWebRequest.KeepAlive = false;
974 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
975 ftpWebRequest.Method = WebRequestMethods.Ftp.DeleteFile;
976 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
977 ftpWebResponse.Close();
978 }
979 catch (Exception ex)
980 {
981 success = false;
982 MessageBox.Show(ex.ToString(), "删除文件过程中出现错误");
983 }
984 return success;
985 }
986
987 /// <summary>
988 /// 删除目录(条件为:该目录无文件)
989 /// </summary>
990 /// <param name="ftpDirPath">为所要删除的文件的全路径</param>
991 /// 操作实例: ftpclient.DeleteFileDir("FTP://192.168.1.113/WangJinFile/bin/")
992 public bool DeleteNullFileDir(string ftpDirPath)
993 {
994 bool success = true;
995 FtpWebRequest ftpWebRequest = null;
996 FtpWebResponse ftpWebResponse = null;
997 try
998 {
999 ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpDirPath));
1000 ftpWebRequest.UseBinary = true;
1001 ftpWebRequest.UsePassive = false;
1002 ftpWebRequest.KeepAlive = false;
1003 ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);
1004 ftpWebRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
1005 ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
1006 ftpWebResponse.Close();
1007 }
1008 catch (Exception ex)
1009 {
1010 success = false;
1011 MessageBox.Show(ex.ToString(), "删除文件夹过程中出现错误");
1012 }
1013 return success;
1014 }
1015
1016
1017
1018 /// <summary>
1019 /// 删除目录和文件
1020 /// </summary>
1021 /// <param name="ftpDirPath">待删除的目录(包含子目录和文件)</param>
1022 /// 调用实例: ftpclient.DeleteFileDirAndChilderFiles("FTP://192.168.1.113/RecordFile/WangJinFile")
1023 public bool DeleteDirAndFiles(string ftpDirPath)
1024 {
1025 bool success = true;
1026 try
1027 {
1028 string[] folderArray = GetDirArray(ftpDirPath + @"/");
1029 string[] fileArray = GetFileArray(ftpDirPath + @"/");
1030 ArrayList folderArrayList = new ArrayList();
1031 ArrayList fileArrayList = new ArrayList();
1032 //重新构造存放文件夹的数组(用动态数组实现)
1033 if (folderArray != null)
1034 {
1035 for (int i = 0; i < folderArray.Length; i++)
1036 {
1037 if (folderArray[i] == "." || folderArray[i] == ".." || folderArray[i] == "")
1038 {
1039 }
1040 else
1041 {
1042 folderArrayList.Add(folderArray[i]);
1043 }
1044 }
1045 }
1046 if (fileArray != null)
1047 {
1048 //重新构造存放文件的数组(用动态数组实现)
1049 for (int i = 0; i < fileArray.Length; i++)
1050 {
1051 if (fileArray[i] == "")
1052 {
1053 }
1054 else
1055 {
1056 fileArrayList.Add(fileArray[i]);
1057 }
1058 }
1059 }
1060 if (folderArrayList.Count == 0 && fileArrayList.Count == 0) //选定目录中: 子目录 = 0, 子文件 = 0
1061 {
1062 DeleteNullFileDir(ftpDirPath);
1063 }
1064 else if (folderArrayList.Count == 0 && fileArrayList.Count != 0) //选定目录中: 子目录 = 0, 子文件 > 0
1065 {
1066 //删除所有子文件
1067 for (int i = 0; i < fileArrayList.Count; i++)
1068 {
1069 string fileUri = ftpDirPath + "/" + fileArrayList[i];
1070 DeleteFile(fileUri);
1071 }
1072 //删除选定目录
1073 DeleteNullFileDir(ftpDirPath);
1074 }
1075 else if (folderArrayList.Count != 0 && fileArrayList.Count != 0) //选定目录中: 子目录 >0, 子文件 > 0
1076 {
1077 //删除所有子文件
1078 for (int i = 0; i < fileArrayList.Count; i++)
1079 {
1080 string fileUri = ftpDirPath + "/" + fileArrayList[i];
1081 DeleteFile(fileUri);
1082 }
1083 //删除文件目录
1084 for (int i = 0; i < folderArrayList.Count; i++)
1085 {
1086 string dirUri = ftpDirPath + "/" + folderArrayList[i];
1087 DeleteDirAndFiles(dirUri);
1088 }
1089 DeleteNullFileDir(ftpDirPath);
1090 }
1091 else if (folderArrayList.Count != 0 && fileArrayList.Count == 0) //选定目录中: 子目录 >0, 子文件 = 0
1092 {
1093 //删除所有子文件
1094 for (int i = 0; i < folderArrayList.Count; i++)
1095 {
1096 string dirUri = ftpDirPath + "/" + folderArrayList[i];
1097 DeleteDirAndFiles(dirUri);
1098 }
1099 DeleteNullFileDir(ftpDirPath);
1100 }
1101 success = true;
1102 }
1103 catch (Exception ex)
1104 {
1105 success = false;
1106 MessageBox.Show(ex.ToString(), "删除目录过程中出现异常");
1107 }
1108 return success;
1109 }
1110
1111 //****************************************** End_2 ********************************************//
1112 }
1113 }