Blue Theme Orange Theme Green Theme Red Theme
 
Home | Forums | Videos | Photos | Downloads | Blogs | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Login Close
User Id:
Password:
 
Forgot Password
Forgot Username
Why Register
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
 Resources  
Close
 Our Network  
Close
Search :       Advanced Search »
Home » General » Simple FTP demo application using C#.Net 2.0

Simple FTP demo application using C#.Net 2.0

An article to demonstrate common FTP functionalities using C#.Net 2.0

Total page views :  77633
Total downloads :  2163
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
Download Files:
SimpleFTP2.0_src.zip
 
Become a Sponsor


MindCracker Certification

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 using '\n' delimiter. Anyway I did not 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.


Login to add your contents and source code to this article
 About the author
 
Mohammed Habeeb
Mohammed Habeeb works as a software developer for an India based CMMI L5 Business Solutions Provider InApp Information Technologies situated at technopark. 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 MS technologies especially the .NET Platform. He is an active member of Microsoft user group, Cochin since 2004. He has a strong passion for science and technology. His other interests include travelling, driving, photography, stamps and coin collection.
Looking for C# Consulting?
C# Consulting is founded in 2002 by the founders of C# Corner. Unlike a traditional consulting company, our consultants are well-known experts in .NET and many of them are MVPs, authors, and trainers. We specialize in Microsoft .NET development and utilize Agile Development and Extreme Programming practices to provide fast pace quick turnaround results. Our software development model is a mix of Agile Development, traditional SDLC, and Waterfall models.
Click here to learn more about C# Consulting.
 
Introducing MaxV - one click. infinite control. Hyper-V Hosting from MaximumASP.
Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Dynamic PDF
ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
Go.NET
Build custom interactive diagrams, network, workflow editors, flowcharts, or software design tools. Includes many predefined kinds of nodes, links, and basic shapes. Supports layers, scrolling, zooming, selection, drag-and-drop, clipboard, in-place editing, tooltips, grids, printing, overview window, palette. 100% implemented in C# as a managed .NET Control. Document/View/Tool architecture with many properties&events. Optional automatic layout.
Dundas Software
Dundas Chart for .NET is the most advanced .NET charting package available today.  With an extremely complete feature set, elegant architecture and easy implementation, Dundas Chart can quickly add advanced Charting functionality to enhance and transform ASP.NET and Windows Forms applications.  Whether you are implementing charting into internal projects, or building applications for clients, Dundas Chart offers advanced technology and advanced results to get the most out of data.
Clickatell's SMS Gateway
Clickatell's Developer Solutions allow you to SMS enable any website or application via a range of API's. Learn More about our API connections.
Free access to .NET Memory Management video
Everything you need to know about Garbage Collection, Temporary Objects, Fragmentation, Finalization and common causes of memory leaks in .NET. Watch the video here.
Nevron Chart for .NET 2010.1 Now Available
The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
 
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
Download Files:
SimpleFTP2.0_src.zip
 
 Post a Feedback, Comment, or Question about this article
Subject:  
Comment:  
Become a Sponsor
 Comments
Need more clarity by Aniruddha On March 2, 2007
Great!!! I want to be more clear on how to upload files from a specific folder? Can you provide some working examples? Thnx. Aniruddha
Reply | Email | Delete | Modify | 
Compact Framework by Jeroen On January 31, 2008
Hello mr. Habeeb, I have a question. Your program/code does exactly do what I want. But the only problem is I need to do this for a PPC. So I need to use the compact framework. Do you know if, and if so, how this is possible? Hope it works and thank you for your time Jeroen
Reply | Email | Delete | Modify | 
Problem by Abdallah On February 12, 2008
Thanks for program. but when i click GetFileDetails Button I see Html tages in list box whats problem
Reply | Email | Delete | Modify | 
Re: Problem by Jose Camilo On June 5, 2009
Have you get the solution to this?.
I'm also trying to list the files in ftp server, but i keep getting HTML tags.
thanks in advance.
Reply | Email | Delete | Modify | 
Port by Ignacio Martin On October 1, 2008
It's a great code. but I have a problem because, I've to upload a file but my ftp server has a particular Prort so, how can I especify the ftp port?
Reply | Email | Delete | Modify | 
Re: Port by Ignacio Martin On November 7, 2008
You could insert the port before the ftpserver like: string uri = Seteos.GetString("FtpServidor");(for example "FTPServidor =ftp:\\contoso.com" ) uri = uri + ":" seteos.GetString("FtpPuerto").ToString()+"/Carpeta/" + archivo.ToString(); It Works in an aplication web form, bnut i have some troubles in a service mode.
Reply | Email | Delete | Modify | 
Re: Re: Port by d On May 15, 2009
can you provide the code in service mode?
thanks!
Reply | Email | Delete | Modify | 
how can i achive this in asp.net webapplications?? is this possible? by rathankumar On December 11, 2008
how can i achive this in asp.net webapplications?? is this possible?
Reply | Email | Delete | Modify | 
Problem getting the list directory. by Jose Camilo On June 5, 2009
Hi Mohammed, your articule is really good... Thanks, but i have one issue when trying to uses the code for getting the directory list.  it is returned with a bunch of html tags, do you know how can i eliminate this tag, so i can show only the files name and extention.

Thanks in advance.
Reply | Email | Delete | Modify | 
help needed by brinda On October 25, 2009
hi .. i'm trying to upload a file to an ftp server from an application that is deployed online. this code works fine if it is from my localhost but if its deployed online then i get an error "System.IO.FileNotFoundException: Could not find file" .  It seems to be looking at the server side for the folder to be uploaded. how can i point to the client machine folder?
Reply | Email | Delete | Modify | 

 Hosted by MaximumASP  |  Found a broken link?  |  Contact Us  |  Terms & conditions  |  Privacy Policy  |  Site Map  |  Suggest an Idea  |  Media Kit
Current Version: 5.2009.6.2
 © 1999 - 2010  Mindcracker LLC. All Rights Reserved