摘要:本文简单的介绍了在.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:[email protected]/123.txt", @"f:\123.txt");
上传文件到远程服务器也是一样简单。
WebClient webClient = new WebClient();
webClient.UploadFile("ftp://username:[email protected]/456.txt", @"f:\123.txt");
上述方法非常简单,并且在大多数情况下也非常有效,但在一些情况下,我们需要一些高级的应用,这时WebClient就不能满足我们的需求了(比如说我现在经常需要以ASII形式从Unix服务器中下载一些文本文件,如果直接WebClient下载就存在文本格式没有转换的问题)。这个时候我们便需要另一个类FtpWebRequest。
FtpWebRequest通过ftp协议从 Internet 请求数据。FtpWebRequest和HttpWebRequest一样,都是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;
}
从上述代码中我们可以看到,FtpWebRequest和HttpWebRequest的使用方式非常类似。只要将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;
}
}