Click here to Skip to main content
Click here to Skip to main content

Simple FTP demo application using C#.Net 2.0

By , 17 Jan 2007
 

Sample Image - maximum width is 600 pixels

Introduction

An addition to the Microsoft .NET framework 2.0 to 1.x is the support for FTP. All these days we had to rely on 3rd party libraries which pretty well suited most of our needs, but for sure, there is an extra pleasure using the .net framework library classes. The code included is not designed to be a fulfledged reusable library, but rather an easy to use and reusable pieces of code which is easily comprehensible and can be reused and tweaked to fit your specific needs. Therefore the code for each functionality(upoad, download, delete etc..) can be easy picked up separately and reused. The main motive behind this article was the unavailability of .net2.0 ftp sample codes and their usage in C#; may be because its a new entrant to the .net scenario, or the third party implementations available were working pretty well, that this area of the .net2.0 library haven't got enough focus.

Background

I started working on this FTP module as part of my official work, but the requirement soon changed and I had to do it for .net 1.1. So, I haven't travelled deeper into the rabbit hole. But I believe this gives a good, instant start for using the FTP support in .net 2.0.

Using the code

Don't forget to add the following directive:

using System.Net;
using System.IO;

The following steps can be considered as a generic procedure of getting an FTP request executed using FtpWebRequest object:

  1. Create an FtpWebRequest object over an ftp server Uri
  2. Set the ftp method to execute (upload, download, etc.)
  3. Set options(ssl support, transfer as binary/not etc.) for the ftp webrequest.
  4. Set the login credentials(username, password)
  5. Execute the request.
  6. Recieve the response stream(if required).
  7. Close the FTP Request, in addition to any open streams.

One point to watch out while coding for any ftp application is to have the settings for the ftp request proper to suit the ftp server and its specific configurations. FtpWebRequest object exposes many poperties to have these settings in place.

The sample for the upload functionality is as follows:

First a uri is created which represents the ftp address along with the filename(directory structure included). This uri is used to create the FtpWebRequest instance.

Then properties of the FtpWebRequest object are set, which determines the settings for the ftp request. Some of its important properties are:

  • Credentials - specifies the username and password to login to the FTP server.
  • KeepAlive - specifies if the control connection should be closed or not after the request is completed. By default it is set to true.
  • UseBinary - denotes the datatype for file transfers. The 2 modes of file transfer in this case are Binary and ASCII. At bit level both vary in the 8th bit of a byte. ASCII uses 8th bit as insignificant bit for error control, where as, for binary all the 8 bits are significant. So take care when you go for the ASCII transmission. To be simple, all those files that open and read well in notepad are safe as ascii. Executables, formatted docs etc should be send using binary mode. BTW sending ASCII files as binary works fine most of the time.
  • UsePassive - specifies to use either active or passive mode. Earlier active FTP worked fine with all clients, but now a days as most of the random ports will blocked by firewall, the active mode may fail. The passive FTP is helpful in this case. But still it causes issues at the server. The higher ports requested by client on server may also be blocked by firewall. But since FTP servers will need to make their servers accessible to the greatest number of clients, they will almost certainly need to support passive FTP. The reason why passive mode is considered safe is that, it ensures all data flow initiation comes from inside(client) the network rather than from the outside(server).
  • Contentlength - setting this property is useful for the server we request to but is not of much use for us(client), because FtpWebRequest usually ignores this property value, so it will not be available for our use in most of the cases. But if we set this property, the FTP server will get an idea in advance about the size of the file it should expect(in case of upload)
  • Method - Denotes what action(command) to take in the current request.(upload, download, filelist etc.) It is set a value defined in the WebRequestMethods.Ftp structure.

private void Upload(string filename)
{
  FileInfo fileInf = new FileInfo(filename);
  string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
  FtpWebRequest reqFTP;
    
  // Create FtpWebRequest object from the Uri provided
  reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(
            "ftp://" + ftpServerIP + "/" + fileInf.Name));

  // Provide the WebPermission Credintials
  reqFTP.Credentials = new NetworkCredential(ftpUserID, 
                                             ftpPassword);
    
  // By default KeepAlive is true, where the control connection is 
  // not closed after a command is executed.
  reqFTP.KeepAlive = false;

  // Specify the command to be executed.
  reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
    
  // Specify the data transfer type.
  reqFTP.UseBinary = true;

  // Notify the server about the size of the uploaded file
  reqFTP.ContentLength = fileInf.Length;

  // The buffer size is set to 2kb
  int buffLength = 2048;
  byte[] buff = new byte[buffLength];
  int contentLen;
    
  // Opens a file stream (System.IO.FileStream) to read 
  the file to be uploaded
  FileStream fs = fileInf.OpenRead();
   
  try
  {
        // Stream to which the file to be upload is written
        Stream strm = reqFTP.GetRequestStream();
        
        // Read from the file stream 2kb at a time
        contentLen = fs.Read(buff, 0, buffLength);
        
        // Till Stream content ends
        while (contentLen != 0)
        {
            // Write Content from the file stream to the 
            // FTP Upload Stream
            strm.Write(buff, 0, contentLen);
            contentLen = fs.Read(buff, 0, buffLength);
        }
        
        // Close the file stream and the Request Stream
        strm.Close();
        fs.Close();
  }
  catch(Exception ex)
    {
        MessageBox.Show(ex.Message, "Upload Error");
    }
}

Above is a sample code for FTP Upload (PUT). The underlying sub command used is STOR. Here an FtpWebRequest object is made for the specified file on the ftp server. Different properties are set for the request namely Credentials, KeepAlive, Method, UseBinary, ContentLength. The file in our local machine is opened and the contents are written to the FTP request stream. Here a buffer of size 2kb is used as an appropriate size suited for upload of larger or smaler files.

private void Download(string filePath, string fileName)
{
    FtpWebRequest reqFTP;
    try
    {
        //filePath = <<The full path where the 
        //file is to be created. the>>, 
        //fileName = <<Name of the file to be createdNeed not 
        //name on FTP server. name name()>>
        FileStream outputStream = new FileStream(filePath + 
                                "\\" + fileName, FileMode.Create);

        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + 
                                ftpServerIP + "/" + fileName));
        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(ftpUserID, 
                                                    ftpPassword);
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        Stream ftpStream = response.GetResponseStream();
        long cl = response.ContentLength;
        int bufferSize = 2048;
        int readCount;
        byte[] buffer = new byte[bufferSize];

        readCount = ftpStream.Read(buffer, 0, bufferSize);
        while (readCount > 0)
        {
            outputStream.Write(buffer, 0, readCount);
            readCount = ftpStream.Read(buffer, 0, bufferSize);
        }

        ftpStream.Close();
        outputStream.Close();
        response.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
        

Above is a sample code for Download of file from the FTP server. Unlike the Upload functionality described above, Download would require the response stream, which will contain the content of the file requested.
Here the file to download is specified as part of the Uri which inturn is used for the creation of the FtpWebRequest object. To 'GET' the file requested, get the response of the FtpWebRequest object using GetResponse() method. This new response object built provides the response stream which contain the file content as stream, which you can easily convert to a file stream to get the file in place.
Note: We have the flexibility to set the location and name of the file under which it is to be saved on our local machine.

public string[] GetFileList()
{
    string[] downloadFiles;
    StringBuilder result = new StringBuilder();
    FtpWebRequest reqFTP;
    try
    {
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(
                  "ftp://" + ftpServerIP + "/"));
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(ftpUserID, 
                                                   ftpPassword);
        reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
        WebResponse response = reqFTP.GetResponse();
        StreamReader reader = new StreamReader(response
                                        .GetResponseStream());
        
        string line = reader.ReadLine();
        while (line != null)
        {
            result.Append(line);
            result.Append("\n");
            line = reader.ReadLine();
        }
        // to remove the trailing '\n'
        result.Remove(result.ToString().LastIndexOf('\n'), 1);
        reader.Close();
        response.Close();
        return result.ToString().Split('\n');
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
        downloadFiles = null;
        return downloadFiles;
    }
}
        

Above is a sample block of code for getting the file list on the ftp server. The Uri is built specifying the FTP server address/name and the required path if any. In the above example the root folder is specified for the creation of the FtpWebRequest object. Here the response stream is used for the creation of a StreamReader object, which has the whole list of file names on the server separated by "\r\n" which is newline and carriagereturn together. You can get the whole file list ("\r\n" separated) using the ReadToEnd() method of the StreamReader object. The above implementation, reads each file name and creates a StringBuilder object by appending each file name. The resultant StringBuilder object is split into a stirng array and returned. I am sure there are better ways to do it. A better could be to remove the whole '\r' instances from the whole list (returned by <<StreamReader>>.ReadToEnd())) and split the resultant string uisng '\n' delimiter. Anyway I didnt want to spend more of my energy and time pondering over it ;-).

The implementations for Rename, Delete, GetFileSize, FileListDetails, MakeDir are very similar to the above pieces of code and the attached code is easily comprehensible.

Note: For Renaming, the new name can be assigned to the RenameTo property of FtpWebRequest object. For MakeDirectory, the name of the new directory can be specified as part of the Uri used to create FtpWebRequest object.

Points of Interest

Please take NOTE of the following points while coding in this area:

  • Unless the EnableSsl property is true, all data and commands, including your user name and password information, are sent to the server in clear text. Anyone monitoring network traffic can view your credentials and use them to connect to the server. If you are connecting to an FTP server that requires credentials and supports Secure Sockets Layer (SSL), you should set EnableSsl to true.
  • If you do not have the proper WebPermission to access the FTP resource, a SecurityException exception is thrown.
  • Requests are sent to the server by calling the GetResponse method. When the requested operation completes, an FtpWebResponse object is returned. The FtpWebResponse object provides the status of the operation and any data downloaded from the server. That is,
    StatusCode property of FtpWebResponse object provides the latest status code returned by the FTP server.
    StatusDescription property of FtpWebResponse object provides the description of the status code returned.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Mohammed Habeeb
Web Developer
India India
Member
Mohammed Habeeb works as a software developer for an IT company in Dubai. He holds a bachelors in Computer Science Engineering from MES College, Calicut University. He is also a Microsoft Certified Application Developer (MCAD) in .NET Framework. He has a strong inclination towards Microsoft technologies especially the .NET Platform. He has been an active member of Cochin and Bangalore Microsoft user groups.
He has a strong passion for science and technology. His interests span through travelling, driving, photography, stamps and coin collection.
You can find more about him @ http://www.habeebonline.com

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionAwesomememberLokeshThakur11 Apr '13 - 5:18 
This is great stuff pal, thanks alot.
Loki Loks

QuestionThank You manmemberdaghune12 Mar '13 - 23:08 
Thanks
GeneralGood articlememberRasadul Alam10 Mar '13 - 19:55 
Good article.It will help us.
 
I have written an article about this.
 
http://cybarlab.blogspot.com/2013/03/file-upload-download-delete-from-ftp.html[^]
QuestionSomething wrong with file downloadingmemberxcf0075 Nov '12 - 14:53 
The two files cannot be download.Maybe broken files,could you please reupload them again.
Thank you for the nice work.
Questiontestmemberhgfhdgfhdg14 Sep '12 - 1:06 
This is test message
GeneralMy vote of 5memberChandraShekar.SK10 Sep '12 - 20:57 
Well written.
GeneralMy vote of 5membercyrildex30 Aug '12 - 23:28 
Very few articles show you how to use FTP.
GeneralMy vote of 5memberVijay234520 Jul '12 - 9:49 
very good, thank you sir!
GeneralMy vote of 5memberAJMAL SHAHZAD22 Jun '12 - 0:10 
Greate
Questionsecure ftp?membercmb333319 May '12 - 5:28 
Curious if this project supports secure ftp?
GeneralMy vote of 5memberAvi Farah1 Apr '12 - 14:09 
Thank you. I will try it tomorrow
QuestionGetting the Problem in deleting and rename file..and also tell me about how i will maintain the login and logout session of users on networkmemberipaldhi22 Jan '12 - 21:41 
I want to implement the same code on asp.net .....plz help me..
GeneralMy vote of 5memberSuhasHaridas16 Dec '11 - 23:22 
This demo application is very helpfull for me..
Thanks a lot =)
www.dopostback.wordpress.com
QuestionTime Out Errormembersaadullah Bhutto12 Dec '11 - 5:38 
Hello I am Uploading file using Ftp webRequest but it give me error for time out
the data transferred to the destination but in a corrupted format
 
please help me to upload the large file using asp.net
I have changed the web.config it works fine at my PC but not at my Hosting
if there is any way please help me Asap i will be ver thankful to You
QuestionTransfering Files through FTP in WPFmemberLivingstan7 Dec '11 - 23:26 
So Simple.....!!!!!
 
You can Transfer Files using "WCF" when "HTTP proxy" ERROR Occurs for Help
sidd_bang2005@yahoo.co.in
GeneralThanks for this..working very well for large file too..memberJaydeep Jadav23 Oct '11 - 22:46 
Thanks for this..working very well for large file too.. Smile | :)
QuestionRetrieve a file with GET commandmemberhasell231 Aug '11 - 23:37 
Hello!
I have a problem with a FTP server that not allows the “RETR” command to get a file, only allow the “GET” command.
I try to set the property FtpWebRequest.Method to “GET” by literal string, but throws an exception saying that value is not valid. I only can set FtpWebRequest.Method to a value which is included in class WebRequestMethods.Ftp. In this class there is not any GET string associated to any string variable. I try to extend FtpWebRequest to another class overriding Method property to another implementation with no validation, but FtpWebRequest it’s a sealed class and I can’t do it. WebRequestMethods.Ftp it’s a static class and it’s compiled in dll library, only I can see the metadata in C#, that means I can’t extend and I can’t modify it to add GET method.
The question is: ¿How can I retrieve a file using FTP with GET command?
Thank you in advance!!
Mark.
QuestionUsagemembershelby6721 Aug '11 - 11:14 
Can I use this free of charge and with no royalties?
Thanks, Shelby
QuestionRunning without .NET framework ?memberaces2723 Jul '11 - 21:20 
Hi ,
 
Thanks for your great contribution with this article.
Any suggestions , if we can without .NET framework.
 
Well , In ways please recommend the best method to get about running this.
Installing .NET framework quietly.
Issues : Size is quite big , bundling them together for a silent install.
GeneralWow :omg:memberwertyk13 May '11 - 2:55 
Its very nice code, thanks!!!Thumbs Up | :thumbsup:
GeneralUploading encoded FLV video file using FTPmemberMember 362232022 Feb '11 - 19:36 
Hi Habeeb,
 
Thanks for the great work.. keep it up!!!!
 
For one of my project requirement I need to upload encoded FLV file over FTP.
 
Can it be done, can you please send me if you have implemented some thing like this.
 
Reply me ASAP
 
Thanks in advance
-Dam
damodar.puttur@gmail.com
GeneralGreat CodememberCarlBenton20 Feb '11 - 12:07 
Hey, thank you for the excellent article. I was able to use the majority of the upload code to complete my ftp file upload in my application. Thank you heaps!
GeneralInfo change dirmemberAlexB4712 Feb '11 - 7:51 
Hi,
is possible to change Dir after connection?
Example, please.
 
Best Regards.
Alex
Alex

GeneralRe: Info change dirmemberLakhan Pal Garg9 Oct '11 - 21:36 
if you find the solution of how to change directory, then can you please share the same.
My Problem is my current Default Directory is : /Go.$Dataw1.SVMannet but i want to upload file in /GO.$DATA72.CLEVDATA Folder.
 
But i don't know how i can change the directory. from Command prompt it is working fine using CD.
 
Thanks,
Lakhan Pal
Thanks & Regards
Lakhan Pal Garg
Free Code Snippets

QuestionProblem with Uploadmemberssanoj17 Jan '11 - 23:37 
Hi,
 
I'm trying to upload a file using the Upload example and I'm getting an exception after a few calls to strm.Write(buff, 0, contentLen);
 
The exception I get is "Unable to write data to the transport connection: An established connection was aborted by the software in your host machine."
 
The file is created on the remote site but it has a size of 0 kb.
 
Does anyone know why I get this error?
 
Br, Jonas

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 17 Jan 2007
Article Copyright 2007 by Mohammed Habeeb
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid