在.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;
        }

    }
原文地址:https://www.cnblogs.com/TianFang/p/485993.html