包装FTPWebRequest类
上篇文章讨论了C#从基于FTPS的FTP server下载数据 (FtpWebRequest 的使用)SSL 加密。不过细心的朋友应该可以发现FTPWebRequest 每次都是新生成一个request ( FTPWebRequest.create(uri) ), 这样对于一些复杂的需求,需要反复登陆,代码就会变得冗余啰嗦,那今天就和大家探讨一下如何包装FTPWebRequest类。如有好的想法或意见,希望各位大神老鸟多多指教。
using System.Collections.Generic;
using System;
using System.Net;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security; namespace FtpClientBlogCase
{ #region "FTP client class"
public class FTPclient
{
#region "CONSTRUCTORS"
public FTPclient(string Hostname, string Username, string Password, bool EnableSSL)
{
this.Hostname = Hostname;
this.Username = Username;
this.Password = Password;
this.EnableSsl = EnableSSL;
}
#endregion #region "Directory functions"
public List<string> ListDirectory(string URI)
{
System.Net.FtpWebRequest ftp = GetRequest(URI);
//Set request to do simple list
ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory; string str = GetStringResponse(ftp);
//replace CRLF to CR, remove last instance
str = str.Replace("\r\n", "\r").TrimEnd('\r');
//split the string into a list
List<string> result = new List<string>();
result.AddRange(str.Split('\r'));
return result;
}
#endregion #region "Download: File transfer FROM ftp server"
/// <summary>
/// Copy a file from FTP server to local
/// </summary>
/// <param name="sourceFilename">Target filename, if required</param>
/// <param name="localFilename">Full path of the local file</param>
/// <returns></returns>
/// <remarks>
/// Target can be blank (use same filename), or just a filename
/// (assumes current directory) or a full path and filename
/// 1.2 [HR] added CreateURI
/// </remarks>
public bool Download(string sourceFilename, string localFilename, bool PermitOverwrite)
{
//2. determine target file
FileInfo fi = new FileInfo(localFilename);
return this.Download(sourceFilename, fi, PermitOverwrite);
} /// <summary>
/// Version taking string/FileInfo
/// </summary>
/// <param name="sourceFilename"></param>
/// <param name="targetFI"></param>
/// <param name="PermitOverwrite"></param>
/// <returns></returns>
public bool Download(string sourceFilename, FileInfo targetFI, bool PermitOverwrite)
{
//1. check target
if (targetFI.Exists && !(PermitOverwrite))
{
throw (new ApplicationException("Target file already exists"));
} //2. check source
if (String.IsNullOrEmpty(sourceFilename))
{
throw (new ApplicationException("File not specified"));
}
System.Net.FtpWebRequest ftp = GetRequest(sourceFilename); //Set request to download a file in binary mode
ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
ftp.UseBinary = true; //open request and get response stream
using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
//loop to read & write to file
responseStream.ReadTimeout = ;
using (FileStream fs = targetFI.OpenWrite())
{
try
{
byte[] buffer = new byte[**];
int read = ;
do
{
read = responseStream.Read(buffer, , buffer.Length);
fs.Write(buffer, , read);
fs.Flush();
} while (read != );
responseStream.Close();
fs.Flush();
fs.Close();
}
catch (Exception)
{
//catch error and delete file only partially downloaded
fs.Close();
//delete target file as it's incomplete
targetFI.Delete();
throw;
}
} responseStream.Close();
} response.Close();
} return true;
} #endregion #region "private supporting fns" //Get the basic FtpWebRequest object with the
//common settings and security
private FtpWebRequest GetRequest(string URI)
{
//create request
FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
//Set the login details
result.Credentials = GetCredentials();
// support for EnableSSL
result.EnableSsl = EnableSsl;
result.Timeout = ; ServicePoint sp = result.ServicePoint;
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(ValidateServerCertificate); return result;
} /// <summary>
/// Ensure chars in path are correctly escaped e.g. #
/// </summary>
/// <param name="path">path to escape</param>
/// <returns></returns>
private string GetEscapedPath(string path)
{
string[] parts;
parts = path.Split('/');
string result;
result = "";
foreach (string part in parts)
{
if (!string.IsNullOrEmpty(part))
result += @"/" + Uri.EscapeDataString(part);
}
return result;
} /// <summary>
/// Get the credentials from username/password
/// </summary>
/// <remarks>
/// Amended to store credentials on first use, for re-use
/// when using KeepAlive=true
/// </remarks>
private System.Net.ICredentials GetCredentials()
{
if (_credentials == null)
_credentials = new System.Net.NetworkCredential(Username, Password);
return _credentials;
} /// <summary>
/// stored credentials
/// </summary>
private System.Net.NetworkCredential _credentials = null; /// <summary>
/// Obtains a response stream as a string
/// </summary>
/// <param name="ftp">current FTP request</param>
/// <returns>String containing response</returns>
/// <remarks>
/// FTP servers typically return strings with CR and
/// not CRLF. Use respons.Replace(vbCR, vbCRLF) to convert
/// to an MSDOS string
/// 1.1: modified to ensure accepts UTF8 encoding
/// </remarks>
private string GetStringResponse(FtpWebRequest ftp)
{
//Get the result, streaming to a string
string result = "";
using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
{
long size = response.ContentLength;
using (Stream datastream = response.GetResponseStream())
{
using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.UTF8))
{
result = sr.ReadToEnd();
sr.Close();
} datastream.Close();
} response.Close();
} return result;
} /// <summary>
/// Gets the size of an FTP request
/// </summary>
/// <param name="ftp"></param>
/// <returns></returns>
/// <remarks></remarks>
private long GetSize(FtpWebRequest ftp)
{
long size;
using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
{
size = response.ContentLength;
response.Close();
} return size;
} private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
} #endregion #region Properties public string Hostname { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public bool EnableSsl { get; set; } #endregion }
#endregion }
FTPClient.cs
using System;
using System.Configuration;
using System.Linq; namespace FtpClientBlogCase
{
class Program
{
static void Main(string[] args)
{
DownloadFileFromFTP.DownloadFileFromNetwork();
Console.WriteLine("Done");
}
} public class DownloadFileFromFTP
{
public static void DownloadFileFromNetwork()
{
var fullDataServer = "XXX";
var userName = "XXX";
var password = "XXX";
var fc = new FTPclient(fullDataServer, userName, password, true);
var list = fc.ListDirectory(fullDataServer);
Console.WriteLine("The file is downloading, please wait...");
fc.Download(fullDataServer + list.Last(), list.Last(), true); }
}
}
Program.cs
在类FTPClient中,private FtpWebRequest GetRequest(string URI) 是最重要的方法,它为每一个功能提供了一个FtpWebRequest对象,避免了每次生成request对象的冗余冗余代码。
包装FTPWebRequest类的更多相关文章
- 【自制工具类】struts返回json数据包装格式类
自己写的一个给struts返回的json数据包装格式类,不喜勿喷,原创,需在项目中引入com.alibaba.fastjson的jar包 先看下效果(这里没有使用msg,有兴趣的往下看): 上demo ...
- java基本类型和包装器类
java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元.但在java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相 ...
- 走近Java之包装器类Integer
前几天,有个同事问了我一个关于Integer类赋值的问题,很有意思,我们一起来看一下(如果有说的不正确的地方,欢迎大家指正). 如上图,同样是赋值,但是两次比较的结果完全不同.我们走近了解一下. 在I ...
- 课堂所讲整理:包装&工具类
package org.hanqi.array; import java.util.Random; public class BaoZhuang { public static void main(S ...
- 用于JS日期格式化,以及简单运算的Date包装工具类
1. [文件] yDate.js/** * | yDate.js | Copyright (c) 2013 yao.yl | email: redrainyi@126.com | Date: 2012 ...
- Python-面向对象(类)一
一.如何创建类 class cls: pass 二.创建方法 构造方法: __init__(self, arg) obj = 类('a1') 普通方法: obj = 类('xxx') obj.普通方法 ...
- Spring源码分析——资源访问利器Resource之实现类分析
今天来分析Spring的资源接口Resource的各个实现类.关于它的接口和抽象类,参见上一篇博文——Spring源码分析——资源访问利器Resource之接口和抽象类分析 一.文件系统资源 File ...
- 在C#中使用C++编写的类
现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...
- Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理
上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象 ...
随机推荐
- 0.0 ABP官方文档翻译目录
一直想学习ABP,但囿于工作比较忙,没有合适的契机,当然最重要的还是自己懒.不知不觉从毕业到参加工作七年了,没留下点儿什么,总感觉很遗憾,所以今天终于卯足劲鼓起勇气开始写博客.有些事能做的很好,但要跟 ...
- (二)java多线程之synchronized
本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kco198 ...
- vim 字符串替换整理
公司项目测试,要在vi编辑其中进行多路径修改,这时候用到了字符串替换的知识,在这里我自己整理了一下. 一.基本内容替换,无特殊符号 :s/old/new/ 替换当前行第一个 old 为 new ...
- IIS发布mvc程序遇到的HTTP错误 403.14-Forbidden解决办法
在IIS上发布MVC应用程序后,在浏览器查看时会报如下图的错误: 这时,我们首先检查一下“处理程序映射”,看一下里面是否有“ExtensionlessUrlHandler-Integrated-4.0 ...
- 【正常向】CODEVS上分黄金
白银上分黄金失败=.= 在之前有很认真的写了一波排序,所以排序并不是很怂,还是那个理,现阶段学习的都是比较简单的排序,都是所谓的冒泡排序啊,桶排序这类,至于插排和选择排序,再往后又是什么快拍就很尬了. ...
- shell中的Mysql查询
1 #!/bin/bash 2 #查询 3 echo -e 4 for i in `cat id.txt` 5 do 6 A=`mysql -h10 -uw -p2012 -Ne "sel ...
- C++随机数rand(), srand()
c++产生随机数会用到rand(), srand()函数,下面总结两个函数特性和使用. 1. rand() #include <iostream> #include <cstdlib ...
- ionic创建项目遇到的各种问题
前提:执行创建语句的前提是ionic环境已经装好,开始执行ionic start myApp blank. 提示已经有同名项目,是否覆盖.这里创建的是一个blank(空) 的ionic项目.还要两种是 ...
- OC—不可变字符串NSString
- hdu4597 Play Game DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 感觉很不错的区间DP,又做了一遍,感觉自己对边界的处理还是很欠缺 代码: #include< ...