在 .NET Core 中,FTP(File Transfer Protocol)是一个较常用的功能,可以用于与 FTP 服务器交互,如上传文件、下载文件、删除文件等操作。以下是一个通用的 FTPHelper
工具类代码。
实现 FTPHelper
C#
using System;
using System.IO;
using System.Net;
public static class FTPHelper
{
/// <summary>
/// 上传文件到 FTP 服务器。
/// </summary>
/// <param name="ftpUri">FTP 地址(例如:ftp://example.com/remote/path/file.txt)</param>
/// <param name="localFilePath">本地文件路径</param>
/// <param name="username">FTP 用户名</param>
/// <param name="password">FTP 密码</param>
public static void UploadFile(string ftpUri, string localFilePath, string username, string password)
{
if (!File.Exists(localFilePath))
throw new FileNotFoundException("本地文件不存在", localFilePath);
try
{
// 获取文件内容
byte[] fileContents;
using (FileStream fs = new FileStream(localFilePath, FileMode.Open, FileAccess.Read))
{
fileContents = new byte[fs.Length];
fs.Read(fileContents, 0, fileContents.Length);
}
// 创建 FTP 请求
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUri);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(username, password);
request.UseBinary = true; // 二进制上传
request.ContentLength = fileContents.Length;
// 上传文件内容
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(fileContents, 0, fileContents.Length);
}
// 获取响应
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"上传完成,状态:{response.StatusDescription}");
}
}
catch (Exception ex)
{
Console.WriteLine($"上传文件失败: {ex.Message}");
throw;
}
}
/// <summary>
/// 从 FTP 服务器下载文件。
/// </summary>
/// <param name="ftpUri">FTP 文件地址(例如:ftp://example.com/remote/path/file.txt)</param>
/// <param name="localFilePath">本地保存路径</param>
/// <param name="username">FTP 用户名</param>
/// <param name="password">FTP 密码</param>
public static void DownloadFile(string ftpUri, string localFilePath, string username, string password)
{
try
{
// 创建 FTP 请求
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUri);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(username, password);
request.UseBinary = true; // 二进制下载
// 获取响应
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (FileStream fs = new FileStream(localFilePath, FileMode.Create, FileAccess.Write))
{
responseStream.CopyTo(fs);
Console.WriteLine($"下载完成,状态:{response.StatusDescription}");
}
}
catch (Exception ex)
{
Console.WriteLine($"下载文件失败: {ex.Message}");
throw;
}
}
/// <summary>
/// 删除 FTP 服务器上的文件。
/// </summary>
/// <param name="ftpUri">FTP 文件地址(例如:ftp://example.com/remote/path/file.txt)</param>
/// <param name="username">FTP 用户名</param>
/// <param name="password">FTP 密码</param>
public static void DeleteFile(string ftpUri, string username, string password)
{
try
{
// 创建 FTP 请求
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUri);
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.Credentials = new NetworkCredential(username, password);
// 获取响应
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
Console.WriteLine($"删除完成,状态:{response.StatusDescription}");
}
}
catch (Exception ex)
{
Console.WriteLine($"删除文件失败: {ex.Message}");
throw;
}
}
/// <summary>
/// 列出 FTP 目录中的文件和文件夹。
/// </summary>
/// <param name="ftpUri">FTP 目录地址(例如:ftp://example.com/remote/path/)</param>
/// <param name="username">FTP 用户名</param>
/// <param name="password">FTP 密码</param>
/// <returns>文件和文件夹的列表</returns>
public static string[] ListDirectory(string ftpUri, string username, string password)
{
try
{
// 创建 FTP 请求
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUri);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(username, password);
// 获取响应
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
{
var result = reader.ReadToEnd();
return result.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
}
}
catch (Exception ex)
{
Console.WriteLine($"列出目录失败: {ex.Message}");
throw;
}
}
}
功能说明
-
UploadFile:
- 上传文件到远程 FTP 服务器。
- 支持二进制文件,确保文件不会因文本编码问题损坏。
-
DownloadFile:
- 下载文件到本地路径。
- 使用
Stream
操作文件以提高效率。
-
DeleteFile:
- 删除 FTP 服务器上的文件。
-
ListDirectory:
- 列出目录中的所有文件和子目录。
使用示例
请确保提供正确的 FTP 服务器地址、登录凭证以及文件路径。
C#
class Program
{
static void Main(string[] args)
{
string ftpUri = "ftp://example.com/uploads/test.txt";
string userName = "your_username";
string password = "your_password";
string localPath = "C:\\Temp\\test.txt";
// 上传文件
FTPHelper.UploadFile(ftpUri, localPath, userName, password);
// 下载文件
FTPHelper.DownloadFile(ftpUri, "C:\\Temp\\downloaded_test.txt", userName, password);
// 删除文件
FTPHelper.DeleteFile(ftpUri, userName, password);
// 列出目录内容
var files = FTPHelper.ListDirectory("ftp://example.com/uploads/", userName, password);
foreach (var file in files)
{
Console.WriteLine(file);
}
}
}
注意事项
-
FTP 安全性:
- FTP 使用明文传输数据和凭证,建议在生产环境中使用安全的 SFTP(SSH File Transfer Protocol)或 FTPS(FTP over SSL/TLS)协议。
-
连接超时:
- 默认超时时间是 100 秒,可通过
request.Timeout
或request.ReadWriteTimeout
设置。
- 默认超时时间是 100 秒,可通过
-
防止路径问题:
- 请确保 FTP 地址、用户名和密码正确,路径中避免使用多余的斜杠。