FTP Client library in C#

This is the C# version of an FTP client library which was originally written in Java.The library will be compiled to a DLL file. A test program is also included to show the usage of this library. You will get more details about FTP from its rfc. Most of the commands are supported here. File upload & download methods are capable enough of doing resuming also.

The given test program is a console based application. I’m inviting somebody on thenet to develop a front end application with this library.

/*
FTPFactory.cs
Better view with tab space=4

Written by Jaimon Mathew (jaimonmathew@rediffmail.com)
Rolander,Dan (Dan.Rolander@marriott.com) has modified the
download
method to cope with file name with path information. He also
provided
the XML comments so that the library provides Intellisense
descriptions.

use the following line to compile
csc /target:library /out:FTPLib.dll /r:System.DLL FTPFactory.cs
*/

using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;

namespace FtpLib
{

public class FTPFactory
{

private string
remoteHost,remotePath,remoteUser,remotePass,mes;
private int remotePort,bytes;
private Socket clientSocket;

private int retValue;
private Boolean debug;
private Boolean logined;
private string reply;

private static int BLOCK_SIZE = 512;

Byte[] buffer = new Byte[BLOCK_SIZE];
Encoding ASCII = Encoding.ASCII;

public FTPFactory()
{

remoteHost = "localhost";
remotePath = ".";
remoteUser = "anonymous";
remotePass = "jaimon@school2000.co.uk";
remotePort = 21;
debug = false;
logined = false;

}

///
/// Set the name of the FTP server to connect to.
///
/// Server name
public void setRemoteHost(string remoteHost)
{
this.remoteHost = remoteHost;
}

///
/// Return the name of the current FTP server.
///
/// Server name
public string getRemoteHost()
{
return remoteHost;
}

///
/// Set the port number to use for FTP.
///
/// Port number
public void setRemotePort(int remotePort)
{
this.remotePort = remotePort;
}

///
/// Return the current port number.
///
/// Current port number
public int getRemotePort()
{
return remotePort;
}

///
/// Set the remote directory path.
///
/// The remote directory path
public void setRemotePath(string remotePath)
{
this.remotePath = remotePath;
}

///
/// Return the current remote directory path.
///
/// The current remote directory path.
public string getRemotePath()
{
return remotePath;
}

///
/// Set the user name to use for logging into the remote
server.
///
/// Username
public void setRemoteUser(string remoteUser)
{
this.remoteUser = remoteUser;
}

///
/// Set the password to user for logging into the remote
server.
///
/// Password
public void setRemotePass(string remotePass)
{
this.remotePass = remotePass;
}

///
/// Return a string array containing the remote directory's
file list.
///
///
///
public string[] getFileList(string mask)
{

if(!logined)
{
login();
}

Socket cSocket = createDataSocket();

sendCommand("NLST " + mask);

if(!(retValue == 150 || retValue == 125))
{
throw new IOException(reply.Substring(4));
}

mes = "";

while(true)
{

int bytes = cSocket.Receive(buffer, buffer.Length, 0);
mes += ASCII.GetString(buffer, 0, bytes);

if(bytes < buffer.Length)
{
break;
}
}

char[] seperator = {'\n'};
string[] mess = mes.Split(seperator);

cSocket.Close();

readReply();

if(retValue != 226)
{
throw new IOException(reply.Substring(4));
}
return mess;

}

///
/// Return the size of a file.
///
///
///
public long getFileSize(string fileName)
{

if(!logined)
{
login();
}

sendCommand("SIZE " + fileName);
long size=0;

if(retValue == 213)
{
size = Int64.Parse(reply.Substring(4));
}
else
{
throw new IOException(reply.Substring(4));
}

return size;

}

///
/// Login to the remote server.
///
public void login()
{

clientSocket = new
Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ep = new
IPEndPoint(Dns.Resolve(remoteHost).AddressList[0], remotePort);

try
{
clientSocket.Connect(ep);
}
catch(Exception)
{
throw new IOException("Couldn't connect to remote
server");
}

readReply();
if(retValue != 220)
{
close();
throw new IOException(reply.Substring(4));
}
if(debug)
Console.WriteLine("USER "+remoteUser);

sendCommand("USER "+remoteUser);

if( !(retValue == 331 || retValue == 230) )
{
cleanup();
throw new IOException(reply.Substring(4));
}

if( retValue != 230 )
{
if(debug)
Console.WriteLine("PASS xxx");

sendCommand("PASS "+remotePass);
if( !(retValue == 230 || retValue == 202) )
{
cleanup();
throw new IOException(reply.Substring(4));
}
}

Continues…

Pages: 1 2

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

No comments yet... Be the first to leave a reply!