网上找了好多,感觉还是自己这个使用起来方便点,记录一下!

 using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Net;
using System.Text; namespace FtpTest.Common
{ public class FtpHelper
{
private readonly string _ftpUri; //ftp服务器地址
private readonly string _ftpName; //ftp帐户
private readonly string _ftpPwd; //ftp密码
private FtpWebRequest _ftpRequest; //请求
private FtpWebResponse _ftpResponse; //响应 public FtpHelper(string uri, string name, string password)
{
_ftpUri = uri;
_ftpName = name;
_ftpPwd = password;
} /// <summary>
/// 连接类
/// </summary>
/// <param name="uri">ftp地址</param>
private void Conn(string uri)
{
_ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
//登录ftp服务器,ftpName:账户名,ftpPwd:密码
_ftpRequest.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
_ftpRequest.UseBinary = true; //该值指定文件传输的数据类型。
} /// <summary>
/// 删除文件
/// </summary>
/// <param name="fileName">文件名</param>
public void DeleteFileName(string fileName)
{
string uri = _ftpUri + "/" + fileName;
Conn(uri);
try
{
_ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
_ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse();
_ftpResponse.Close();
}
catch (Exception)
{
// ignored
}
} /// <summary>
/// 删除ftp上目录
/// </summary>
/// <param name="dirName"></param>
public void RemoveDir(string dirName)
{
string uri = _ftpUri + "/" + dirName;
Conn(uri);
try
{
_ftpRequest.Method = WebRequestMethods.Ftp.RemoveDirectory;
_ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse();
_ftpResponse.Close();
}
catch (Exception)
{
// ignored
}
} /// <summary>
/// 上传文件,使用FTPWebRequest、FTPWebResponse实例
/// </summary>
/// <param name="uri">ftp地址</param>
/// <param name="fileName">文件名</param>
/// <param name="fileData">文件内容</param>
/// <param name="msg">传出参数,返回传输结果</param>
public void UploadFile(string uri, string fileName, byte[] fileData, out string msg)
{
string ftpUri = uri.EndsWith("/") ? uri : uri + "/";
ftpUri += fileName;
//连接ftp服务器
Conn(ftpUri);
_ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
_ftpRequest.ContentLength = fileData.Length; //上传文件时通知服务器文件的大小
try
{
//将文件流中的数据(byte[] fileData)写入请求流
using (Stream ftpstream = _ftpRequest.GetRequestStream())
{
ftpstream.Write(fileData, , fileData.Length);
} _ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse(); //响应
msg = _ftpResponse.StatusDescription; //响应状态
_ftpResponse.Close();
}
catch (Exception exp)
{
msg = "Failed to upload:" + exp.Message;
}
} /// <summary>
/// 上传文件,使用WebClient类
/// </summary>
/// <param name="uri">ftp地址</param>
/// <param name="fileName">文件名</param>
/// <param name="fileData">文件内容</param>
/// <param name="msg">传出参数,输出传输结果</param>
public void UploadFileByWebClient(string uri, string fileName, byte[] fileData, out string msg)
{
string ftpUri = uri.EndsWith("/") ? uri : uri + "/";
ftpUri += fileName; try
{
WebClient client = new WebClient { Credentials = new NetworkCredential(_ftpName, _ftpPwd) };
//登录FTP服务
client.UploadData(ftpUri, "STOR", fileData); //指定为ftp上传方式
msg = "上传成功!";
}
catch (Exception exp)
{
msg = "Failed to upload:" + exp.Message;
}
} /// <summary>
/// 下载文件,使用FTPWebRequest、FTPWebResponse实例
/// </summary>
/// <param name="uri">ftp地址</param>
/// <param name="destinationDir">目标文件存放地址</param>
/// <param name="msg">传出参数,返回传输结果</param>
public void DownloadFile(string uri, string destinationDir, out string msg)
{
string fileName = Path.GetFileName(uri);
// ReSharper disable once AssignNullToNotNullAttribute
string destinationPath = Path.Combine(destinationDir, fileName); try
{
//连接ftp服务器
Conn(uri); using (FileStream outputStream = new FileStream(destinationPath, FileMode.OpenOrCreate))
{
using (_ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse())
{
//将响应流中的数据写入到文件流
using (Stream ftpStream = _ftpResponse.GetResponseStream())
{
int bufferSize = ;
byte[] buffer = new byte[bufferSize];
if (ftpStream != null)
{
var readCount = ftpStream.Read(buffer, , bufferSize);
while (readCount > )
{
outputStream.Write(buffer, , readCount);
readCount = ftpStream.Read(buffer, , bufferSize);
}
}
}
msg = _ftpResponse.StatusDescription;
}
}
}
catch (Exception exp)
{
msg = "Failed to download:" + exp.Message;
}
} public byte[] DownloadFile()
{
try
{
WebClient client = new WebClient { Credentials = new NetworkCredential(_ftpName, _ftpPwd) };
byte[] responseData = client.DownloadData(_ftpUri);
return responseData;
}
catch (Exception ex)
{
// ReSharper disable once PossibleIntendedRethrow
throw ex;
}
} /// <summary>
/// 文件下载,使用WebClient类
/// </summary>
/// <param name="uri">ftp服务地址</param>
/// <param name="destinationDir">存放目录</param>
public void DownloadFileByWebClient(string uri, string destinationDir)
{
string fileName = Path.GetFileName(uri);
// ReSharper disable once AssignNullToNotNullAttribute
string destinationPath = Path.Combine(destinationDir, fileName); try
{
WebClient client = new WebClient { Credentials = new NetworkCredential(_ftpName, _ftpPwd) }; byte[] responseData = client.DownloadData(uri); using (FileStream fileStream = new FileStream(destinationPath, FileMode.OpenOrCreate))
{
fileStream.Write(responseData, , responseData.Length);
}
}
catch (Exception)
{
// ignored
}
} /// <summary>
/// 遍历文件
/// </summary>
public ArrayList GetListDirectoryDetails()
{
ArrayList fileInfo = new ArrayList();
try
{
Conn(_ftpUri); //获取 FTP 服务器上的文件的详细列表的 FTP LIST 协议方法
_ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
try
{
_ftpResponse = (FtpWebResponse)_ftpRequest.GetResponse(); //响应
}
catch (WebException)
{
}
catch (InvalidOperationException)
{
} using (Stream responseStream = _ftpResponse.GetResponseStream())
{
// ReSharper disable once AssignNullToNotNullAttribute
using (StreamReader reader = new StreamReader(responseStream))
{
string line = reader.ReadLine();
while (line != null)
{
fileInfo.Add(line);
line = reader.ReadLine();
}
}
}
}
catch (Exception)
{
// ignored
} return fileInfo;
} /// <summary>
/// 上传图片
/// </summary>
/// <param name="mstr"></param>
/// <param name="ftpUri"></param>
/// <returns></returns>
public bool Upload(MemoryStream mstr, string ftpUri)
{
try
{
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(ftpUri);
ftp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
ftp.Method = WebRequestMethods.Ftp.UploadFile;
ftp.UseBinary = true;
ftp.UsePassive = true;
using (Stream stream = ftp.GetRequestStream())
{
byte[] bytes = mstr.ToArray();
stream.Write(bytes, , bytes.Length);
stream.Close();
mstr.Close();
}
return true;
}
catch (Exception)
{
return false;
}
} public bool Upload(byte[] mstr, string ftpUri)
{
try
{
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(ftpUri);
ftp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
ftp.Method = WebRequestMethods.Ftp.UploadFile;
ftp.UseBinary = true;
ftp.UsePassive = true;
using (Stream stream = ftp.GetRequestStream())
{
stream.Write(mstr, , mstr.Length);
stream.Close();
}
return true;
}
catch (Exception)
{
return false;
}
} /// <summary>
/// 重命名文件
/// </summary>
/// <param name="fileName">原文件名</param>
/// <param name="reNameFileName">新文件名</param>
public bool RenameFileName(string fileName, string reNameFileName)
{
bool result = true;
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(reNameFileName);
ftp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
try
{
ftp.Method = WebRequestMethods.Ftp.Rename;
ftp.RenameTo = fileName;
ftp.UseBinary = true;
ftp.UsePassive = true;
_ftpResponse = (FtpWebResponse)ftp.GetResponse();
Stream ftpStream = _ftpResponse.GetResponseStream();
// ReSharper disable once PossibleNullReferenceException
ftpStream.Close();
_ftpResponse.Close();
}
catch (Exception)
{
result = false;
} return result;
} /// <summary>
/// 删除文件
/// </summary>
/// <param name="fileName">文件名</param>
public bool DeleteFile(string fileName)
{
bool result = true;
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(fileName);
ftp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
try
{
ftp.Method = WebRequestMethods.Ftp.DeleteFile;
ftp.UseBinary = true;
ftp.UsePassive = true;
_ftpResponse = (FtpWebResponse)ftp.GetResponse();
Stream ftpStream = _ftpResponse.GetResponseStream();
// ReSharper disable once PossibleNullReferenceException
ftpStream.Close();
_ftpResponse.Close();
}
catch (Exception)
{
result = false;
} return result;
} /// <summary>
/// 创建目录
/// </summary>
/// <param name="dri"></param>
/// <returns></returns>
public bool FtpMakeDir(string dri)
{
FtpWebRequest req = (FtpWebRequest)WebRequest.Create(dri);
req.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
req.Method = WebRequestMethods.Ftp.MakeDirectory;
try
{
FtpWebResponse response = (FtpWebResponse)req.GetResponse();
response.Close();
}
catch (Exception)
{
req.Abort();
return false;
}
req.Abort();
return true;
} /// <summary>
/// 创建多级目录
/// </summary>
/// <param name="ftppath">目录,例如:/aaa/bbb/ccc </param>
public bool FtpMakeDirs(string ftppath)
{
string targetPath = _ftpUri;
var pathArray = ftppath.Split('/'); try
{
//遍历判断文件夹是否存在
foreach (var path in pathArray)
{
if (!string.IsNullOrEmpty(path.Trim()))
{
//不存在此层文件夹
if (!DirectoryExist(targetPath, path))
FtpMakeDir(targetPath + "/" + path); targetPath += "/" + path;
}
}
}
catch (Exception)
{
return false;
} return true;
} /// <summary>
/// 下载
/// </summary>
/// <param name="fileName"></param>
public byte[] Download(string fileName)
{
byte[] buffer = null;
try
{
// ReSharper disable once AccessToStaticMemberViaDerivedType
var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(_ftpUri + "/" + fileName));
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse();
Stream ftpStream = response.GetResponseStream();
int bufferSize = ; //Convert.ToInt32(GetFileSize(fileName)) + 51200;//
buffer = new byte[bufferSize];
// ReSharper disable once PossibleNullReferenceException
var readCount = ftpStream.Read(buffer, , bufferSize); while (readCount > )
{
readCount = ftpStream.Read(buffer, , bufferSize);
}
ftpStream.Close();
response.Close();
}
catch (Exception)
{
// ignored
} return buffer;
} /// <summary>
/// 获取当前目录下明细(包含文件和文件夹)
/// </summary>
/// <returns></returns>
public string[] GetFilesDetailList(string targetPath)
{
var tempftpUri = targetPath; try
{
StringBuilder result = new StringBuilder(); Conn(tempftpUri);
//获取 FTP 服务器上的文件的详细列表的 FTP LIST 协议方法
_ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails; WebResponse response = _ftpRequest.GetResponse();
// ReSharper disable once AssignNullToNotNullAttribute
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine(); while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
} result.Remove(result.ToString().LastIndexOf("\n", StringComparison.Ordinal), );
reader.Close();
response.Close(); return result.ToString().Split('\n');
}
catch (Exception)
{
var downloadFiles = new string[] { };
return downloadFiles;
}
} /// <summary>
/// 获取当前目录下所有的文件夹列表(仅文件夹)
/// </summary>
/// <returns></returns>
public string[] GetDirectoryList(string targetPath)
{
string[] drectory = GetFilesDetailList(targetPath);
string m = "";
if (drectory != null && true & drectory.Any())
{
foreach (string str in drectory)
{
int dirPos = str.IndexOf("<DIR>", StringComparison.Ordinal);
if (dirPos > )
{
/*判断 Windows 风格*/
m += str.Substring(dirPos + ).Trim() + "\n";
}
else if (str.Trim().Substring(, ).ToUpper() == "D")
{
/*判断 Unix 风格*/
string dir = str.Substring().Trim();
if (dir != "." && dir != "..")
{
m += dir + "\n";
}
}
}
}
char[] n = new char[] { '\n' };
return m.Split(n);
} /// <summary>
/// 判断当前目录下指定的子目录是否存在
/// modified at 2015/4/7 修改判断是否存在的方法,以前的方式过于臃肿,还有bug(竟然使用listdetail!)
/// </summary>
/// <param name="targetPath">服务器地址</param>
/// <param name="remoteDirectoryName">指定的目录名</param>
public bool DirectoryExist(string targetPath, string remoteDirectoryName)
{
try
{
var uri = Path.Combine(targetPath, remoteDirectoryName).Replace(@"\", @"/");
Conn(uri);
_ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; using (var response = (FtpWebResponse)_ftpRequest.GetResponse())
// ReSharper disable once AssignNullToNotNullAttribute
// ReSharper disable once UnusedVariable
using (var stream = new StreamReader(response.GetResponseStream()))
{
}
return true;
}
catch (Exception)
{
// ignored
} return false;
} /// <summary>
/// 获取指定文件大小
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public long GetFileSize(string filename)
{
long fileSize = ;
try
{
// ReSharper disable once AccessToStaticMemberViaDerivedType
var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(_ftpUri + "/" + filename)); reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(_ftpName, _ftpPwd); FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse();
Stream ftpStream = response.GetResponseStream();
fileSize = response.ContentLength; // ReSharper disable once PossibleNullReferenceException
ftpStream.Close();
response.Close();
}
catch (Exception)
{
// ignored
} return fileSize;
} /// <summary>
/// 获取当前目录下文件列表(仅文件)
/// </summary>
/// <returns></returns>
public string[] GetFileList(string mask)
{
StringBuilder result = new StringBuilder();
try
{
// ReSharper disable once AccessToStaticMemberViaDerivedType
var reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(_ftpUri));
reqFtp.UseBinary = true;
reqFtp.Credentials = new NetworkCredential(_ftpName, _ftpPwd);
reqFtp.Method = WebRequestMethods.Ftp.ListDirectory;
WebResponse response = reqFtp.GetResponse();
// ReSharper disable once AssignNullToNotNullAttribute
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default); string line = reader.ReadLine();
while (line != null)
{
if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
{
var masks = mask.Substring(, mask.IndexOf("*", StringComparison.Ordinal));
if (line.Substring(, masks.Length) == masks)
{
result.Append(line);
result.Append("\n");
}
}
else
{
result.Append(line);
result.Append("\n");
}
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf('\n'), );
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
{
}
return null;
}
} /// <summary>
/// 判断文件是否存在
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public bool FileExist(string filename)
{
bool result;
WebResponse response = null;
try
{
WebRequest req = WebRequest.Create(filename);
response = req.GetResponse();
result = true;
}
catch (Exception)
{
result = false;
}
finally
{
response?.Close();
} return result;
}
}
}

Test:

1、创建多级目录:

             string targetPath = "ftp://192.168.1.148/";
string ftpUserName = "ftpuser";
string ftpPassword = ""; var path = "1234/1234/1234";
FtpHelper ftpHelper = new FtpHelper(targetPath , ftpUserName, ftpPassword);
try
{
ftpHelper.FtpMakeDirs(path);
}
catch (Exception ex)
{
Console.Write(ex.Message);
}

FtpHelper.cs的更多相关文章

  1. C# 利用FTP自动下载xml文件后利用 FileSystemWatcher 监控目录下文件变化并自动更新数据库

    using FtpLib; using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  2. [C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

    剖析 AssemblyInfo.cs - 了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 ...

  3. Atitit 软件架构方法的进化与演进cs bs soa roa  msa  attilax总结

    Atitit 软件架构方法的进化与演进cs bs soa roa  msa  attilax总结 1.1. 软件体系架构是沿着单机到 CS 架构,再到 BS 的三层架构甚至多层架构逐步发展过来的,关于 ...

  4. 从java文件和CS文件里查询方法使用次数工具

    前几天,领导让我找一下老系统(Java)里getRemoteUser方法都哪个文件用了,package是什么,方法被调用了多少次,当时因为着急,所以,直接人工找的,但是以后要是再出现,人工找就太讨厌了 ...

  5. 关于 WP 开发中.xaml 与.xaml.cs 的关系

    今天我们先来看一下在WP8.1开发中最长见到的几个文件之间的关系.比较论证,在看这个问题之前我们简单看看.NET平台其他两个不同的框架: Windows Forms 先看看Window Forms中的 ...

  6. .net 用户控件ascx.cs注册js脚本代码无效果

    在.net web项目中碰到一个比较奇怪的问题,网上没找到解决方案,先自己mark一下 问题描述: 添加一个用户控件ascx,在后端.cs添加js注册脚本,执行后没有弹出框 注册脚本为: this.P ...

  7. DateHelper.cs日期时间操作辅助类C#

    //==================================================================== //** Copyright © classbao.com ...

  8. 仅用aspx文件实现Ajax调用后台cs程序。(实例)

    仅用aspx文件实现Ajax调用后台cs无刷新程序.(实例) 两个文件:aaa.aspx 和aaa.aspx.cs 一.aaa.aspx <script type="text/java ...

  9. Etw EventSourceProvider_EventsProducer.cs OopConsoleTraceEventListenerMonitor_TraceControllerEventsConsumer.cs

    // EventSourceProvider_EventsProducer.cs /* /r:"D:\Microshaoft.Nuget.Packages\Microsoft.Diagnos ...

随机推荐

  1. php中的访问类型(public,private,protected)

    类型的访问修饰符允许开发人员对类成员的访问进行限制,这是PHP5的新特性.但却是oop语言的一个好的特性.而且大多数的oop语言都已支持此特性.PHP5支持三种访问修饰符: public(公有的,默认 ...

  2. tensorflow lite 之生成 tflite 模型文件

    下载最新的的tensorflow源码. 1.配置 tflite 文件转换所需环境 安装 bazel 编译工具 https://docs.bazel.build/versions/master/inst ...

  3. layui upload 在JS动态加载内容后, 点击按钮无反应

    /** * 根据用户选择的不同规格选项 * 返回 不同的输入框选项 */ function ajaxGetSpecInput2(spec_arr) { var goods_id = $('#goods ...

  4. java都13了, 8的新特性你还没不会用吗

    前言 java13都已经来了,很多同学还停留在使用java5的东西.如果在日常开发中没有使用上java8的一些新特性或者不会用.这篇文章对你可能有帮助. lambda表达式 介绍 lambda表达式是 ...

  5. 怎样查看 MySQL 版本号

    1. 在命令行中直接查看版本号 mysql -V 2. 在 mysql --help 中查找与版本相关的信息 mysql --help | grep Ver 3. 在mysql命令行里面查看版本信息 ...

  6. C#picturebox控件图片以json格式上传java后台保存

    关于winform上传图片到Java后端,保存到数据库,有多种方法,本文主要介绍利用picturebox控件,点击按钮上传图片,将图片转化为base64格式,以json格式上传到Java后台,再从ja ...

  7. zepto学习(一)之click事件和tap事件比较

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap分别 ...

  8. C#学习资料

    http://www.runoob.com/csharp/csharp-delegate.html

  9. RabbitMQ的交换机类型(三)

      RabbitMQ的交换机类型共有四种,是根据其路由过程的不同而划分成的 分别是Direct Exchange(直连交换机), Fanout Exchange(扇型交换机), Topic Excha ...

  10. Python学习记录6-list、tuple、dict、set复习

    数据类型在一门语言中是非常重要的,所以选择再次学习一下加深记忆.本次主要参考了大神廖雪峰的官方网站,非常感谢大神,讲的很清晰,收获很大. 标准数据类型 Number(数字) String(字符串) L ...