zoukankan      html  css  js  c++  java
  • .Net 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等) 2

    上一篇中介绍的文件上传下载都是基于同步操作.本篇将就异步操作做个总结.
    本篇主要总结WebClient类异步上传实现方式和FtpWebRequest类异步上传实现方式,其实明白了异步上传,异步下载就是同样的道理实现.

    1.WebClient异步上传
    关键知识说明:
    WebClient类提供4个异步上传方法,使用方法都是差不多的.
    WebClient.UploadDataAsync方法
    将数据缓冲区上载到指定的资源

    WebClient.UploadFileAsync方法
    将指定的本地文件上载到指定的资源

    WebClient.UploadStringAsync方法
    将指定的字符串上载到指定的资源

    WebClient.UploadValuesAsync方法
    将指定的名称/值集合上载到指定的资源

    其中一个方法签名如下:
    public void UploadDataAsync (
     Uri address,
     string method,
     byte[] data,
     Object userToken
    )
    参数
    address
    接收数据的资源的URI
    method
    用于将文件发送到资源的HTTP方法。如果为空,则对于http默认值为POST,对于ftp默认值为STOR
    data
    要发送到资源的数据缓冲
    userToken
    一个用户定义对象,此对象将被传递给完成异步操作时所调用的方法

    若要在数据的上载完成时收到通知,需要实现WebClient.UploadDataCompleted事件,此事件在每次完成异步数据上载操作时引发

    总结WebClient异步上传实现步骤:
    第一步:定义WebClient,设置各属性
    第二步:注册完成事件UploadDataCompleted,以便完成上传时回调
    第三步:调用UploadDataAsync方法开始异步上传文件
    第四步:上传文件完成回调完成事件UploadDataCompleted定义的方法

    实例代码:
    把D:/n.txt文件上传到ftp://ftp.dygs2b.com

    WebClient request = new WebClient ( );

    //注册完成事件,以便上传完成时,收到通知
    request.UploadDataCompleted += new UploadDataCompletedEventHandler ( request_UploadDataCompleted );

    string ftpUser = "a";
    string ftpPassWord = "b";
    request.Credentials 
    = new NetworkCredential ( ftpUser , ftpPassWord );

    FileStream myStream 
    = new FileStream ( @"D:/n.txt" , FileMode.Open , FileAccess.Read );
    byte [ ] dataByte = new byte [ myStream.Length ];
    myStream.Read ( dataByte , 
    0 , dataByte.Length );        //写到2进制数组中
    myStream.Close ( );

    Uri uri 
    = new Uri ( "ftp://ftp.dygs2b.com/n.txt" );
    request.UploadDataAsync ( uri , 
    "STOR" , dataByte , dataByte );

    void request_UploadDataCompleted ( object sender , UploadDataCompletedEventArgs e )
    {
        
    //接收UploadDataAsync传递过来的用户定义对象
        byte [ ] dataByte = ( byte [ ] ) e.UserState;

        
    //AsyncCompletedEventArgs.Error属性,获取一个值,该值指示异步操作期间发生的错误
        if ( e.Error == null )
        {
            MessageBox.Show ( 
    string.Format ( "上传成功!文件大小{0}" , dataByte.Length ) );
        }
        
    else
        {
            MessageBox.Show ( e.Error.Message );
        }
    }

    2.FtpWebRequest异步上传
    使用FtpWebRequest对象向服务器上载文件,则必须将文件内容写入请求流,同步请求流是通过调用GetRequestStream方法,而异步对应方法是BeginGetRequestStream和EndGetRequestStream方法.

    其中BeginGetRequestStream方法签名如下:
    public override IAsyncResult BeginGetRequestStream (
     AsyncCallback callback,
     Object state
    )

    参数
    callback
    一个 AsyncCallback 委托,它引用操作完成时要调用的方法
    state
    一个用户定义对象,其中包含该操作的相关信息。当操作完成时,此对象会被传递给callback委托

    必须调用EndGetRequestStream方法用来完成异步操作。通常,EndGetRequestStream由callback所引用的方法调用。

    总结FtpWebRequest异步上传实现步骤:
    第一步:定义FtpWebRequest,并设置相关属性
    第二步:调用FtpWebRequest.BeginGetRequestStream方法,定义操作完成时要调用的方法EndGetResponseCallback,开始以异步方式打开请求的内容流以便写入.
    第三步:实现EndGetResponseCallback方法,在此方法中调用FtpWebRequest.EndGetRequestStream方法,结束由BeginGetRequestStream启动的挂起的异步操作,再把本地的文件流数据写到请求流(RequestStream)中,再FtpWebRequest.BeginGetResponse方法,定义操作完成时要调用的方法EndGetResponseCallback,开始以异步方式向FTP服务器发送请求并从FTP服务器接收响应.
    第四步:实现EndGetResponseCallback方法,在此方法中调用FtpWebRequest.EndGetResponse方法,结束由BeginGetResponse启动的挂起的异步操作.

    实例代码:
    把D:/n.txt文件上传到ftp://ftp.dygs2b.com

    Uri uri = new Uri ( "ftp://ftp.dygs2b.com/n.txt" );

    //定义FtpWebRequest,并设置相关属性
    FtpWebRequest uploadRequest = ( FtpWebRequest ) WebRequest.Create ( uri );
    uploadRequest.Method 
    = WebRequestMethods.Ftp.UploadFile;

    string ftpUser = "a";
    string ftpPassWord = "b";
    uploadRequest.Credentials 
    = new NetworkCredential ( ftpUser , ftpPassWord );

    //开始以异步方式打开请求的内容流以便写入
    uploadRequest.BeginGetRequestStream ( new AsyncCallback ( EndGetStreamCallback ) , uploadRequest );
    private void EndGetStreamCallback ( IAsyncResult ar )
    {
        
    //用户定义对象,其中包含该操作的相关信息,在这里得到FtpWebRequest
        FtpWebRequest uploadRequest = ( FtpWebRequest ) ar.AsyncState;

        
    //结束由BeginGetRequestStream启动的挂起的异步操作
        
    //必须调用EndGetRequestStream方法来完成异步操作
        
    //通常EndGetRequestStream由callback所引用的方法调用
        Stream requestStream = uploadRequest.EndGetRequestStream ( ar );

        FileStream fileStream 
    = File.Open ( @"D:/n.txt" , FileMode.Open );

        
    byte [ ] buffer = new byte [ 1024 ];
        
    int bytesRead;
        
    while ( true )
        {
            bytesRead 
    = fileStream.Read ( buffer , 0 , buffer.Length );
            
    if ( bytesRead == 0 )
                
    break;

            
    //本地的文件流数据写到请求流
            requestStream.Write ( buffer , 0 , bytesRead );
        }

        requestStream.Close ( );
        fileStream.Close ( );

        
    //开始以异步方式向FTP服务器发送请求并从FTP服务器接收响应
        uploadRequest.BeginGetResponse ( new AsyncCallback ( EndGetResponseCallback ) , uploadRequest );
    }

    private void EndGetResponseCallback ( IAsyncResult ar )
    {
        FtpWebRequest uploadRequest 
    = ( FtpWebRequest ) ar.AsyncState;

        
    //结束由BeginGetResponse启动的挂起的异步操作
        FtpWebResponse uploadResponse = ( FtpWebResponse ) uploadRequest.EndGetResponse ( ar );

        MessageBox.Show ( uploadResponse.StatusDescription );
        MessageBox.Show ( 
    "Upload complete" );
    }
  • 相关阅读:
    基于摸板匹配的目標跟蹤算法
    spoj 2713 Can you answer these queries IV
    zoj 3633 Alice's present
    hdu 3642 Get The Treasury
    poj 1195 Mobile phones
    poj 2760 End of Windless Days
    zoj 3540 Adding New Machine
    spoj 1716 Can you answer these queries III
    spoj 1043 Can you answer these queries I
    spoj 2916 Can you answer these queries V
  • 原文地址:https://www.cnblogs.com/cpcpc/p/2123079.html
Copyright © 2011-2022 走看看