using System; using System.IO; using System.Net; namespace AppLimit.CloudComputing.SharpBox.Common.Net.Web.Ftp { internal class FtpService : WebRequestService { /// /// This method creates a directory in the ftp server /// /// /// /// public bool FtpCreateDirectory(string uri, ICredentials credentials) { return PerformSimpleFtpMethod(uri, WebRequestMethodsEx.Ftp.MakeDirectory, credentials); } /// /// This method removes a directory /// /// /// /// public bool FtpDeleteEmptyDirectory(string uri, ICredentials credentials) { return PerformSimpleFtpMethod(uri, WebRequestMethodsEx.Ftp.RemoveDirectory, credentials); } /// /// This method removes an file /// /// /// /// public bool FtpDeleteFile(string uri, ICredentials credentials) { return PerformSimpleFtpMethod(uri, WebRequestMethodsEx.Ftp.DeleteFile, credentials); } public bool FtpRename(string uri, string newNameFullPath, ICredentials credentials) { // create a webrequest var renameRequest = (FtpWebRequest)CreateWebRequest(uri, WebRequestMethodsEx.Ftp.Rename, credentials, false, null); // set the target renameRequest.RenameTo = newNameFullPath; // perform the operation try { //get response but ignore it GetStringResponse(renameRequest); // ok return true; } catch (Exception) { return false; } } protected override WebRequest CreateBasicWebRequest(Uri uri, bool bAllowStreamBuffering) { //create request var result = (FtpWebRequest)WebRequest.Create(uri); //Do not keep alive (stateless mode) result.KeepAlive = false; // go ahead return result; } /// /// Obtains a response stream as a string /// /// current FTP request /// String containing response /// FTP servers typically return strings with CR and /// not CRLF. Use respons.Replace(vbCR, vbCRLF) to convert /// to an MSDOS string private static string GetStringResponse(WebRequest ftp) { //Get the result, streaming to a string string result; using (var response = ftp.GetResponse()) { using (var datastream = response.GetResponseStream()) { using (var sr = new StreamReader(datastream)) { result = sr.ReadToEnd(); sr.Close(); } datastream.Close(); } response.Close(); } return result; } private bool PerformSimpleFtpMethod(string uri, string requestMethod, ICredentials credentials) { // create a webrequest var simpleFTPRequest = CreateWebRequest(uri, requestMethod, credentials, false, null); // perform remove try { //get response but ignore it GetStringResponse(simpleFTPRequest); // ok return true; } catch (Exception) { return false; } } protected override int GetWebResponseStatus(WebResponse response) { if (!(response is FtpWebResponse)) throw new InvalidOperationException("Response is not a FTP reponse"); var resp = (FtpWebResponse)response; return (int)resp.StatusCode; } } }