using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;

namespace HmCsoft.Code
{
/// <summary>
/// Ftp服务类
/// </summary>
public class FileFtpHelper
{
/// <summary>
/// 获取Ftp目录
/// </summary>
/// <param name="ftpUrl">访问地址</param>
/// <param name="ftpUser">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <returns></returns>
public static string[] GetFileList(Uri ftpUrl, string ftpUser, string ftpPassword)
{
try
{
StringBuilder result = new StringBuilder();
FtpWebRequest ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(ftpUrl);
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
ftpWebRequest.KeepAlive = false;
WebResponse response = ftpWebRequest.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.Default);//中文文件名
string line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch
{
return null;
}
}

/// <summary>
/// 检查目录是否存在
/// </summary>
/// <param name="ftpUrl">访问地址</param>
/// <param name="ftpUser">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <param name="ifCreateDir">目录不存在是否创建</param>
/// <returns></returns>
public static bool DirectoryIsExist(Uri ftpUrl, string ftpUser, string ftpPassword, bool ifCreateDir = false)
{
string[] dirList = GetFileList(ftpUrl, ftpUser, ftpPassword);
if (dirList == null)
{
if (ifCreateDir)
{
return CreateDirectory(ftpUrl, ftpUser, ftpPassword);
}
else
{
return false;
}
}
else
{
return true;
}
}

/// <summary>
/// 创建目录:多层时逐层创建文件夹
/// </summary>
/// <param name="ftpUrl">访问地址</param>
/// <param name="ftpUser">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <returns></returns>
public static bool CreateDirectory(Uri ftpUrl, string ftpUser, string ftpPassword)
{
try
{
//Ftp访问地址
string fpPath = ftpUrl.AbsoluteUri.Substring(0, ftpUrl.AbsoluteUri.Length - ftpUrl.LocalPath.Length);
//获取地址中的目录
var dirList = ftpUrl.LocalPath.Split('/').ToList();
for (int i = dirList.Count - 1; i >= 0; i--)//优化空的目录
{
if (string.IsNullOrWhiteSpace(dirList[i]))
{
dirList.RemoveAt(i);
}
}
if (dirList[dirList.Count - 1].Contains("."))//含.的直接定义为文件,文件直接忽略
{
dirList.RemoveAt(dirList.Count - 1);
}
if (dirList.Count == 0) return true;//没有目录,不需要创建
for (int i = 0; i < dirList.Count; i++)
{
fpPath = fpPath + "/" + dirList[i];
bool result = DirectoryIsExist(new Uri(fpPath), ftpUser, ftpPassword);
if (!result)
{
//创建文件夹
FtpWebRequest ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(fpPath));
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
ftpWebRequest.UseBinary = true;
FtpWebResponse response = (FtpWebResponse)ftpWebRequest.GetResponse();
response.Close();
}
}
return true;
}
catch (Exception ex)
{
HmCsoft.Code.Log.LogFactory.GetLogger().Error(ex.Message, ex);
return false;
}
}

/// <summary>
/// 上传文件
/// </summary>
/// <param name="ftpUrl">访问地址</param>
/// <param name="ftpUser">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <param name="fileData">文件流</param>
/// <returns></returns>
public static bool CreateFileData(Uri ftpUrl, string ftpUser, string ftpPassword, byte[] fileData)
{
try
{
//检查目录是否存在,不存在创建目录
if (!DirectoryIsExist(ftpUrl, ftpUser, ftpPassword, true))
{
return false;
}
//创建文件
FtpWebRequest ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(ftpUrl);
ftpWebRequest.UseBinary = true;
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
ftpWebRequest.ContentLength = fileData.Length;//通知服务器上传文件的大小
Stream ftpstream = ftpWebRequest.GetRequestStream();//打开文件流
ftpstream.Write(fileData, 0, fileData.Length);//写入文件
ftpstream.Close();
return true;
}
catch (Exception ex)
{
HmCsoft.Code.Log.LogFactory.GetLogger().Error(ex.Message, ex);
return false;
}
}

/// <summary>
/// 下载文件
/// </summary>
/// <param name="ftpUrl">访问地址</param>
/// <param name="ftpUser">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <returns></returns>
public static MemoryStream DownFileData(Uri ftpUrl, string ftpUser, string ftpPassword)
{
Stream ftpStream = null;
MemoryStream memory = null;
try
{
FtpWebRequest ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(ftpUrl);
ftpWebRequest.UseBinary = true;
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse response = (FtpWebResponse)ftpWebRequest.GetResponse(); //返回FTP服务器响应
ftpStream = response.GetResponseStream();//检索从FTP服务器上发送的响应数据的流
int bufferSize = 2048;
byte[] buffer = new byte[bufferSize];
int readCount = ftpStream.Read(buffer, 0, bufferSize);
memory = new MemoryStream();
while (readCount > 0)
{
memory.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
memory.Position = 0;//设置流的当前位置,不设置会有导致流第一次Read取不到字节
return memory;
}
catch (Exception ex)
{
HmCsoft.Code.Log.LogFactory.GetLogger().Error(ex.Message, ex);
return null;
}
finally
{
if (ftpStream != null)
ftpStream.Close();
}
}
}
}

posted on 2022-01-23 16:06  lsxmeng  阅读(33)  评论(0编辑  收藏  举报