此代码非原创,很早前从百度上搜索的,如有侵权,请联系我删除
/// <summary>
/// FTP 文件操作帮助类
/// </summary>
public class FtpFileHelper
{
/// <summary>
/// 上传文件
/// </summary>
/// <param name="fileinfo">需要上传的文件</param>
/// <param name="targetDir">目标路径</param>
/// <param name="hostname">ftp地址</param>
/// <param name="username">ftp用户名</param>
/// <param name="password">ftp密码</param>
/// <param name="fileName"> 上传后重命名</param>
public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password,string fileName)
{
//check target
if (string.IsNullOrEmpty(targetDir))
{
return;
}
//文件夹不存在,创建文件夹
var isExist = ftpIsExistsFile(targetDir, hostname, username, password);
if (!isExist)
{
MakeDir(targetDir, hostname, username, password);
}
string target = fileName;
string uri = "FTP://" + hostname + "/" + targetDir + "/" + target;
var ftp = GetRequest(uri, username, password);
//设置FTP命令 设置所要执行的FTP命令,
ftp.Method = WebRequestMethods.Ftp.UploadFile;
//指定文件传输的数据类型
ftp.UseBinary = true;
ftp.UsePassive = true;
//告诉ftp文件大小
ftp.ContentLength = fileinfo.Length;
//缓冲大小设置为2KB
const int BufferSize = 2048;
byte[] content = new byte[BufferSize];
int dataRead;
//读取上传的文件
using (FileStream fs = fileinfo.OpenRead())
{
try
{
//把上传的文件写入流
using (Stream rs = ftp.GetRequestStream())
{
do
{
//每次读文件流的2KB
dataRead = fs.Read(content, 0, BufferSize);
rs.Write(content, 0, dataRead);
} while (!(dataRead < BufferSize));
rs.Close();
}
}
catch (Exception ex)
{
}
finally
{
fs.Close();
}
}
// 日志
ftp = null;
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="localDir">下载至本地路径</param>
/// <param name="FtpDir">ftp目标文件路径</param>
/// <param name="FtpFile">从ftp要下载的文件名</param>
/// <param name="hostname">ftp地址即IP</param>
/// <param name="username">ftp用户名</param>
/// <param name="password">ftp密码</param>
public static void DownloadFile(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password)
{
string uri = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile;
string tmpname = Guid.NewGuid().ToString();
string localfile = localDir + @"\\" + tmpname;
FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.DownloadFile;
ftp.UseBinary = true;
ftp.UsePassive = false;
using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
//loop to read & write to file
using (var fs = new FileStream(localfile, FileMode.CreateNew))
{
try
{
byte[] buffer = new byte[2048];
int read = 0;
do
{
read = responseStream.Read(buffer, 0, buffer.Length);
fs.Write(buffer, 0, read);
} while (read != 0);
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
File.Delete(localfile);
throw;
}
}
responseStream.Close();
}
response.Close();
}
try
{
File.Delete(localDir + @"\\" + FtpFile);
File.Move(localfile, localDir + @"\\" + FtpFile);
ftp = null;
ftp = GetRequest(uri, username, password);
ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile;
ftp.GetResponse();
}
catch (Exception ex)
{
File.Delete(localfile);
throw ex;
}
ftp = null;
}
/// <summary>
/// 搜索远程文件
/// </summary>
/// <param name="targetDir"></param>
/// <param name="hostname"></param>
/// <param name="username"></param>
/// <param name="password"></param>
/// <param name="SearchPattern"></param>
/// <returns></returns>
public static List<string> ListDirectory(string targetDir, string hostname, string username, string password, string SearchPattern)
{
var result = new List<string>();
try
{
string URI = "FTP://" + hostname + "/" + targetDir + "/" + SearchPattern;
System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory;
ftp.UsePassive = true;
ftp.UseBinary = true;
string str = GetStringResponse(ftp);
str = str.Replace("\r\n", "\r").TrimEnd('\r');
str = str.Replace("\n", "\r");
if (str != string.Empty)
result.AddRange(str.Split('\r'));
return result;
}
catch
{
}
return null;
}
private static string GetStringResponse(FtpWebRequest ftp)
{
//Get the result, streaming to a string
string result = "";
using (var response = (FtpWebResponse)ftp.GetResponse())
{
long size = response.ContentLength;
using (Stream datastream = response.GetResponseStream())
{
if (datastream != null)
{
using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default))
{
result = sr.ReadToEnd();
sr.Close();
}
datastream.Close();
}
}
response.Close();
}
return result;
}
/// <summary>
/// 在ftp服务器上创建目录
/// </summary>
/// <param name="dirName">创建的目录名称</param>
/// <param name="ftpHostIP">ftp地址</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public static void MakeDir(string dirName, string ftpHostIP, string username, string password)
{
try
{
string uri = "ftp://" + ftpHostIP + "/" + dirName;
FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
}
}
/// <summary>
/// 在ftp服务器上创建目录
/// </summary>
/// <param name="path">创建的目录名称</param>
/// <param name="ftpHostIP">ftp地址</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public static bool MakeDirStep(string path, string ftpHostIP, string username, string password)
{
var result = false;
try
{
var dirs = path.Split('/');
for (int i = 0; i < dirs.Length; i++)
{
var dirName = "";
for (int j = 0; j <= i; j++)
{
dirName += dirs[j] + "/";
}
dirName = dirName.TrimEnd('/');
//建立连接
if (!ftpIsExistsFile(dirName, ftpHostIP, username, password))
{
string uri = "ftp://" + ftpHostIP + "/" + dirName;
FtpWebRequest request = GetRequest(uri, username, password);
request.Method = WebRequestMethods.Ftp.MakeDirectory;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
result = true;
}
}
}
}
catch (Exception e)
{
result = false;
throw;
}
return result;
}
/// <summary>
/// 删除目录
/// </summary>
/// <param name="dirName">创建的目录名称</param>
/// <param name="ftpHostIP">ftp地址</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public void DelDir(string dirName, string ftpHostIP, string username, string password)
{
try
{
string uri = "ftp://" + ftpHostIP + "/" + dirName;
FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 文件重命名
/// </summary>
/// <param name="currentFilename">当前目录名称</param>
/// <param name="newFilename">重命名目录名称</param>
/// <param name="ftpServerIP">ftp地址</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public void Rename(string currentFilename, string newFilename, string ftpServerIP, string username, string password)
{
try
{
FileInfo fileInf = new FileInfo(currentFilename);
string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.Rename;
ftp.RenameTo = newFilename;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
}
}
private static FtpWebRequest GetRequest(string URI, string username, string password)
{
//根据服务器信息FtpWebRequest创建类的对象
FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
//提供身份验证信息
result.Credentials = new System.Net.NetworkCredential(username, password);
result.EnableSsl = true;
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(ValidateServerCertificate);
//设置请求完成之后是否保持到FTP服务器的控制连接,默认值为true
result.KeepAlive = false;
return result;
}
public static bool ValidateServerCertificate
(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
/// <summary>
/// 判断ftp服务器上该目录是否存在
/// </summary>
/// <param name="dirName"></param>
/// <param name="ftpHostIP"></param>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns></returns>
private static bool ftpIsExistsFile(string dirName, string ftpHostIP, string username, string password)
{
bool flag = true;
try
{
string uri = "ftp://" + ftpHostIP + "/" + dirName;
FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception ex)
{
flag = false;
}
return flag;
}
}