Introduction
This is my first attempt at making a useful application using C# and sockets. The program is far from complete but I think it can do the basics for now (upload, download, resume, append). I want to add as many features as possible to this semi-console version so that way, it will be easy to use it in a windows form. I'm the worst when it comes to [GOOD] coding practices/methods so I'll take any advice on how I can make my code more efficient. I wouldn't mind hearing how other people have designed such programs.
Since the initial post, I have been working on and off on the FTP client. Unfortunately, my HD crashed and all my work so I restarted from what I had submitted last October. I'm very happy to see that a few individuals have sampled by code and posted messages. I'm trying to design the class to be modular, so it can easily be used/imported in/to a GUI or Console program, and simple.
If you find any bugs, please post them or tell me. I found a lot as I redid the project. The picture to the left is using CoreFtp in a console and the right is using ExtFtpIa in a form.
-- Update --
I have again rewritten the code, it is much cleaner and uses less lines of code. Unfortunately, I didn't implement a lot of the features I had in my previous two versions because they were unnecessary.
Details
Some of the cool things that it can do so far is queue upload/download commands, resume/append files and establish a data connection using PASV or PORT. I've also commented most of the functions in XML so you can create a comments webpage.
The library is capable of uploading, downloading, resuming and appending and can establish a data connection using PASV or PORT. Text sent by the client, and text received from the server can be captured by using a System.IO.TextWriter
object such as Console.Out
, or TextWriter.Null
(if you don't want to capture the text).
Unfortunately, I don't have full access to a windows FTP server so I was unable to implement WindowsFileNode.Delete
. It will throw a NotImplementedException
when invoked.
I also included some other classes in the library to send emails (MIME and regular text e-mails), and to retrieve e-mails using a POP3 server.
The Important Classes and Methods
Create
The FtpConnection.Create
method is overloaded. One will take a username and password, and the other will login anonymously.
[STAThread]
static void Main(string[] args)
{
FtpConnection ftpConn = FtpConnection.Create("ftp.epson.com",
21, Console.Out, Console.Out);
}
ReceiveReply
ReceiveReply
retrieves the reply sent by the server. The method blocks until the reply has been received. What is returned is an and ArpaReply
object which has two important properties, a reply code and a reply message.
FileTransfer
FileTransfer
is an abstract classes that synchronously or asynchronously, uploads or downloads a file to or from a FTP server. The four main classes that derive from FileTransfer
are ActiveFileDownload
, PassiveFileUpload
, ActiveFileUpload
, and PassiveFileUpload
. When performing an asynchronous file transfer, an IDataTransferAsyncResult
is returned which contains a method to asynchronosuly abort a file transfer, and a property, BytesTransferred
, that gets the amount of bytes transferred so far.
SendCommand
SendCommand
sends a commands to the FTP server. The command to send is selected using the , FtpCommand
enumerator. You place the parameters in a string object.
SendCommand(FtpCommand cmd, string param)
DirectoryList
DirectoryList
is an abstract class to retrieve a directory listing from a FTP server. The classes derived from it are ActiveDirectoryList
and PassiveDirectoryList
.
FileNode
FileNode
contains an abstract method, FileNode.FromFtpList
, that parses the directory listing received from a FTP server to an array of FileNode
objects. I made a class for the UNIX and windows file listing. I'm having problems with parsing the listings from some servers (e.x.: doing a directory listing from ftp.epson.com/drivers will generate errors). I didn't create code for WindowsFileNode.Delete
because I don't have a windows FTP server to test it on, so for now, it will throw a NotImplemented
exception.
Test Code
[STAThread]
static void Main(string[] args)
{
FtpConnection ftpConn = FtpConnection.Create("risc.ua.edu", 21,
Console.Out, Console.Out);
DirectoryList dirList = new PassiveDirectoryList(ftpConn);
byte[] data = dirList.GetList(null, Console.Out, Console.Out);
string list = System.Text.Encoding.ASCII.GetString(data);
UnixFileNode[] fileNodes = (UnixFileNode[]) new UnixFileNode().FromFtpList(list,
ftpConn.CurrentWorkingDirectory);
foreach(UnixFileNode fileNode in fileNodes)
Console.WriteLine(fileNode);
ftpConn.Close();
}