65.9K
CodeProject 正在变化。 阅读更多。
Home

C#中的控制台FTP

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.78/5 (15投票s)

2002年10月6日

3分钟阅读

viewsIcon

229723

downloadIcon

3052

C# 中的一个基本 FTP 客户端。

引言

这是我第一次尝试使用 C# 和套接字制作有用的应用程序。该程序远未完成,但我认为它目前可以完成一些基本操作(上传、下载、断点续传、追加)。我想在这个半控制台版本中添加尽可能多的功能,这样一来,它就可以很容易地在 Windows 窗体中使用。我最差劲的地方就是[好的]编码实践/方法,所以我会接受任何关于如何使我的代码更有效的建议。我也不介意听听其他人是如何设计此类程序的。

自从最初的帖子以来,我一直在断断续续地开发 FTP 客户端。不幸的是,我的硬盘崩溃了,我所有的工作都丢失了,所以我从去年十月份提交的内容重新开始。我很高兴看到一些人试用了我的代码并发布了消息。我试图将类设计成模块化的,这样就可以很容易地在 GUI 或控制台程序中被使用/导入/导出,并且简单。

如果您发现任何错误,请发布或告诉我。我在重新制作该项目时发现了许多错误。左边的图片是在控制台中使用 CoreFtp,右边的图片是在窗体中使用 ExtFtpIa。

-- 更新 --

我再次重写了代码,它更简洁,并且使用的代码行更少。不幸的是,我没有实现我在前两个版本中拥有的很多功能,因为它们是不必要的。

详细说明

到目前为止,它能做的一些很酷的事情是队列上传/下载命令、断点续传/追加文件,并使用 PASV 或 PORT 建立数据连接。我还用 XML 注释了大多数函数,因此您可以创建一个注释网页。

该库能够上传、下载、断点续传和追加,并且可以使用 PASV 或 PORT 建立数据连接。客户端发送的文本和从服务器接收的文本可以使用System.IO.TextWriter对象(如Console.OutTextWriter.Null(如果您不想捕获文本))来捕获。

不幸的是,我无法完全访问 Windows FTP 服务器,因此无法实现WindowsFileNode.Delete。在调用时,它将抛出NotImplementedException

我还包括了库中的其他一些类,用于发送电子邮件(MIME 和普通文本电子邮件),以及使用 POP3 服务器检索电子邮件。

重要的类和方法

Create

FtpConnection.Create方法已重载。一个将接受用户名和密码,另一个将匿名登录。

[STAThread]
static void Main(string[] args)
{
    FtpConnection ftpConn = FtpConnection.Create("ftp.epson.com", 
      21, Console.Out, Console.Out);
}

ReceiveReply

ReceiveReply检索服务器发送的回复。该方法会阻塞,直到收到回复。返回的是一个ArpaReply对象,它有两个重要的属性:回复代码和回复消息。

FileTransfer

FileTransfer是一个抽象类,它同步或异步地将文件上传或下载到 FTP 服务器。派生自FileTransfer的四个主要类是ActiveFileDownloadPassiveFileUploadActiveFileUploadPassiveFileUpload。在执行异步文件传输时,将返回一个IDataTransferAsyncResult,其中包含一个用于异步中止文件传输的方法和一个属性BytesTransferred,该属性获取到目前为止传输的字节数。

SendCommand

SendCommand向 FTP 服务器发送命令。要发送的命令是使用FtpCommand枚举器选择的。您将参数放在一个字符串对象中。

SendCommand(FtpCommand cmd, string param)

DirectoryList

DirectoryList是一个抽象类,用于从 FTP 服务器检索目录列表。派生自它的类是ActiveDirectoryListPassiveDirectoryList

FileNode

FileNode包含一个抽象方法FileNode.FromFtpList,它将从 FTP 服务器接收的目录列表解析为FileNode对象数组。我为 UNIX 和 Windows 文件列表创建了一个类。我在解析来自某些服务器的列表时遇到问题(例如:从 ftp.epson.com/drivers 执行目录列表将生成错误)。我没有为WindowsFileNode.Delete创建代码,因为我没有 Windows FTP 服务器来测试它,所以目前,它将抛出一个NotImplemented异常。

测试代码

[STAThread]
static void Main(string[] args)
{
    FtpConnection ftpConn = FtpConnection.Create("risc.ua.edu", 21, 
      Console.Out, Console.Out);
    
    //get directory listing
    DirectoryList dirList = new PassiveDirectoryList(ftpConn);
    byte[] data = dirList.GetList(null, Console.Out, Console.Out);
    
    //parse directory listing
    string list = System.Text.Encoding.ASCII.GetString(data);
    UnixFileNode[] fileNodes = (UnixFileNode[]) new UnixFileNode().FromFtpList(list, 
      ftpConn.CurrentWorkingDirectory);
    
    //show listing on console
    foreach(UnixFileNode fileNode in fileNodes)
    Console.WriteLine(fileNode);
    
    //disconnect
    ftpConn.Close();
}
© . All rights reserved.