zoukankan      html  css  js  c++  java
  • 在.net 2.0 中使用ftp

    摘要:本文简单的介绍了在.net 2.0下使用ftp的几种简单的方法,并提供了一个对FtpWebRequest封装的Ftp操作类

    在.net 1.1中,如果我们要使用ftp,往往得借助一些第三方类库,虽然这些第三方类库写得也非常好,但说明文档不够详细,以及一些使用习惯问题,往往没有.net自己的库使用地得心应手。现在好了,在.net 2.0 中添加了对许多ftp的支持,使用ftp变得非常简单了。

    首先,WebClient支以已经开始支持ftp协议了。

    比如说要从远程服务器上下载文件,只要使用两条命令就可以完成。

    WebClient webClient = new WebClient();

    webClient.DownloadFile("ftp://username:password@192.168.1.1/123.txt", @"f:\123.txt");

    上传文件到远程服务器也是一样简单。

    WebClient webClient = new WebClient();

    webClient.UploadFile("ftp://username:password@192.168.1.1/456.txt", @"f:\123.txt");

    上述方法非常简单,并且在大多数情况下也非常有效,但在一些情况下,我们需要一些高级的应用,这时WebClient就不能满足我们的需求了(比如说我现在经常需要以ASII形式从Unix服务器中下载一些文本文件,如果直接WebClient下载就存在文本格式没有转换的问题)。这个时候我们便需要另一个类FtpWebRequest

    FtpWebRequest通过ftp协议从 Internet 请求数据。FtpWebRequestHttpWebRequest一样,都是WebRequest的子类,都是基于.NET Framework 的请求/响应模型。下面的代码示例演示如何从 FTP 服务器上删除文件(代码来于MSDN)。

            public static bool DeleteFileOnServer(Uri serverUri)
            
    {
                
    // The serverUri parameter should use the ftp:// scheme. 
                
    // It contains the name of the server file that is to be deleted. 
                
    // Example: ftp://contoso.com/someFile.txt. 
                
    // 
                if (serverUri.Scheme != Uri.UriSchemeFtp)
                
    {
                    
    return false;
                }

                
    // Get the object used to communicate with the server. 
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
                request.Method 
    = WebRequestMethods.Ftp.DeleteFile;
                FtpWebResponse response 
    = (FtpWebResponse)request.GetResponse();
                Console.WriteLine(
    "Delete status: {0}", response.StatusDescription);
                response.Close();
                
    return true;
            }

    从上述代码中我们可以看到,FtpWebRequestHttpWebRequest的使用方式非常类似。只要将FtpWebRequest的 Method 属性设置为 WebRequestMethods.Ftp 结构中定义的值,就能发送相应的 FTP 命令到服务器,执行相应的操作。

     关于ftp的更多信息,这里就不详作介绍,下面是我用FtpWebRequest对常用的操作进行了一点简单的封装,相信读了下列代码后会对FtpWebRequest有更多的了解的。

    class FtpClient
        
    {
            
    string userName;
            
    string passWord;

            
    byte[] buffer = new byte[1024 * 20];

            
    public FtpClient(string userName, string passWord)
            
    {
                
    this.userName = userName;
                
    this.passWord = passWord;
            }


            
    /// <summary>
            
    /// 创建ftp请求信息
            
    /// </summary>
            
    /// <param name="url">目标url地址</param>
            
    /// <param name="useBinary">是否使用二进制传输</param>

            private FtpWebRequest GetRequest(string url, bool useBinary)
            
    {
                FtpWebRequest ftpRequest 
    = (FtpWebRequest)WebRequest.Create(url);
                ftpRequest.Credentials 
    = new NetworkCredential(userName, passWord);
                ftpRequest.UseBinary 
    = useBinary;
                ftpRequest.KeepAlive 
    = true;
                
    return ftpRequest;
            }


            
    private FtpWebRequest GetRequest(string url)
            
    {
                
    return GetRequest(url, false);
            }


            
    string GetStreamText(Stream stream)
            
    {
                StreamReader reader 
    = new StreamReader(stream, Encoding.Default);
                
    string text = reader.ReadToEnd();
                reader.Close();
                
    return text;
            }


            
    //将orgStream中的内容拷贝到desStream中
            void WriteStream(Stream orgStream, Stream desStream)
            
    {
                
    int num;
                
    while ((num = orgStream.Read(buffer, 0, buffer.Length)) > 0)
                
    {
                    desStream.Write(buffer, 
    0, num);
                }

                orgStream.Close();
                desStream.Close();
            }


            
    /// <summary>
            
    /// 列出ftp目录所包含的文件信息
            
    /// </summary>
            
    /// <param name="remoteDir">远程文件夹</param>
            
    /// <returns>文件详细信息</returns>

            public string ListFiles(string remoteDir)
            
    {
                FtpWebRequest request 
    = GetRequest(remoteDir, false);
                request.Method 
    = WebRequestMethods.Ftp.ListDirectoryDetails;
                
    return GetStreamText(request.GetResponse().GetResponseStream());
            }


            
    /// <summary>
            
    /// 下载文件
            
    /// </summary>
            
    /// <param name="localFile">本地文件路径</param>
            
    /// <param name="remoteFile">远程文件路径</param>
            
    /// <param name="useBinary">是否采用二进制方式</param>

            public void DownloadFile(string localFile, string remoteFile, bool useBinary)
            
    {
                FtpWebRequest request 
    = GetRequest(remoteFile, useBinary);
                request.Method 
    = WebRequestMethods.Ftp.DownloadFile;

                WriteStream(request.GetResponse().GetResponseStream(), File.Create(localFile));
            }


            
    /// <summary>
            
    /// 上传文件
            
    /// </summary>
            
    /// <param name="localFile">本地文件路径</param>
            
    /// <param name="remoteFile">远程文件路径</param>
            
    /// <param name="useBinary">是否采用二进制方式</param>

            public void UploadFile(string localFile, string remoteFile, bool useBinary)
            
    {
                FileInfo fi 
    = new FileInfo(localFile);
                FtpWebRequest request 
    = GetRequest(remoteFile, useBinary);
                request.Method 
    = WebRequestMethods.Ftp.UploadFile;
                request.ContentLength 
    = fi.Length;

                WriteStream(fi.OpenRead(),request.GetRequestStream());
                request.GetResponse();
            }


            
    //删除文件
            public void DeleteFile(string remoteFile)
            
    {
                FtpWebRequest request 
    = GetRequest(remoteFile);
                request.Method 
    = WebRequestMethods.Ftp.DeleteFile;

                FtpWebResponse resp 
    = request.GetResponse() as FtpWebResponse;
            }

        }
  • 相关阅读:
    effective c++ 条款10 让operator= 返回*this的引用
    基于vs2008的opengl开发环境的配置
    effective c++ 条款13 以对象管理资源
    effective C++ 条款06如果你不想让编译器为你生成函数就应该明确拒绝
    effective c++条款07为多态基类声明为virtual析构函数
    effective c++条款08别让异常逃离析构函数
    effective c++条款11 在operator=中处理“自我赋值”
    ubuntu 下的截图工具
    effective c++ 条款12 赋值对象时勿忘其每一个成员
    [linux 安装]修改centos的yum源
  • 原文地址:https://www.cnblogs.com/kokoliu/p/1341735.html
Copyright © 2011-2022 走看看