ftp in c#

Upload: satyabrota-das

Post on 03-Apr-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/28/2019 FTP in C#

    1/7

    Introduction

    An addition to the Microsoft .NET framework 2.0 to 1.x is the support for FTP. Earlier, you had to rely on third party libraries thatpretty well suited most of your needs, but for sure, there is an extra pleasure using the .NET framework library classes. The code

    included is not designed to be a full-fledged reusable library, but rather an easy to use and reusable piece of code that is easilycomprehensible and can be reused and tweaked to fit your specific needs. Therefore, the code for each functionality (upload,

    download, delete, and so forth) can be easily picked up separately and reused. The main motive behind this article was the

    unavailability of .NET 2.0 FTP sample codes and their usage in C#, maybe because it's a new entrant to the .NET scenario, or the third

    party implementations available were working pretty well, that this area of the .NET 2.0 library hasn't gotten 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:

    1. using System.Net;2. using System.IO;

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

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

  • 7/28/2019 FTP in C#

    2/7

  • 7/28/2019 FTP in C#

    3/7

    4. string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;5. FtpWebRequest reqFTP;6.7. // Create FtpWebRequest object from the Uri provided8. reqFTP = (FtpWebRequest)FtpWebRequest.Create9. (new Uri("ftp://" + ftpServerIP + "/" + fileInf.Name));10.11. // Provide the WebPermission Credintials12. reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);13.14. // By default KeepAlive is true, where the control connection15. // is not closed after a command is executed.16. reqFTP.KeepAlive = false;17.18. // Specify the command to be executed.19. reqFTP.Method = WebRequestMethods.Ftp.UploadFile;20.21. // Specify the data transfer type.22. reqFTP.UseBinary = true;23.24. // Notify the server about the size of the uploaded file25. reqFTP.ContentLength = fileInf.Length;26.27. // The buffer size is set to 2kb28. int buffLength = 2048;29. byte[] buff = new byte[buffLength];30. int contentLen;31.32. // Opens a file stream (System.IO.FileStream) to read the file33. // to be uploaded34. FileStream fs = fileInf.OpenRead();35.36. try37. {38. // Stream to which the file to be upload is written39. Stream strm = reqFTP.GetRequestStream();40.41. // Read from the file stream 2kb at a time42. contentLen = fs.Read(buff, 0, buffLength);43.44. // Till Stream content ends

  • 7/28/2019 FTP in C#

    4/7

    45. while (contentLen != 0)46. {47. // Write Content from the file stream to the FTP Upload48. // Stream49. strm.Write(buff, 0, contentLen);50. contentLen = fs.Read(buff, 0, buffLength);51. }52.53. // Close the file stream and the Request Stream54. strm.Close();55. fs.Close();56. }57. catch(Exception ex)58. {59. MessageBox.Show(ex.Message, "Upload Error");60. }61. }

    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, and ContentLength.

    The file in your local machine is opened and the contents are written to the FTP request stream. Here, a 2Kb buffer is used as an

    appropriate size suited for upload of larger or smaller files.

    1. private void Download(string filePath, string fileName)2. {3. FtpWebRequest reqFTP;4. try5.

    {

    6. //filePath: The full path where the file is to be created.7. //fileName: Name of the file to be createdNeed not name on8. // the FTP server. name name()9. FileStream outputStream = new FileStream(filePath + "\\" +10. fileName, FileMode.Create);11.12. reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"13. + ftpServerIP + "/" + fileName));14. reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;

  • 7/28/2019 FTP in C#

    5/7

    15. reqFTP.UseBinary = true;16. reqFTP.Credentials = new NetworkCredential(ftpUserID,17. ftpPassword);18. FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();19. Stream ftpStream = response.GetResponseStream();20. long cl = response.ContentLength;21. int bufferSize = 2048;22. int readCount;23. byte[] buffer = new byte[bufferSize];24.25. readCount = ftpStream.Read(buffer, 0, bufferSize);26. while (readCount > 0)27. {28. outputStream.Write(buffer, 0, readCount);29. readCount = ftpStream.Read(buffer, 0, bufferSize);30. }31.32. ftpStream.Close();33. outputStream.Close();34. response.Close();35. }36. catch (Exception ex)37. {38. MessageBox.Show(ex.Message);39. }40. }

    Above is a sample code to download a 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 that in turn is used to create the FtpWebRequest object. To 'GET' the filerequested, get the response of the FtpWebRequest object using the GetResponse() method. This new response object built provides

    the response stream that contains the file content as stream, which you can easily convert to a file stream to get the file in place.

    Note: You have the flexibility to set the location and name of the file under which it is to be saved on your local machine.

    1. public string[] GetFileList()2. {

  • 7/28/2019 FTP in C#

    6/7

    3. string[] downloadFiles;4. StringBuilder result = new StringBuilder();5. FtpWebRequest reqFTP;6. try7. {8. reqFTP = (FtpWebRequest)FtpWebRequest.Create9. (new Uri("ftp://" + ftpServerIP + "/"));10. reqFTP.UseBinary = true;11. reqFTP.Credentials = new NetworkCredential(ftpUserID,12. ftpPassword);13. reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;14. WebResponse response = reqFTP.GetResponse();15. StreamReader reader = new16. StreamReader(response.GetResponseStream());17.18. string line = reader.ReadLine();19. while (line != null)20. {21. result.Append(line);22. result.Append("\n");23. line = reader.ReadLine();24. }25. // to remove the trailing '\n'26. result.Remove(result.ToString().LastIndexOf('\n'), 1);27. reader.Close();28. response.Close();29. return result.ToString().Split('\n');30. }31. catch (Exception ex)32. {33. System.Windows.Forms.MessageBox.Show(ex.Message);34. downloadFiles = null;35. return downloadFiles;36. }37. }

    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 to create the FtpWebRequest object. Here, the response

    stream is used to create 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) by using theReadToEnd()

    method of the

  • 7/28/2019 FTP in C#

    7/7

    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 string 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 .ReadToEnd())) and split the resultantstring using an '\n' delimiter. Anyway, I didn't want to spend more of my energy and time pondering over it.

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

    Note: For Renaming, the new name can be assigned to the RenameTo property of the 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 tothe 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 setEnableSsl 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 downloadedfrom the server. That is,

    o The StatusCode property of the FtpWebResponse object provides the latest status code returned by the FTP server.o The StatusDescription property of the FtpWebResponse object provides the description of the status code returned.