C#中的控制台FTP






3.78/5 (15投票s)
2002年10月6日
3分钟阅读

229723

3052
C# 中的一个基本 FTP 客户端。
引言
这是我第一次尝试使用 C# 和套接字制作有用的应用程序。该程序远未完成,但我认为它目前可以完成一些基本操作(上传、下载、断点续传、追加)。我想在这个半控制台版本中添加尽可能多的功能,这样一来,它就可以很容易地在 Windows 窗体中使用。我最差劲的地方就是[好的]编码实践/方法,所以我会接受任何关于如何使我的代码更有效的建议。我也不介意听听其他人是如何设计此类程序的。
自从最初的帖子以来,我一直在断断续续地开发 FTP 客户端。不幸的是,我的硬盘崩溃了,我所有的工作都丢失了,所以我从去年十月份提交的内容重新开始。我很高兴看到一些人试用了我的代码并发布了消息。我试图将类设计成模块化的,这样就可以很容易地在 GUI 或控制台程序中被使用/导入/导出,并且简单。
如果您发现任何错误,请发布或告诉我。我在重新制作该项目时发现了许多错误。左边的图片是在控制台中使用 CoreFtp,右边的图片是在窗体中使用 ExtFtpIa。
-- 更新 --
我再次重写了代码,它更简洁,并且使用的代码行更少。不幸的是,我没有实现我在前两个版本中拥有的很多功能,因为它们是不必要的。
详细说明
到目前为止,它能做的一些很酷的事情是队列上传/下载命令、断点续传/追加文件,并使用 PASV 或 PORT 建立数据连接。我还用 XML 注释了大多数函数,因此您可以创建一个注释网页。
该库能够上传、下载、断点续传和追加,并且可以使用 PASV 或 PORT 建立数据连接。客户端发送的文本和从服务器接收的文本可以使用System.IO.TextWriter
对象(如Console.Out
或TextWriter.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
的四个主要类是ActiveFileDownload
、PassiveFileUpload
、ActiveFileUpload
和PassiveFileUpload
。在执行异步文件传输时,将返回一个IDataTransferAsyncResult
,其中包含一个用于异步中止文件传输的方法和一个属性BytesTransferred
,该属性获取到目前为止传输的字节数。
SendCommand
SendCommand
向 FTP 服务器发送命令。要发送的命令是使用FtpCommand
枚举器选择的。您将参数放在一个字符串对象中。
SendCommand(FtpCommand cmd, string param)
DirectoryList
DirectoryList
是一个抽象类,用于从 FTP 服务器检索目录列表。派生自它的类是ActiveDirectoryList
和PassiveDirectoryList
。
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();
}