View Code
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Net; 5 using System.IO; 6 using System.Globalization; 7 using System.Text.RegularExpressions; 8 namespace WebBaseLib 9 { 10 /// <summary> 11 /// FTP处理操作类 12 /// 功能: 13 /// 下载文件 14 /// 上传文件 15 /// 上传文件的进度信息 16 /// 下载文件的进度信息 17 /// 删除文件 18 /// 列出文件 19 /// 列出目录 20 /// 进入子目录 21 /// 退出当前目录返回上一层目录 22 /// 判断远程文件是否存在 23 /// 判断远程文件是否存在 24 /// 删除远程文件 25 /// 建立目录 26 /// 删除目录 27 /// 文件(目录)改名 28 /// </summary> 29 /// <remarks> 30 /// 创建人:南疯 31 /// 创建时间:2007年4月28日 32 /// </remarks> 33 #region 文件信息结构 34 public struct FileStruct 35 { 36 public string Flags; 37 public string Owner; 38 public string Group; 39 public bool IsDirectory; 40 public DateTime CreateTime; 41 public string Name; 42 } 43 public enum FileListStyle 44 { 45 UnixStyle, 46 WindowsStyle, 47 Unknown 48 } 49 #endregion 50 public class NewFtp 51 { 52 #region 属性信息 53 /// <summary> 54 /// FTP请求对象 55 /// </summary> 56 FtpWebRequest Request = null; 57 /// <summary> 58 /// FTP响应对象 59 /// </summary> 60 FtpWebResponse Response = null; 61 /// <summary> 62 /// FTP服务器地址 63 /// </summary> 64 private Uri _Uri; 65 /// <summary> 66 /// FTP服务器地址 67 /// </summary> 68 public Uri Uri 69 { 70 get 71 { 72 if( _DirectoryPath == "/" ) 73 { 74 return _Uri; 75 } 76 else 77 { 78 string strUri = _Uri.ToString(); 79 if( strUri.EndsWith( "/" ) ) 80 { 81 strUri = strUri.Substring( 0, strUri.Length - 1 ); 82 } 83 return new Uri( strUri + this.DirectoryPath ); 84 } 85 } 86 set 87 { 88 if( value.Scheme != Uri.UriSchemeFtp ) 89 { 90 throw new Exception( "Ftp 地址格式错误!" ); 91 } 92 _Uri = new Uri( value.GetLeftPart( UriPartial.Authority ) ); 93 _DirectoryPath = value.AbsolutePath; 94 if( !_DirectoryPath.EndsWith( "/" ) ) 95 { 96 _DirectoryPath += "/"; 97 } 98 } 99 } 100 101 /// <summary> 102 /// 当前工作目录 103 /// </summary> 104 private string _DirectoryPath; 105 /// <summary> 106 /// 当前工作目录 107 /// </summary> 108 public string DirectoryPath 109 { 110 get 111 { 112 return _DirectoryPath; 113 } 114 set 115 { 116 _DirectoryPath = value; 117 } 118 } 119 120 /// <summary> 121 /// FTP登录用户 122 /// </summary> 123 private string _UserName; 124 /// <summary> 125 /// FTP登录用户 126 /// </summary> 127 public string UserName 128 { 129 get 130 { 131 return _UserName; 132 } 133 set 134 { 135 _UserName = value; 136 } 137 } 138 139 /// <summary> 140 /// 错误信息 141 /// </summary> 142 private string _ErrorMsg; 143 /// <summary> 144 /// 错误信息 145 /// </summary> 146 public string ErrorMsg 147 { 148 get 149 { 150 return _ErrorMsg; 151 } 152 set 153 { 154 _ErrorMsg = value; 155 } 156 } 157 158 /// <summary> 159 /// FTP登录密码 160 /// </summary> 161 private string _Password; 162 /// <summary> 163 /// FTP登录密码 164 /// </summary> 165 public string Password 166 { 167 get 168 { 169 return _Password; 170 } 171 set 172 { 173 _Password = value; 174 } 175 } 176 177 /// <summary> 178 /// 连接FTP服务器的代理服务 179 /// </summary> 180 private WebProxy _Proxy = null; 181 182 /// <summary> 183 /// 连接FTP服务器的代理服务 184 /// </summary> 185 public WebProxy Proxy 186 { 187 get 188 { 189 return _Proxy; 190 } 191 set 192 { 193 _Proxy = value; 194 } 195 } 196 197 /// <summary> 198 /// 是否需要删除临时文件 199 /// </summary> 200 private bool _isDeleteTempFile = false; 201 /// <summary> 202 /// 异步上传所临时生成的文件 203 /// </summary> 204 private string _UploadTempFile = ""; 205 #endregion 206 #region 事件 207 public delegate void De_DownloadProgressChanged( object sender, DownloadProgressChangedEventArgs e ); 208 209 public delegate void De_DownloadDataCompleted( object sender, System.ComponentModel.AsyncCompletedEventArgs e ); 210 211 public delegate void De_UploadProgressChanged( object sender, UploadProgressChangedEventArgs e ); 212 213 public delegate void De_UploadFileCompleted( object sender, UploadFileCompletedEventArgs e ); 214 215 /// <summary> 216 /// 异步下载进度发生改变触发的事件 217 /// </summary> 218 public event De_DownloadProgressChanged DownloadProgressChanged; 219 /// <summary> 220 /// 异步下载文件完成之后触发的事件 221 /// </summary> 222 public event De_DownloadDataCompleted DownloadDataCompleted; 223 224 /// <summary> 225 /// 异步上传进度发生改变触发的事件 226 /// </summary> 227 public event De_UploadProgressChanged UploadProgressChanged; 228 229 /// <summary> 230 /// 异步上传文件完成之后触发的事件 231 /// </summary> 232 public event De_UploadFileCompleted UploadFileCompleted; 233 #endregion 234 235 #region 构造析构函数 236 237 /// <summary> 238 /// 构造函数 239 /// </summary> 240 /// <param name="FtpUri">FTP地址</param> 241 /// <param name="strUserName">登录用户名</param> 242 /// <param name="strPassword">登录密码</param> 243 public NewFtp( Uri FtpUri, string strUserName, string strPassword ) 244 { 245 this._Uri = new Uri( FtpUri.GetLeftPart( UriPartial.Authority ) ); 246 247 _DirectoryPath = FtpUri.AbsolutePath; 248 249 if( !_DirectoryPath.EndsWith( "/" ) ) 250 { 251 _DirectoryPath += "/"; 252 } 253 this._UserName = strUserName; 254 this._Password = strPassword; 255 this._Proxy = null; 256 } 257 258 /// <summary> 259 /// 构造函数 260 /// </summary> 261 /// <param name="FtpUri">FTP地址</param> 262 /// <param name="strUserName">登录用户名</param> 263 /// <param name="strPassword">登录密码</param> 264 /// <param name="objProxy">连接代理</param> 265 public NewFtp( Uri FtpUri, string strUserName, string strPassword, WebProxy objProxy ) 266 { 267 this._Uri = new Uri( FtpUri.GetLeftPart( UriPartial.Authority ) ); 268 269 _DirectoryPath = FtpUri.AbsolutePath; 270 271 if( !_DirectoryPath.EndsWith( "/" ) ) 272 273 { 274 275 _DirectoryPath += "/"; 276 277 } 278 279 this._UserName = strUserName; 280 this._Password = strPassword; 281 this._Proxy = objProxy; 282 283 } 284 285 /// <summary> 286 /// 构造函数 287 /// </summary> 288 public NewFtp() 289 { 290 this._UserName = "anonymous"; //匿名用户 291 292 this._Password = "@anonymous"; 293 294 this._Uri = null; 295 296 this._Proxy = null; 297 298 } 299 300 301 /// <summary> 302 /// 析构函数 303 /// </summary> 304 ~NewFtp() 305 { 306 if( Response != null ) 307 { 308 309 Response.Close(); 310 311 Response = null; 312 313 } 314 315 if( Request != null ) 316 { 317 318 Request.Abort(); 319 320 Request = null; 321 322 } 323 } 324 #endregion 325 326 #region 建立连接 327 328 /// <summary> 329 /// 建立FTP链接,返回响应对象 330 /// </summary> 331 /// <param name="uri">FTP地址</param> 332 /// <param name="FtpMathod">操作命令</param> 333 private FtpWebResponse Open( Uri uri, string FtpMathod ) 334 { 335 try 336 { 337 Request = ( FtpWebRequest ) WebRequest.Create( uri ); 338 339 Request.Method = FtpMathod; 340 Request.UseBinary = true; 341 342 Request.Credentials = new NetworkCredential( this.UserName, this.Password ); 343 344 if( this.Proxy != null ) 345 346 { 347 348 Request.Proxy = this.Proxy; 349 350 } 351 352 return ( FtpWebResponse ) Request.GetResponse(); 353 354 } 355 356 catch( Exception ep ) 357 358 { 359 360 ErrorMsg = ep.ToString(); 361 362 throw ep; 363 364 } 365 366 } 367 368 /// <summary> 369 /// 建立FTP链接,返回请求对象 370 /// </summary> 371 /// <param name="uri">FTP地址</param> 372 /// <param name="FtpMathod">操作命令</param> 373 private FtpWebRequest OpenRequest( Uri uri, string FtpMathod ) 374 { 375 try 376 377 { 378 379 Request = ( FtpWebRequest ) WebRequest.Create( uri ); 380 381 Request.Method = FtpMathod; 382 383 Request.UseBinary = true; 384 385 Request.Credentials = new NetworkCredential( this.UserName, this.Password ); 386 387 if( this.Proxy != null ) 388 389 { 390 391 Request.Proxy = this.Proxy; 392 393 } 394 395 return Request; 396 397 } 398 399 catch( Exception ep ) 400 401 { 402 403 ErrorMsg = ep.ToString(); 404 405 throw ep; 406 407 } 408 409 } 410 411 #endregion 412 413 #region 下载文件 414 415 /// <summary> 416 /// 从FTP服务器下载文件,使用与远程文件同名的文件名来保存文件 417 /// </summary> 418 /// <param name="RemoteFileName">远程文件名</param> 419 /// <param name="LocalPath">本地路径</param> 420 421 public bool DownloadFile( string RemoteFileName, string LocalPath ) 422 { 423 return DownloadFile( RemoteFileName, LocalPath, RemoteFileName ); 424 } 425 426 /// <summary> 427 /// 从FTP服务器下载文件,指定本地路径和本地文件名 428 /// </summary> 429 /// <param name="RemoteFileName">远程文件名</param> 430 /// <param name="LocalPath">本地路径</param> 431 /// <param name="LocalFilePath">保存文件的本地路径,后面带有""</param> 432 /// <param name="LocalFileName">保存本地的文件名</param> 433 434 public bool DownloadFile( string RemoteFileName, string LocalPath, string LocalFileName ) 435 { 436 byte[] bt = null; 437 try 438 { 439 440 if( !IsValidFileChars( RemoteFileName ) || !IsValidFileChars( LocalFileName ) || !IsValidPathChars( LocalPath ) ) 441 442 { 443 444 throw new Exception( "非法文件名或目录名!" ); 445 } 446 447 if( !Directory.Exists( LocalPath ) ) 448 449 { 450 451 throw new Exception( "本地文件路径不存在!" ); 452 453 } 454 455 string LocalFullPath = Path.Combine( LocalPath, LocalFileName ); 456 if( File.Exists( LocalFullPath ) ) 457 458 { 459 throw new Exception( "当前路径下已经存在同名文件!" ); 460 461 } 462 463 bt = DownloadFile( RemoteFileName ); 464 465 if( bt != null ) 466 467 { 468 469 FileStream stream = new FileStream( LocalFullPath, FileMode.Create ); 470 471 stream.Write( bt, 0, bt.Length ); 472 473 stream.Flush(); 474 475 stream.Close(); 476 477 return true; 478 } 479 else 480 { 481 return false; 482 } 483 484 } 485 catch( Exception ep ) 486 { 487 ErrorMsg = ep.ToString(); 488 throw ep; 489 490 } 491 492 } 493 494 495 /// <summary> 496 /// 从FTP服务器下载文件,返回文件二进制数据 497 /// </summary> 498 /// <param name="RemoteFileName">远程文件名</param> 499 public byte[] DownloadFile( string RemoteFileName ) 500 { 501 try 502 { 503 504 if( !IsValidFileChars( RemoteFileName ) ) 505 506 { 507 508 throw new Exception( "非法文件名或目录名!" ); 509 } 510 511 Response = Open( new Uri( this.Uri.ToString() + RemoteFileName ), WebRequestMethods.Ftp.DownloadFile ); 512 513 Stream Reader = Response.GetResponseStream(); 514 MemoryStream mem = new MemoryStream( 1024 * 500 ); 515 516 byte[] buffer = new byte[ 1024 ]; 517 518 int bytesRead = 0; 519 520 int TotalByteRead = 0; 521 522 while( true ) 523 524 { 525 526 bytesRead = Reader.Read( buffer, 0, buffer.Length ); 527 528 TotalByteRead += bytesRead; 529 530 if( bytesRead == 0 ) 531 532 break; 533 534 mem.Write( buffer, 0, bytesRead ); 535 536 } 537 538 if( mem.Length > 0 ) 539 540 { 541 542 return mem.ToArray(); 543 544 } 545 546 else 547 548 { 549 550 return null; 551 552 } 553 554 } 555 556 catch( Exception ep ) 557 558 { 559 560 ErrorMsg = ep.ToString(); 561 562 throw ep; 563 564 } 565 566 } 567 568 #endregion 569 570 #region 异步下载文件 571 572 /// <summary> 573 /// 从FTP服务器异步下载文件,指定本地路径和本地文件名 574 /// </summary> 575 /// <param name="RemoteFileName">远程文件名</param> 576 /// <param name="LocalPath">保存文件的本地路径,后面带有""</param> 577 /// <param name="LocalFileName">保存本地的文件名</param> 578 public void DownloadFileAsync( string RemoteFileName, string LocalPath, string LocalFileName ) 579 { 580 byte[] bt = null; 581 582 try 583 584 { 585 586 if( !IsValidFileChars( RemoteFileName ) || !IsValidFileChars( LocalFileName ) || !IsValidPathChars( LocalPath ) ) 587 588 { 589 590 throw new Exception( "非法文件名或目录名!" ); 591 592 } 593 594 if( !Directory.Exists( LocalPath ) ) 595 596 { 597 598 throw new Exception( "本地文件路径不存在!" ); 599 600 } 601 602 603 604 string LocalFullPath = Path.Combine( LocalPath, LocalFileName ); 605 606 if( File.Exists( LocalFullPath ) ) 607 608 { 609 610 throw new Exception( "当前路径下已经存在同名文件!" ); 611 612 } 613 DownloadFileAsync( RemoteFileName, LocalFullPath ); 614 615 } 616 catch( Exception ep ) 617 { 618 619 ErrorMsg = ep.ToString(); 620 621 throw ep; 622 623 } 624 625 } 626 627 628 /// <summary> 629 /// 从FTP服务器异步下载文件,指定本地完整路径文件名 630 /// </summary> 631 /// <param name="RemoteFileName">远程文件名</param> 632 /// <param name="LocalFullPath">本地完整路径文件名</param> 633 public void DownloadFileAsync( string RemoteFileName, string LocalFullPath ) 634 { 635 try 636 { 637 if( !IsValidFileChars( RemoteFileName ) ) 638 639 { 640 641 throw new Exception( "非法文件名或目录名!" ); 642 643 } 644 645 if( File.Exists( LocalFullPath ) ) 646 647 { 648 649 throw new Exception( "当前路径下已经存在同名文件!" ); 650 651 } 652 653 MyWebClient client = new MyWebClient(); 654 655 656 657 client.DownloadProgressChanged += new DownloadProgressChangedEventHandler( client_DownloadProgressChanged ); 658 659 client.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler( client_DownloadFileCompleted ); 660 661 client.Credentials = new NetworkCredential( this.UserName, this.Password ); 662 663 if( this.Proxy != null ) 664 665 { 666 667 client.Proxy = this.Proxy; 668 669 } 670 671 client.DownloadFileAsync( new Uri( this.Uri.ToString() + RemoteFileName ), LocalFullPath ); 672 673 } 674 675 catch( Exception ep ) 676 677 { 678 ErrorMsg = ep.ToString(); 679 throw ep; 680 681 } 682 683 } 684 685 686 687 /// <summary> 688 /// 异步下载文件完成之后触发的事件 689 /// </summary> 690 /// <param name="sender">下载对象</param> 691 /// <param name="e">数据信息对象</param> 692 void client_DownloadFileCompleted( object sender, System.ComponentModel.AsyncCompletedEventArgs e ) 693 { 694 if( DownloadDataCompleted != null ) 695 { 696 697 DownloadDataCompleted( sender, e ); 698 699 } 700 701 } 702 703 704 705 /// <summary> 706 /// 异步下载进度发生改变触发的事件 707 /// </summary> 708 /// <param name="sender">下载对象</param> 709 /// <param name="e">进度信息对象</param> 710 void client_DownloadProgressChanged( object sender, DownloadProgressChangedEventArgs e ) 711 { 712 713 if( DownloadProgressChanged != null ) 714 715 { 716 717 DownloadProgressChanged( sender, e ); 718 719 } 720 721 } 722 723 #endregion 724 725 #region 上传文件 726 727 /// <summary> 728 /// 上传文件到FTP服务器 729 /// </summary> 730 /// <param name="LocalFullPath">本地带有完整路径的文件名</param> 731 public bool UploadFile( string LocalFullPath ) 732 733 { 734 735 return UploadFile( LocalFullPath, Path.GetFileName( LocalFullPath ), false ); 736 737 } 738 739 /// <summary> 740 /// 上传文件到FTP服务器 741 /// </summary> 742 /// <param name="LocalFullPath">本地带有完整路径的文件</param> 743 /// <param name="OverWriteRemoteFile">是否覆盖远程服务器上面同名的文件</param> 744 public bool UploadFile( string LocalFullPath, bool OverWriteRemoteFile ) 745 746 { 747 748 return UploadFile( LocalFullPath, Path.GetFileName( LocalFullPath ), OverWriteRemoteFile ); 749 750 } 751 752 /// <summary> 753 /// 上传文件到FTP服务器 754 /// </summary> 755 /// <param name="LocalFullPath">本地带有完整路径的文件</param> 756 /// <param name="RemoteFileName">要在FTP服务器上面保存文件名</param> 757 public bool UploadFile( string LocalFullPath, string RemoteFileName ) 758 { 759 760 return UploadFile( LocalFullPath, RemoteFileName, false ); 761 762 } 763 764 /// <summary> 765 /// 上传文件到FTP服务器 766 /// </summary> 767 /// <param name="LocalFullPath">本地带有完整路径的文件名</param> 768 /// <param name="RemoteFileName">要在FTP服务器上面保存文件名</param> 769 /// <param name="OverWriteRemoteFile">是否覆盖远程服务器上面同名的文件</param> 770 771 public bool UploadFile( string LocalFullPath, string RemoteFileName, bool OverWriteRemoteFile ) 772 773 { 774 try 775 { 776 if( !IsValidFileChars( RemoteFileName ) || !IsValidFileChars( Path.GetFileName( LocalFullPath ) ) || !IsValidPathChars( Path.GetDirectoryName( LocalFullPath ) ) ) 777 778 { 779 780 throw new Exception( "非法文件名或目录名!" ); 781 782 } 783 784 if( File.Exists( LocalFullPath ) ) 785 786 { 787 788 FileStream Stream = new FileStream( LocalFullPath, FileMode.Open, FileAccess.Read ); 789 790 byte[] bt = new byte[ Stream.Length ]; 791 792 Stream.Read( bt, 0, ( Int32 ) Stream.Length ); //注意,因为Int32的最大限制,最大上传文件只能是大约2G多一点 793 794 Stream.Close(); 795 796 return UploadFile( bt, RemoteFileName, OverWriteRemoteFile ); 797 798 } 799 else 800 { 801 throw new Exception( "本地文件不存在!" ); 802 } 803 } 804 catch( Exception ep ) 805 { 806 807 ErrorMsg = ep.ToString(); 808 809 throw ep; 810 811 } 812 813 } 814 815 /// <summary> 816 /// 上传文件到FTP服务器 817 /// </summary> 818 /// <param name="FileBytes">上传的二进制数据</param> 819 /// <param name="RemoteFileName">要在FTP服务器上面保存文件名</param> 820 public bool UploadFile( byte[] FileBytes, string RemoteFileName ) 821 { 822 if( !IsValidFileChars( RemoteFileName ) ) 823 { 824 throw new Exception( "非法文件名或目录名!" ); 825 } 826 reurn UploadFile( FileBytes, RemoteFileName, false ); 827 } 828 829 /// <summary> 830 /// 上传文件到FTP服务器 831 /// </summary> 832 /// <param name="FileBytes">文件二进制内容</param> 833 /// <param name="RemoteFileName">要在FTP服务器上面保存文件名</param> 834 /// <param name="OverWriteRemoteFile">是否覆盖远程服务器上面同名的文件</param> 835 public bool UploadFile( byte[] FileBytes, string RemoteFileName, bool OverWriteRemoteFile ) 836 { 837 try 838 { 839 if( !IsValidFileChars( RemoteFileName ) ) 840 { 841 throw new Exception( "非法文件名!" ); 842 } 843 if( !OverWriteRemoteFile && FileExist( RemoteFileName ) ) 844 845 { 846 throw new Exception( "FTP服务上面已经存在同名文件!" ); 847 } 848 Response = Open( new Uri( this.Uri.ToString() + RemoteFileName ), WebRequestMethods.Ftp.UploadFile ); 849 Stream requestStream = Request.GetRequestStream(); 850 MemoryStream mem = new MemoryStream( FileBytes ); 851 852 byte[] buffer = new byte[ 1024 ]; 853 int bytesRead = 0; 854 int TotalRead = 0; 855 while( true ) 856 { 857 bytesRead = mem.Read( buffer, 0, buffer.Length ); 858 859 if( bytesRead == 0 ) 860 861 break; 862 863 TotalRead += bytesRead; 864 865 requestStream.Write( buffer, 0, bytesRead ); 866 867 } 868 869 requestStream.Close(); 870 871 Response = ( FtpWebResponse ) Request.GetResponse(); 872 873 mem.Close(); 874 875 mem.Dispose(); 876 877 FileBytes = null; 878 879 return true; 880 881 } 882 883 catch( Exception ep ) 884 885 { 886 887 ErrorMsg = ep.ToString(); 888 889 throw ep; 890 891 } 892 893 } 894 895 #endregion 896 897 #region 异步上传文件 898 /// <summary> 899 /// 异步上传文件到FTP服务器 900 /// </summary> 901 /// <param name="LocalFullPath">本地带有完整路径的文件名</param> 902 public void UploadFileAsync( string LocalFullPath ) 903 { 904 UploadFileAsync( LocalFullPath, Path.GetFileName( LocalFullPath ), false ); 905 906 } 907 908 /// <summary> 909 /// 异步上传文件到FTP服务器 910 /// </summary> 911 /// <param name="LocalFullPath">本地带有完整路径的文件</param> 912 /// <param name="OverWriteRemoteFile">是否覆盖远程服务器上面同名的文件</param> 913 public void UploadFileAsync( string LocalFullPath, bool OverWriteRemoteFile ) 914 { 915 UploadFileAsync( LocalFullPath, Path.GetFileName( LocalFullPath ), OverWriteRemoteFile ); 916 } 917 /// <summary> 918 /// 异步上传文件到FTP服务器 919 /// </summary> 920 /// <param name="LocalFullPath">本地带有完整路径的文件</param> 921 /// <param name="RemoteFileName">要在FTP服务器上面保存文件名</param> 922 public void UploadFileAsync( string LocalFullPath, string RemoteFileName ) 923 { 924 UploadFileAsync( LocalFullPath, RemoteFileName, false ); 925 } 926 /// <summary> 927 /// 异步上传文件到FTP服务器 928 /// </summary> 929 /// <param name="LocalFullPath">本地带有完整路径的文件名</param> 930 /// <param name="RemoteFileName">要在FTP服务器上面保存文件名</param> 931 /// <param name="OverWriteRemoteFile">是否覆盖远程服务器上面同名的文件</param> 932 public void UploadFileAsync( string LocalFullPath, string RemoteFileName, bool OverWriteRemoteFile ) 933 { 934 try 935 { 936 if( !IsValidFileChars( RemoteFileName ) || !IsValidFileChars( Path.GetFileName( LocalFullPath ) ) || !IsValidPathChars( Path.GetDirectoryName( LocalFullPath ) ) ) 937 { 938 throw new Exception( "非法文件名或目录名!" ); 939 } 940 if( !OverWriteRemoteFile && FileExist( RemoteFileName ) ) 941 { 942 throw new Exception( "FTP服务上面已经存在同名文件!" ); 943 } 944 if( File.Exists( LocalFullPath ) ) 945 { 946 MyWebClient client = new MyWebClient(); 947 948 client.UploadProgressChanged += new UploadProgressChangedEventHandler( client_UploadProgressChanged ); 949 client.UploadFileCompleted += new UploadFileCompletedEventHandler( client_UploadFileCompleted ); 950 client.Credentials = new NetworkCredential( this.UserName, this.Password ); 951 if( this.Proxy != null ) 952 { 953 client.Proxy = this.Proxy; 954 } 955 client.UploadFileAsync( new Uri( this.Uri.ToString() + RemoteFileName ), LocalFullPath ); 956 957 } 958 else 959 { 960 throw new Exception( "本地文件不存在!" ); 961 } 962 } 963 catch( Exception ep ) 964 { 965 ErrorMsg = ep.ToString(); 966 throw ep; 967 } 968 } 969 /// <summary> 970 /// 异步上传文件到FTP服务器 971 /// </summary> 972 /// <param name="FileBytes">上传的二进制数据</param> 973 /// <param name="RemoteFileName">要在FTP服务器上面保存文件名</param> 974 public void UploadFileAsync( byte[] FileBytes, string RemoteFileName ) 975 { 976 if( !IsValidFileChars( RemoteFileName ) ) 977 { 978 throw new Exception( "非法文件名或目录名!" ); 979 } 980 UploadFileAsync( FileBytes, RemoteFileName, false ); 981 } 982 /// <summary> 983 /// 异步上传文件到FTP服务器 984 /// </summary> 985 /// <param name="FileBytes">文件二进制内容</param> 986 /// <param name="RemoteFileName">要在FTP服务器上面保存文件名</param> 987 /// <param name="OverWriteRemoteFile">是否覆盖远程服务器上面同名的文件</param> 988 public void UploadFileAsync( byte[] FileBytes, string RemoteFileName, bool OverWriteRemoteFile ) 989 { 990 try 991 { 992 993 if( !IsValidFileChars( RemoteFileName ) ) 994 { 995 throw new Exception( "非法文件名!" ); 996 } 997 if( !OverWriteRemoteFile && FileExist( RemoteFileName ) ) 998 { 999 throw new Exception( "FTP服务上面已经存在同名文件!" ); 1000 } 1001 string TempPath = System.Environment.GetFolderPath( Environment.SpecialFolder.Templates ); 1002 if( !TempPath.EndsWith( "/" ) ) 1003 { 1004 TempPath += "/"; 1005 } 1006 string TempFile = TempPath + Path.GetRandomFileName(); 1007 TempFile = Path.ChangeExtension( TempFile, Path.GetExtension( RemoteFileName ) ); 1008 FileStream Stream = new FileStream( TempFile, FileMode.CreateNew, FileAccess.Write ); 1009 Stream.Write( FileBytes, 0, FileBytes.Length ); //注意,因为Int32的最大限制,最大上传文件只能是大约2G多一点 1010 Stream.Flush(); 1011 Stream.Close(); 1012 Stream.Dispose(); 1013 _isDeleteTempFile = true; 1014 _UploadTempFile = TempFile; 1015 FileBytes = null; 1016 UploadFileAsync( TempFile, RemoteFileName, OverWriteRemoteFile ); 1017 1018 1019 1020 } 1021 catch( Exception ep ) 1022 { 1023 ErrorMsg = ep.ToString(); 1024 throw ep; 1025 } 1026 } 1027 1028 /// <summary> 1029 /// 异步上传文件完成之后触发的事件 1030 /// </summary> 1031 /// <param name="sender">下载对象</param> 1032 /// <param name="e">数据信息对象</param> 1033 void client_UploadFileCompleted( object sender, UploadFileCompletedEventArgs e ) 1034 { 1035 if( _isDeleteTempFile ) 1036 { 1037 if( File.Exists( _UploadTempFile ) ) 1038 { 1039 File.SetAttributes( _UploadTempFile, FileAttributes.Normal ); 1040 File.Delete( _UploadTempFile ); 1041 } 1042 _isDeleteTempFile = false; 1043 } 1044 if( UploadFileCompleted != null ) 1045 { 1046 UploadFileCompleted( sender, e ); 1047 } 1048 } 1049 1050 /// <summary> 1051 /// 异步上传进度发生改变触发的事件 1052 /// </summary> 1053 /// <param name="sender">下载对象</param> 1054 /// <param name="e">进度信息对象</param> 1055 void client_UploadProgressChanged( object sender, UploadProgressChangedEventArgs e ) 1056 { 1057 if( UploadProgressChanged != null ) 1058 { 1059 UploadProgressChanged( sender, e ); 1060 } 1061 } 1062 #endregion 1063 #region 列出目录文件信息 1064 /// <summary> 1065 /// 列出FTP服务器上面当前目录的所有文件和目录 1066 /// </summary> 1067 public FileStruct[] ListFilesAndDirectories() 1068 { 1069 Response = Open( this.Uri, WebRequestMethods.Ftp.ListDirectoryDetails ); 1070 StreamReader stream = new StreamReader( Response.GetResponseStream(), Encoding.Default ); 1071 string Datastring = stream.ReadToEnd(); 1072 FileStruct[] list = GetList( Datastring ); 1073 return list; 1074 } 1075 /// <summary> 1076 /// 列出FTP服务器上面当前目录的所有文件 1077 /// </summary> 1078 public FileStruct[] ListFiles() 1079 { 1080 FileStruct[] listAll = ListFilesAndDirectories(); 1081 List<FileStruct> listFile = new List<FileStruct>(); 1082 foreach( FileStruct file in listAll ) 1083 { 1084 if( !file.IsDirectory ) 1085 { 1086 listFile.Add( file ); 1087 } 1088 } 1089 return listFile.ToArray(); 1090 } 1091 1092 /// <summary> 1093 /// 列出FTP服务器上面当前目录的所有的目录 1094 /// </summary> 1095 public FileStruct[] ListDirectories() 1096 { 1097 FileStruct[] listAll = ListFilesAndDirectories(); 1098 List<FileStruct> listDirectory = new List<FileStruct>(); 1099 foreach( FileStruct file in listAll ) 1100 { 1101 if( file.IsDirectory ) 1102 { 1103 listDirectory.Add( file ); 1104 } 1105 } 1106 return listDirectory.ToArray(); 1107 } 1108 /// <summary> 1109 /// 获得文件和目录列表 1110 /// </summary> 1111 /// <param name="datastring">FTP返回的列表字符信息</param> 1112 private FileStruct[] GetList( string datastring ) 1113 { 1114 List<FileStruct> myListArray = new List<FileStruct>(); 1115 string[] dataRecords = datastring.Split( ' ' ); 1116 FileListStyle _directoryListStyle = GuessFileListStyle( dataRecords ); 1117 foreach( string s in dataRecords ) 1118 { 1119 if( _directoryListStyle != FileListStyle.Unknown && s != "" ) 1120 { 1121 FileStruct f = new FileStruct(); 1122 f.Name = ".."; 1123 switch( _directoryListStyle ) 1124 { 1125 case FileListStyle.UnixStyle: 1126 f = ParseFileStructFromUnixStyleRecord( s ); 1127 break; 1128 case FileListStyle.WindowsStyle: 1129 f = ParseFileStructFromWindowsStyleRecord( s ); 1130 break; 1131 } 1132 if( !( f.Name == "." || f.Name == ".." ) ) 1133 { 1134 myListArray.Add( f ); 1135 } 1136 } 1137 } 1138 return myListArray.ToArray(); 1139 } 1140 1141 /// <summary> 1142 /// 从Windows格式中返回文件信息 1143 /// </summary> 1144 /// <param name="Record">文件信息</param> 1145 private FileStruct ParseFileStructFromWindowsStyleRecord( string Record ) 1146 { 1147 FileStruct f = new FileStruct(); 1148 string processstr = Record.Trim(); 1149 string dateStr = processstr.Substring( 0, 8 ); 1150 processstr = ( processstr.Substring( 8, processstr.Length - 8 ) ).Trim(); 1151 string timeStr = processstr.Substring( 0, 7 ); 1152 processstr = ( processstr.Substring( 7, processstr.Length - 7 ) ).Trim(); 1153 DateTimeFormatInfo myDTFI = new CultureInfo( "en-US", false ).DateTimeFormat; 1154 myDTFI.ShortTimePattern = "t"; 1155 f.CreateTime = DateTime.Parse( dateStr + " " + timeStr, myDTFI ); 1156 if( processstr.Substring( 0, 5 ) == "<DIR>" ) 1157 { 1158 f.IsDirectory = true; 1159 processstr = ( processstr.Substring( 5, processstr.Length - 5 ) ).Trim(); 1160 } 1161 else 1162 { 1163 string[] strs = processstr.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries ); // true); 1164 processstr = strs[ 1 ]; 1165 f.IsDirectory = false; 1166 } 1167 f.Name = processstr; 1168 return f; 1169 } 1170 1171 1172 /// <summary> 1173 /// 判断文件列表的方式Window方式还是Unix方式 1174 /// </summary> 1175 /// <param name="recordList">文件信息列表</param> 1176 private FileListStyle GuessFileListStyle( string[] recordList ) 1177 { 1178 foreach( string s in recordList ) 1179 { 1180 if( s.Length > 10 1181 && Regex.IsMatch( s.Substring( 0, 10 ), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)" ) ) 1182 { 1183 return FileListStyle.UnixStyle; 1184 } 1185 else if( s.Length > 8 1186 && Regex.IsMatch( s.Substring( 0, 8 ), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]" ) ) 1187 { 1188 return FileListStyle.WindowsStyle; 1189 } 1190 } 1191 return FileListStyle.Unknown; 1192 } 1193 1194 /// <summary> 1195 /// 从Unix格式中返回文件信息 1196 /// </summary> 1197 /// <param name="Record">文件信息</param> 1198 private FileStruct ParseFileStructFromUnixStyleRecord( string Record ) 1199 { 1200 FileStruct f = new FileStruct(); 1201 string processstr = Record.Trim(); 1202 f.Flags = processstr.Substring( 0, 10 ); 1203 f.IsDirectory = ( f.Flags[ 0 ] == 'd' ); 1204 processstr = ( processstr.Substring( 11 ) ).Trim(); 1205 _cutSubstringFromStringWithTrim( ref processstr, ' ', 0 ); //跳过一部分 1206 f.Owner = _cutSubstringFromStringWithTrim( ref processstr, ' ', 0 ); 1207 f.Group = _cutSubstringFromStringWithTrim( ref processstr, ' ', 0 ); 1208 _cutSubstringFromStringWithTrim( ref processstr, ' ', 0 ); //跳过一部分 1209 string yearOrTime = processstr.Split( new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries )[ 2 ]; 1210 if( yearOrTime.IndexOf( ":" ) >= 0 ) //time 1211 { 1212 processstr = processstr.Replace( yearOrTime, DateTime.Now.Year.ToString() ); 1213 } 1214 f.CreateTime = DateTime.Parse( _cutSubstringFromStringWithTrim( ref processstr, ' ', 8 ) ); 1215 f.Name = processstr; //最后就是名称 1216 1217 return f; 1218 1219 } 1220 1221 /// <summary> 1222 /// 按照一定的规则进行字符串截取 1223 /// </summary> 1224 /// <param name="s">截取的字符串</param> 1225 /// <param name="c">查找的字符</param> 1226 /// <param name="startIndex">查找的位置</param> 1227 private string _cutSubstringFromStringWithTrim( ref string s, char c, int startIndex ) 1228 { 1229 int pos1 = s.IndexOf( c, startIndex ); 1230 1231 string retString = s.Substring( 0, pos1 ); 1232 1233 s = ( s.Substring( pos1 ) ).Trim(); 1234 1235 return retString; 1236 1237 } 1238 #endregion 1239 1240 #region 目录或文件存在的判断 1241 /// <summary> 1242 /// 判断当前目录下指定的子目录是否存在 1243 /// </summary> 1244 /// <param name="RemoteDirectoryName">指定的目录名</param> 1245 public bool DirectoryExist( string RemoteDirectoryName ) 1246 { 1247 try 1248 { 1249 1250 if( !IsValidPathChars( RemoteDirectoryName ) ) 1251 1252 { 1253 1254 throw new Exception( "目录名非法!" ); 1255 1256 } 1257 1258 FileStruct[] listDir = ListDirectories(); 1259 1260 foreach( FileStruct dir in listDir ) 1261 1262 { 1263 1264 if( dir.Name == RemoteDirectoryName ) 1265 1266 { 1267 1268 return true; 1269 1270 } 1271 1272 } 1273 1274 return false; 1275 1276 } 1277 1278 catch( Exception ep ) 1279 1280 { 1281 1282 ErrorMsg = ep.ToString(); 1283 1284 throw ep; 1285 1286 } 1287 1288 } 1289 1290 /// <summary> 1291 /// 判断一个远程文件是否存在服务器当前目录下面 1292 /// </summary> 1293 /// <param name="RemoteFileName">远程文件名</param> 1294 public bool FileExist( string RemoteFileName ) 1295 { 1296 try 1297 1298 { 1299 1300 if( !IsValidFileChars( RemoteFileName ) ) 1301 1302 { 1303 1304 throw new Exception( "文件名非法!" ); 1305 1306 } 1307 1308 FileStruct[] listFile = ListFiles(); 1309 1310 foreach( FileStruct file in listFile ) 1311 1312 { 1313 1314 if( file.Name == RemoteFileName ) 1315 1316 { 1317 1318 return true; 1319 1320 } 1321 1322 } 1323 return false; 1324 } 1325 catch( Exception ep ) 1326 { 1327 ErrorMsg = ep.ToString(); 1328 throw ep; 1329 } 1330 } 1331 1332 #endregion 1333 1334 #region 删除文件 1335 1336 /// <summary> 1337 /// 从FTP服务器上面删除一个文件 1338 /// </summary> 1339 /// <param name="RemoteFileName">远程文件名</param> 1340 public void DeleteFile( string RemoteFileName ) 1341 { 1342 try 1343 { 1344 if( !IsValidFileChars( RemoteFileName ) ) 1345 { 1346 throw new Exception( "文件名非法!" ); 1347 } 1348 Response = Open( new Uri( this.Uri.ToString() + RemoteFileName ), WebRequestMethods.Ftp.DeleteFile ); 1349 } 1350 catch( Exception ep ) 1351 { 1352 ErrorMsg = ep.ToString(); 1353 throw ep; 1354 } 1355 } 1356 #endregion 1357 #region 重命名文件 1358 /// <summary> 1359 /// 更改一个文件的名称或一个目录的名称 1360 /// </summary> 1361 /// <param name="RemoteFileName">原始文件或目录名称</param> 1362 /// <param name="NewFileName">新的文件或目录的名称</param> 1363 public bool ReName( string RemoteFileName, string NewFileName ) 1364 { 1365 try 1366 { 1367 if( !IsValidFileChars( RemoteFileName ) || !IsValidFileChars( NewFileName ) ) 1368 { 1369 throw new Exception( "文件名非法!" ); 1370 } 1371 if( RemoteFileName == NewFileName ) 1372 { 1373 return true; 1374 } 1375 if( FileExist( RemoteFileName ) ) 1376 { 1377 Request = OpenRequest( new Uri( this.Uri.ToString() + RemoteFileName ), WebRequestMethods.Ftp.Rename ); 1378 Request.RenameTo = NewFileName; 1379 Response = ( FtpWebResponse ) Request.GetResponse(); 1380 1381 } 1382 else 1383 { 1384 throw new Exception( "文件在服务器上不存在!" ); 1385 } 1386 return true; 1387 } 1388 catch( Exception ep ) 1389 { 1390 ErrorMsg = ep.ToString(); 1391 throw ep; 1392 } 1393 } 1394 #endregion 1395 #region 拷贝、移动文件 1396 /// <summary> 1397 /// 把当前目录下面的一个文件拷贝到服务器上面另外的目录中,注意,拷贝文件之后,当前工作目录还是文件原来所在的目录 1398 /// </summary> 1399 /// <param name="RemoteFile">当前目录下的文件名</param> 1400 /// <param name="DirectoryName">新目录名称。 1401 /// 说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ; 1402 /// 如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。如: ./NewDirectory/SubDirectory1/SubDirectory2 1403 /// </param> 1404 /// <returns></returns> 1405 public bool CopyFileToAnotherDirectory( string RemoteFile, string DirectoryName ) 1406 { 1407 string CurrentWorkDir = this.DirectoryPath; 1408 try 1409 { 1410 byte[] bt = DownloadFile( RemoteFile ); 1411 GotoDirectory( DirectoryName ); 1412 bool Success = UploadFile( bt, RemoteFile, false ); 1413 this.DirectoryPath = CurrentWorkDir; 1414 return Success; 1415 } 1416 catch( Exception ep ) 1417 { 1418 this.DirectoryPath = CurrentWorkDir; 1419 ErrorMsg = ep.ToString(); 1420 throw ep; 1421 } 1422 } 1423 /// <summary> 1424 /// 把当前目录下面的一个文件移动到服务器上面另外的目录中,注意,移动文件之后,当前工作目录还是文件原来所在的目录 1425 /// </summary> 1426 /// <param name="RemoteFile">当前目录下的文件名</param> 1427 /// <param name="DirectoryName">新目录名称。 1428 /// 说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ; 1429 /// 如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。如: ./NewDirectory/SubDirectory1/SubDirectory2 1430 /// </param> 1431 /// <returns></returns> 1432 public bool MoveFileToAnotherDirectory( string RemoteFile, string DirectoryName ) 1433 { 1434 string CurrentWorkDir = this.DirectoryPath; 1435 try 1436 { 1437 if( DirectoryName == "" ) 1438 return false; 1439 if( !DirectoryName.StartsWith( "/" ) ) 1440 DirectoryName = "/" + DirectoryName; 1441 if( !DirectoryName.EndsWith( "/" ) ) 1442 DirectoryName += "/"; 1443 bool Success = ReName( RemoteFile, DirectoryName + RemoteFile ); 1444 this.DirectoryPath = CurrentWorkDir; 1445 return Success; 1446 } 1447 catch( Exception ep ) 1448 { 1449 this.DirectoryPath = CurrentWorkDir; 1450 ErrorMsg = ep.ToString(); 1451 throw ep; 1452 } 1453 } 1454 #endregion 1455 #region 建立、删除子目录 1456 /// <summary> 1457 /// 在FTP服务器上当前工作目录建立一个子目录 1458 /// </summary> 1459 /// <param name="DirectoryName">子目录名称</param> 1460 public bool MakeDirectory( string DirectoryName ) 1461 { 1462 try 1463 { 1464 if( !IsValidPathChars( DirectoryName ) ) 1465 { 1466 throw new Exception( "目录名非法!" ); 1467 } 1468 if( DirectoryExist( DirectoryName ) ) 1469 { 1470 throw new Exception( "服务器上面已经存在同名的文件名或目录名!" ); 1471 } 1472 string a = this.Uri.ToString(); 1473 string b = DirectoryName; 1474 Response = Open( new Uri( this.Uri.ToString() + DirectoryName ), WebRequestMethods.Ftp.MakeDirectory ); 1475 return true; 1476 } 1477 catch( Exception ep ) 1478 { 1479 ErrorMsg = ep.ToString(); 1480 throw ep; 1481 } 1482 } 1483 /// <summary> 1484 /// 从当前工作目录中删除一个子目录 1485 /// </summary> 1486 /// <param name="DirectoryName">子目录名称</param> 1487 public bool RemoveDirectory( string DirectoryName ) 1488 { 1489 try 1490 { 1491 if( !IsValidPathChars( DirectoryName ) ) 1492 { 1493 throw new Exception( "目录名非法!" ); 1494 } 1495 if( !DirectoryExist( DirectoryName ) ) 1496 { 1497 throw new Exception( "服务器上面不存在指定的文件名或目录名!" ); 1498 } 1499 Response = Open( new Uri( this.Uri.ToString() + DirectoryName ), WebRequestMethods.Ftp.RemoveDirectory ); 1500 return true; 1501 } 1502 catch( Exception ep ) 1503 { 1504 ErrorMsg = ep.ToString(); 1505 throw ep; 1506 } 1507 } 1508 #endregion 1509 #region 文件、目录名称有效性判断 1510 /// <summary> 1511 /// 判断目录名中字符是否合法 1512 /// </summary> 1513 /// <param name="DirectoryName">目录名称</param> 1514 public bool IsValidPathChars( string DirectoryName ) 1515 { 1516 char[] invalidPathChars = Path.GetInvalidPathChars(); 1517 char[] DirChar = DirectoryName.ToCharArray(); 1518 foreach( char C in DirChar ) 1519 { 1520 if( Array.BinarySearch( invalidPathChars, C ) >= 0 ) 1521 { 1522 return false; 1523 } 1524 } 1525 return true; 1526 } 1527 /// <summary> 1528 /// 判断文件名中字符是否合法 1529 /// </summary> 1530 /// <param name="FileName">文件名称</param> 1531 public bool IsValidFileChars( string FileName ) 1532 { 1533 char[] invalidFileChars = Path.GetInvalidFileNameChars(); 1534 char[] NameChar = FileName.ToCharArray(); 1535 foreach( char C in NameChar ) 1536 { 1537 if( Array.BinarySearch( invalidFileChars, C ) >= 0 ) 1538 { 1539 return false; 1540 } 1541 } 1542 return true; 1543 } 1544 #endregion 1545 #region 目录切换操作 1546 /// <summary> 1547 /// 进入一个目录 1548 /// </summary> 1549 /// <param name="DirectoryName"> 1550 /// 新目录的名字。 1551 /// 说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ; 1552 /// 如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。如: ./NewDirectory/SubDirectory1/SubDirectory2 1553 /// </param> 1554 public bool GotoDirectory( string DirectoryName ) 1555 { 1556 string CurrentWorkPath = this.DirectoryPath; 1557 try 1558 { 1559 DirectoryName = DirectoryName.Replace( "/", "/" ); 1560 string[] DirectoryNames = DirectoryName.Split( new char[] { '/' } ); 1561 if( DirectoryNames[ 0 ] == "." ) 1562 { 1563 this.DirectoryPath = "/"; 1564 if( DirectoryNames.Length == 1 ) 1565 { 1566 return true; 1567 } 1568 Array.Clear( DirectoryNames, 0, 1 ); 1569 } 1570 bool Success = false; 1571 foreach( string dir in DirectoryNames ) 1572 1573 { 1574 1575 if( dir != null ) 1576 1577 { 1578 1579 Success = EnterOneSubDirectory( dir ); 1580 1581 if( !Success ) 1582 1583 { 1584 1585 this.DirectoryPath = CurrentWorkPath; 1586 1587 return false; 1588 1589 } 1590 1591 } 1592 1593 } 1594 1595 return Success; 1596 1597 1598 1599 } 1600 1601 catch( Exception ep ) 1602 { 1603 1604 this.DirectoryPath = CurrentWorkPath; 1605 1606 ErrorMsg = ep.ToString(); 1607 1608 throw ep; 1609 } 1610 1611 } 1612 1613 /// <summary> 1614 /// 从当前工作目录进入一个子目录 1615 /// </summary> 1616 /// <param name="DirectoryName">子目录名称</param> 1617 private bool EnterOneSubDirectory( string DirectoryName ) 1618 { 1619 try 1620 { 1621 1622 if( DirectoryName.IndexOf( "/" ) >= 0 || !IsValidPathChars( DirectoryName ) ) 1623 1624 { 1625 1626 throw new Exception( "目录名非法!" ); 1627 1628 } 1629 1630 if( DirectoryName.Length > 0 && DirectoryExist( DirectoryName ) ) 1631 1632 { 1633 1634 if( !DirectoryName.EndsWith( "/" ) ) 1635 1636 { 1637 1638 DirectoryName += "/"; 1639 1640 } 1641 1642 _DirectoryPath += DirectoryName; 1643 1644 return true; 1645 1646 } 1647 1648 else 1649 1650 { 1651 1652 return false; 1653 1654 } 1655 1656 } 1657 1658 catch( Exception ep ) 1659 1660 { 1661 1662 ErrorMsg = ep.ToString(); 1663 1664 throw ep; 1665 1666 } 1667 1668 } 1669 1670 /// <summary> 1671 /// 从当前工作目录往上一级目录 1672 /// </summary> 1673 public bool ComeoutDirectory() 1674 { 1675 if( _DirectoryPath == "/" ) 1676 { 1677 1678 ErrorMsg = "当前目录已经是根目录!"; 1679 1680 throw new Exception( "当前目录已经是根目录!" ); 1681 1682 } 1683 1684 char[] sp = new char[ 1 ] { '/' }; 1685 1686 string[] strDir = _DirectoryPath.Split( sp, StringSplitOptions.RemoveEmptyEntries ); 1687 1688 if( strDir.Length == 1 ) 1689 { 1690 1691 _DirectoryPath = "/"; 1692 } 1693 else 1694 { 1695 1696 _DirectoryPath = String.Join( "/", strDir, 0, strDir.Length - 1 ); 1697 1698 } 1699 1700 return true; 1701 1702 1703 1704 } 1705 1706 #endregion 1707 1708 #region 重载WebClient,支持FTP进度 1709 1710 internal class MyWebClient : WebClient 1711 { 1712 protected override WebRequest GetWebRequest( Uri address ) 1713 { 1714 FtpWebRequest req = ( FtpWebRequest ) base.GetWebRequest( address ); 1715 1716 req.UsePassive = false; 1717 1718 return req; 1719 } 1720 } 1721 1722 #endregion 1723 1724 } 1725 }