您的位置:首页 > 编程语言 > C#

c#一个FTP操作封装类FTPHelper

2017-02-27 15:34 330 查看
参考了网上一些代码,作了一些调整优化。

[csharp] view plain copy

print?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net;

using System.IO;

public class FTPHelper

{

/// <summary>

/// FTP请求对象

/// </summary>

FtpWebRequest request = null;

/// <summary>

/// FTP响应对象

/// </summary>

FtpWebResponse response = null;

/// <summary>

/// FTP服务器地址

/// </summary>

public string ftpURI { get; private set; }

/// <summary>

/// FTP服务器IP

/// </summary>

public string ftpServerIP { get; private set; }

/// <summary>

/// FTP服务器默认目录

/// </summary>

public string ftpRemotePath { get; private set; }

/// <summary>

/// FTP服务器登录用户名

/// </summary>

public string ftpUserID { get; private set; }

/// <summary>

/// FTP服务器登录密码

/// </summary>

public string ftpPassword { get; private set; }

/// <summary>

/// 初始化

/// </summary>

/// <param name="FtpServerIP">FTP连接地址</param>

/// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>

/// <param name="FtpUserID">用户名</param>

/// <param name="FtpPassword">密码</param>

public FTPHelper(string ftpServerIP, string ftpRemotePath, string ftpUserID, string ftpPassword)

{

this.ftpServerIP = ftpServerIP;

this.ftpRemotePath = ftpRemotePath;

this.ftpUserID = ftpUserID;

this.ftpPassword = ftpPassword;

this.ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";

}

~FTPHelper()

{

if (response != null)

{

response.Close();

response = null;

}

if (request != null)

{

request.Abort();

request = null;

}

}

/// <summary>

/// 建立FTP链接,返回响应对象

/// </summary>

/// <param name="uri">FTP地址</param>

/// <param name="ftpMethod">操作命令</param>

/// <returns></returns>

private FtpWebResponse Open(Uri uri, string ftpMethod)

{

request = (FtpWebRequest)FtpWebRequest.Create(uri);

request.Method = ftpMethod;

request.UseBinary = true;

request.KeepAlive = false;

request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);

return (FtpWebResponse)request.GetResponse();

}

/// <summary>

/// 建立FTP链接,返回请求对象

/// </summary>

/// <param name="uri">FTP地址</param>

/// <param name="ftpMethod">操作命令</param>

private FtpWebRequest OpenRequest(Uri uri, string ftpMethod)

{

request = (FtpWebRequest)WebRequest.Create(uri);

request.Method = ftpMethod;

request.UseBinary = true;

request.KeepAlive = false;

request.Credentials = new NetworkCredential(this.ftpUserID, this.ftpPassword);

return request;

}

/// <summary>

/// 创建目录

/// </summary>

/// <param name="remoteDirectoryName">目录名</param>

public void CreateDirectory(string remoteDirectoryName)

{

response = Open(new Uri(ftpURI + remoteDirectoryName), WebRequestMethods.Ftp.MakeDirectory);

}

/// <summary>

/// 更改目录或文件名

/// </summary>

/// <param name="currentName">当前名称</param>

/// <param name="newName">修改后新名称</param>

public void ReName(string currentName, string newName)

{

request = OpenRequest(new Uri(ftpURI + currentName), WebRequestMethods.Ftp.Rename);

request.RenameTo = newName;

response = (FtpWebResponse)request.GetResponse();

}

/// <summary>

/// 切换当前目录

/// </summary>

/// <param name="IsRoot">true:绝对路径 false:相对路径</param>

public void GotoDirectory(string DirectoryName, bool IsRoot)

{

if (IsRoot)

ftpRemotePath = DirectoryName;

else

ftpRemotePath += "/" + DirectoryName;

ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";

}

/// <summary>

/// 删除目录(包括下面所有子目录和子文件)

/// </summary>

/// <param name="remoteDirectoryName">要删除的带路径目录名:如web/test</param>

/*

* 例:删除test目录

FTPHelper helper = new FTPHelper("x.x.x.x", "web", "user", "password");

helper.RemoveDirectory("web/test");

*/

public void RemoveDirectory(string remoteDirectoryName)

{

GotoDirectory(remoteDirectoryName, true);

var listAll = ListFilesAndDirectories();

foreach (var m in listAll)

{

if (m.IsDirectory)

RemoveDirectory(m.Path);

else

DeleteFile(m.Name);

}

GotoDirectory(remoteDirectoryName, true);

response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.RemoveDirectory);

}

/// <summary>

/// 文件上传

/// </summary>

/// <param name="localFilePath">本地文件路径</param>

public void Upload(string localFilePath)

{

FileInfo fileInf = new FileInfo(localFilePath);

request = OpenRequest(new Uri(ftpURI + fileInf.Name), WebRequestMethods.Ftp.UploadFile);

request.ContentLength = fileInf.Length;

int buffLength = 2048;

byte[] buff = new byte[buffLength];

int contentLen;

using (var fs = fileInf.OpenRead())

{

using (var strm = request.GetRequestStream())

{

contentLen = fs.Read(buff, 0, buffLength);

while (contentLen != 0)

{

strm.Write(buff, 0, contentLen);

contentLen = fs.Read(buff, 0, buffLength);

}

}

}

}

/// <summary>

/// 删除文件

/// </summary>

/// <param name="remoteFileName">要删除的文件名</param>

public void DeleteFile(string remoteFileName)

{

response = Open(new Uri(ftpURI + remoteFileName), WebRequestMethods.Ftp.DeleteFile);

}

/// <summary>

/// 获取当前目录的文件和一级子目录信息

/// </summary>

/// <returns></returns>

public List<FileStruct> ListFilesAndDirectories()

{

var fileList = new List<FileStruct>();

response = Open(new Uri(ftpURI), WebRequestMethods.Ftp.ListDirectoryDetails);

using (var stream = response.GetResponseStream())

{

using (var sr = new StreamReader(stream))

{

string line = null;

while ((line = sr.ReadLine()) != null)

{

//line的格式如下:

//08-18-13 11:05PM <DIR> aspnet_client

//09-22-13 11:39PM 2946 Default.aspx

DateTime dtDate = DateTime.ParseExact(line.Substring(0, 8), "MM-dd-yy", null);

DateTime dtDateTime = DateTime.Parse(dtDate.ToString("yyyy-MM-dd") + line.Substring(8, 9));

string[] arrs = line.Split(' ');

var model = new FileStruct()

{

IsDirectory = line.IndexOf("<DIR>") > 0 ? true : false,

CreateTime = dtDateTime,

Name = arrs[arrs.Length - 1],

Path = ftpRemotePath + "/" + arrs[arrs.Length - 1]

};

fileList.Add(model);

}

}

}

return fileList;

}

/// <summary>

/// 列出当前目录的所有文件

/// </summary>

public List<FileStruct> ListFiles()

{

var listAll = ListFilesAndDirectories();

var listFile = listAll.Where(m => m.IsDirectory == false).ToList();

return listFile;

}

/// <summary>

/// 列出当前目录的所有一级子目录

/// </summary>

public List<FileStruct> ListDirectories()

{

var listAll = ListFilesAndDirectories();

var listFile = listAll.Where(m => m.IsDirectory == true).ToList();

return listFile;

}

/// <summary>

/// 判断当前目录下指定的子目录或文件是否存在

/// </summary>

/// <param name="remoteName">指定的目录或文件名</param>

public bool IsExist(string remoteName)

{

var list = ListFilesAndDirectories();

if (list.Count(m => m.Name == remoteName) > 0)

return true;

return false;

}

/// <summary>

/// 判断当前目录下指定的一级子目录是否存在

/// </summary>

/// <param name="RemoteDirectoryName">指定的目录名</param>

public bool IsDirectoryExist(string remoteDirectoryName)

{

var listDir = ListDirectories();

if (listDir.Count(m => m.Name == remoteDirectoryName) > 0)

return true;

return false;

}

/// <summary>

/// 判断当前目录下指定的子文件是否存在

/// </summary>

/// <param name="RemoteFileName">远程文件名</param>

public bool IsFileExist(string remoteFileName)

{

var listFile = ListFiles();

if (listFile.Count(m => m.Name == remoteFileName) > 0)

return true;

return false;

}

/// <summary>

/// 下载

/// </summary>

/// <param name="saveFilePath">下载后的保存路径</param>

/// <param name="downloadFileName">要下载的文件名</param>

public void Download(string saveFilePath, string downloadFileName)

{

using (FileStream outputStream = new FileStream(saveFilePath + "\\" + downloadFileName, FileMode.Create))

{

response = Open(new Uri(ftpURI + downloadFileName), WebRequestMethods.Ftp.DownloadFile);

using (Stream ftpStream = response.GetResponseStream())

{

long cl = response.ContentLength;

int bufferSize = 2048;

int readCount;

byte[] buffer = new byte[bufferSize];

readCount = ftpStream.Read(buffer, 0, bufferSize);

while (readCount > 0)

{

outputStream.Write(buffer, 0, readCount);

readCount = ftpStream.Read(buffer, 0, bufferSize);

}

}

}

}

}

public class FileStruct

{

/// <summary>

/// 是否为目录

/// </summary>

public bool IsDirectory { get; set; }

/// <summary>

/// 创建时间

/// </summary>

public DateTime CreateTime { get; set; }

/// <summary>

/// 文件或目录名称

/// </summary>

public string Name { get; set; }

/// <summary>

/// 路径

/// </summary>

public string Path { get; set; }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: