Skip to content

Instantly share code, notes, and snippets.

@smarenich
Created August 10, 2016 09:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smarenich/86242fc5387dfec05dc9ce3d77978587 to your computer and use it in GitHub Desktop.
Save smarenich/86242fc5387dfec05dc9ce3d77978587 to your computer and use it in GitHub Desktop.
#region FTPFileExchange
[System.Net.WebPermission(System.Security.Permissions.SecurityAction.Assert, Unrestricted = true)]
public class FTPFileExchange : BaseFileExchange, IFileExchange
{
public String Name { get { return Messages.ExchangeFTP; } }
public String Code { get { return Codes.ExchangeFTPCode; } }
public FTPFileExchange(String login, String password)
: base(login, password)
{ }
private FtpWebRequest GetFTPRequest(String path, String method, Boolean isFolder)
{
// Create FtpWebRequest object from the Uri provided
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(GetFileUri(path, isFolder));
if (_creds != null) request.Credentials = _creds;
request.KeepAlive = false;
request.UseBinary = true;
// Specify the command to be executed.
request.Method = method;
return request;
}
private Uri GetFileUri(String path, Boolean isFolder)
{
StringBuilder sb = new StringBuilder(path);
sb = sb.Replace("\\", "/");
if (!path.StartsWithCollation("ftp")) sb = sb.Insert(0, "ftp://");
if (isFolder && !path.EndsWithCollation("/")) sb = sb.Append("/");
return new Uri(sb.ToString());
}
public override ExternalFileInfo GetInfo(String path)
{
ExternalFileInfo result = new ExternalFileInfo(System.IO.Path.GetFileName(path));
result.FullName = path;
result.Date = GetTimeStamp(result.FullName);
return result;
}
public override IEnumerable<ExternalFileInfo> ListFiles(String path)
{
List<ExternalFileInfo> files = new List<ExternalFileInfo>();
FtpWebRequest request = GetFTPRequest(path, WebRequestMethods.Ftp.ListDirectoryDetails, true);
using (WebResponse response = request.GetResponse())
{
String line = null;
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
while ((line = reader.ReadLine()) != null)
{
ExternalFileInfo result = RegExpHelper.ParseFtpLine(line);
if (result == null) continue;
result.FullName = new Uri(path.EndsWith("/") ? new Uri(path) : new Uri(path + "/"), result.Name).ToString();
result.Date = GetTimeStamp(result.FullName);
files.Add(result);
}
}
}
return files;
}
public override Stream UploadStream(String path)
{
FtpWebRequest request = GetFTPRequest(path, WebRequestMethods.Ftp.UploadFile, false);
Stream stream = request.GetRequestStream();
return stream;
}
public override Stream DownloadStream(String path)
{
FtpWebRequest request = GetFTPRequest(path, WebRequestMethods.Ftp.DownloadFile, false);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
return stream;
}
private DateTime GetTimeStamp(String path)
{
FtpWebRequest request = GetFTPRequest(path, WebRequestMethods.Ftp.GetDateTimestamp, false);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
string dateString = response.StatusDescription.Substring(4,14);
return DateTime.ParseExact(dateString, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat);
}
}
}
#endregion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment