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.
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
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
FtpConnection.Create method is overloaded. One will take a username and password, and the other will login anonymously.
static void Main(string args)
FtpConnection ftpConn = FtpConnection.Create("ftp.epson.com",
21, Console.Out, Console.Out);
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 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
PassiveFileUpload. When performing an asynchronous file transfer, an
IDataTransferAsyncResult is returned which contains a method to asynchronosuly abort a file transfer, and a property,
, that gets the amount of bytes transferred so far.
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 is an abstract class to retrieve a directory listing from a FTP server. The classes derived from it are
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
static void Main(string args)
FtpConnection ftpConn = FtpConnection.Create("risc.ua.edu", 21,
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,
foreach(UnixFileNode fileNode in fileNodes)