Files
DevToolsAvalonia/常用工具集/Utility/Network/FtpHelper.cs
2025-08-26 08:37:44 +08:00

602 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace .Utility.Network
{
public class FtpHelper
{
private string ip;
private int port = 21;
private string ftpUserId;
private string ftpPassword;
private Encoding encoding;
private string FtpUrl
{
get
{
return $"ftp://{ip}:{port}/";
}
}
public FtpHelper(string ip) : this(ip, 21) { }
public FtpHelper(string ip, int port) : this(ip, 21, Encoding.GetEncoding("GB2312")) { }
/// <summary>
/// 匿名
/// </summary>
/// <param name="ip"></param>
public FtpHelper(string ip, Encoding encoding) : this(ip, 21, encoding) { }
public FtpHelper(string ip, int port, Encoding encoding) : this(ip, port, "anonymous", "", encoding) { }
public FtpHelper(string ip, string userName, string password) : this(ip, 21, userName, password) { }
public FtpHelper(string ip, int port, string userName, string password) : this(ip, port, userName, password, Encoding.UTF8) { }
/// <summary>
/// 指定用户名密码
/// </summary>
/// <param name="ip"></param>
/// <param name="userName"></param>
/// <param name="password"></param>
public FtpHelper(string ip, string userName, string password, Encoding encoding) : this(ip, 21, userName, password, encoding) { }
/// <summary>
/// 指定用户名密码
/// </summary>
/// <param name="ip"></param>
/// <param name="userName"></param>
/// <param name="password"></param>
public FtpHelper(string ip, int port, string userName, string password, Encoding encoding)
{
this.ip = ip;
this.port = port;
this.ftpUserId = userName;
this.ftpPassword = password;
this.encoding = encoding;
}
/// <summary>
/// 获得文件的最后更新时间
/// </summary>
/// <param name="ftpPath"></param>
/// <param name="ftpUserId"></param>
/// <param name="ftpPassword"></param>
/// <param name="relativeFilePath"></param>
/// <returns></returns>
public DateTime GetFileLastModified(string ftpPath)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.UseBinary = true;
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
DateTime dt = response.LastModified;
response.Close();
response = null;
request = null;
return dt;
}
catch (Exception ex)
{
Console.WriteLine("FtpUtil.GetFileLastModified 获得文件的最后更新时间 错误");
throw ex;
}
}
/// <summary>
/// 列出ftp目录下的所有文件
/// </summary>
/// <param name="ftpPath"></param>
/// <param name="ftpUserId"></param>
/// <param name="ftpPassword"></param>
/// <returns></returns>
public List<FtpFileInfo> GetList(string ftpPath)
{
List<string> fileList = GetFileDetail(ftpPath);
List<FtpFileInfo> list = new List<FtpFileInfo>();
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
MemoryStream stream = new MemoryStream();
byte[] bArr = new byte[1024 * 1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Seek(0, SeekOrigin.Begin);
responseStream.Close();
string str = encoding.GetString(stream.ToArray());
foreach (string line in str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries))
{
if (line == "." || line == "..")
continue;
string detail = fileList.Where(it => it.EndsWith(line)).FirstOrDefault();
if (detail == null || detail.Length == 0)
{
continue;
}
if (detail.ToUpper().Contains("<DIR>") || detail.ToUpper().Contains("DR"))
{
list.Add(new FtpFileInfo { IsDirectory = true, Name = line });
}
else
{
list.Add(new FtpFileInfo { IsDirectory = false, Name = line });
}
}
return list.OrderByDescending(it => it.IsDirectory).ToList();
}
catch (Exception ex)
{
Console.WriteLine("FtpUtil.GetFile 列出ftp目录下的所有文件 错误");
throw ex;
}
}
public List<string> GetFileDetail(string ftpPath)
{
List<string> list = new List<string>();
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
MemoryStream stream = new MemoryStream();
byte[] bArr = new byte[1024 * 1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Seek(0, SeekOrigin.Begin);
responseStream.Close();
string str = encoding.GetString(stream.ToArray());
foreach (string line in str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries))
{
list.Add(line);
}
return list;
}
catch (Exception ex)
{
Console.WriteLine("FtpUtil.GetFile 列出ftp目录下的所有文件 错误");
throw ex;
}
}
/// <summary>
/// 判断是否是文件
/// </summary>
/// <param name="ftpPath"></param>
/// <param name="ftpUserId"></param>
/// <param name="ftpPassword"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public bool IsFileExist(string ftpPath, string fileName)
{
List<FtpFileInfo> list = GetList(ftpPath);
if (list.Any(it => !it.IsDirectory && it.Name == fileName))
{
return true;
}
return false;
}
#region
/// <summary>
/// 文件夹是否存在
/// </summary>
/// <param name="ftpPath"></param>
/// <param name="folderName"></param>
/// <returns></returns>
public bool FolderExists(string ftpPath, string folderName)
{
List<FtpFileInfo> list = GetList(ftpPath);
if (list.Any(it => it.IsDirectory && it.Name == folderName))
{
return true;
}
return false;
}
#endregion
#region
/// <summary>
/// 创建文件夹
/// </summary>
/// <param name="ftpPath">ftp路径</param>
/// <param name="folderName">文件夹名称</param>
public bool CreateFolder(string ftpPath)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = "MKD";
((FtpWebResponse)request.GetResponse()).Close();
return true;
}
catch (Exception ex)
{
return false;
}
}
#endregion
#region
/// <summary>
/// 文件是否存在
/// </summary>
/// <param name="ftpPath">ftp路径</param>
/// <param name="ftpUserId">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <param name="relativeFilePath">文件相对路径</param>
public bool FileExists(string ftpPath)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
string folderName = Path.GetDirectoryName(ftpPath);
string fileName = Path.GetFileName(ftpPath);
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = "LIST";
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
MemoryStream stream = new MemoryStream();
byte[] bArr = new byte[1024 * 1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Seek(0, SeekOrigin.Begin);
responseStream.Close();
string str = encoding.GetString(stream.ToArray());
foreach (string line in str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries))
{
if (!line.ToUpper().Contains("DIR") && !line.ToUpper().Contains("DR"))
{
int pos = line.LastIndexOf(" ");
string strFileName = line.Substring(pos).Trim();
if (strFileName == fileName)
{
return true;
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("FtpUtil.FileExists 判断文件是否存在 错误");
throw ex;
}
return false;
}
#endregion
#region
/// <summary>
/// 下载文件
/// </summary>
/// <param name="ftpPath">ftp路径</param>
/// <param name="ftpUserId">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <param name="relativeFilePath">文件相对路径</param>
public MemoryStream DownloadFile(string ftpPath)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = "RETR";
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
MemoryStream stream = new MemoryStream();
byte[] bArr = new byte[1024 * 1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Seek(0, SeekOrigin.Begin);
responseStream.Close();
return stream;
}
catch (Exception ex)
{
Console.WriteLine("FtpUtil.DownloadFile 下载文件 错误");
throw ex;
}
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="ftpPath">ftp路径</param>
/// <param name="ftpUserId">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <param name="relativeFilePath">文件相对路径</param>
public void DownloadFile(string ftpPath, string localFile)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = "RETR";
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream stream = new FileStream(localFile, FileMode.OpenOrCreate, FileAccess.Write);
byte[] bArr = new byte[1024 * 1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Seek(0, SeekOrigin.Begin);
responseStream.Close();
stream.Dispose();
}
catch (Exception ex)
{
Console.WriteLine("FtpUtil.DownloadFile 下载文件 错误");
throw ex;
}
}
#endregion
#region
/// <summary>
/// 异步下载文件
/// </summary>
/// <param name="ftpPath">ftp路径</param>
public async Task<MemoryStream> DownloadFileAsync(string ftpPath)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = "RETR";
FtpWebResponse response = (FtpWebResponse)(await request.GetResponseAsync());
Stream responseStream = response.GetResponseStream();
MemoryStream stream = new MemoryStream();
byte[] bArr = new byte[1024 * 1024];
int size = await responseStream.ReadAsync(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = await responseStream.ReadAsync(bArr, 0, (int)bArr.Length);
}
stream.Seek(0, SeekOrigin.Begin);
responseStream.Close();
return stream;
}
catch (Exception ex)
{
Console.WriteLine("FtpUtil.DownloadFileAsync 异步下载文件 错误");
throw ex;
}
}
#endregion
#region
/// <summary>
/// 上传文件
/// </summary>
/// <param name="ftpPath">ftp路径</param>
/// <param name="relativeFilePath">文件相对路径</param>
/// <param name="bArr">文件内容</param>
public bool UploadFile(string ftpPath, byte[] bArr)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = "STOR";
Stream postStream = request.GetRequestStream();
int pageSize = 1024 * 1024;
int index = 0;
while (index < bArr.Length)
{
if (bArr.Length - index > pageSize)
{
postStream.Write(bArr, index, pageSize);
index += pageSize;
}
else
{
postStream.Write(bArr, index, bArr.Length - index);
index = index + (bArr.Length - index);
}
}
postStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
string result = sr.ReadToEnd();
responseStream.Close();
return true;
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name="localFilePath">本地文件</param>
/// <param name="ftpPath">远端路径</param>
/// <returns></returns>
public bool UploadFile(string localFilePath, string ftpPath)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
byte[] bytes = new byte[1024 * 1024];
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = "STOR";
FileStream stream = new FileStream(localFilePath, FileMode.Open);
Stream postStream = request.GetRequestStream();
while (true)
{
int count = stream.Read(bytes, 0, bytes.Length);
if (count == 0)
break;
postStream.Write(bytes, 0, count);
}
postStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
string result = sr.ReadToEnd();
responseStream.Close();
return true;
}
catch (Exception ex)
{
return false;
}
}
#endregion
#region
/// <summary>
/// 删除文件
/// </summary>
/// <param name="ftpPath">ftp路径</param>
/// <param name="ftpUserId">用户名</param>
/// <param name="ftpPassword">密码</param>
/// <param name="relativeFilePath">文件相对路径</param>
public bool DeleteFile(string ftpPath)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = WebRequestMethods.Ftp.DeleteFile;
((FtpWebResponse)request.GetResponse()).Close();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
public bool Rename(string ftpPath, string newName)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = WebRequestMethods.Ftp.Rename;
request.RenameTo = newName;
((FtpWebResponse)request.GetResponse()).Close();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
public bool DeleteDirectory(string ftpPath)
{
try
{
string url = Uri.EscapeUriString(FtpUrl + ftpPath);
if (ftpPath.EndsWith("/"))
ftpPath = ftpPath.Substring(0, ftpPath.Length - 1);
FtpWebRequest request = null;
request = (FtpWebRequest)WebRequest.Create(new Uri(url));
request.Credentials = new NetworkCredential(ftpUserId, ftpPassword);
request.Method = WebRequestMethods.Ftp.RemoveDirectory;
((FtpWebResponse)request.GetResponse()).Close();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
}
public class FtpFileInfo
{
public bool IsDirectory { get; set; }
public string Name { get; set; }
}
}