FTP(File Transfer Protocol,文件传输协议)是一种用于在客户端和服务器之间传输文件的标准网络协议。使用C#编程语言,我们可以轻松实现一个FTP客户端。本文将探讨如何实现基本的FTP功能,包括连接FTP服务器、上传和下载文件。
技术特点
- 易于使用:C#提供了FtpWebRequest类,使得FTP操作如上传、下载变得非常容易。
- 功能全面:支持多种FTP操作,包括上传、下载、删除、列目录等。
- 可扩展性强:可以轻松扩展以满足特定的业务需求。
服务端
实现FTP客户端
以下是一个简单的C# FTP客户端示例,它展示了如何连接到FTP服务器并进行文件上传和下载操作。
using System;
using System.IO;
using System.Net;
public class SimpleFtpClient
{
    private string _ftpServer;
    private string _userName;
    private string _password;
    public SimpleFtpClient(string ftpServer, string userName, string password)
    {
        _ftpServer = ftpServer;
        _userName = userName;
        _password = password;
    }
    /// <summary>
    /// 上传文件到FTP服务器
    /// </summary>
    /// <param name="filePath">本地文件路径</param>
    /// <param name="ftpPath">服务器文件路径</param>
    public void UploadFile(string filePath, string ftpPath)
    {
        FileInfo fileInf = new FileInfo(filePath);
        string uri = "ftp://" + _ftpServer + "/" + ftpPath;
        
        // 创建FTP请求
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
        request.Method = WebRequestMethods.Ftp.UploadFile;
        
        // 登录凭证
        request.Credentials = new NetworkCredential(_userName, _password);
        
        // 上传文件
        using (FileStream fileStream = fileInf.OpenRead())
        {
            using (Stream requestStream = request.GetRequestStream())
            {
                byte[] buffer = new byte[2048];
                int bytesRead;
                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    requestStream.Write(buffer, 0, bytesRead);
                }
            }
        }
        
        // 获取FTP服务器响应
        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
            Console.WriteLine(#34;Upload File Complete, status {response.StatusDescription}");
        }
    }
    /// <summary>
    /// 从FTP服务器下载文件
    /// </summary>
    /// <param name="ftpPath">服务器文件路径</param>
    /// <param name="localPath">本地保存路径</param>
    public void DownloadFile(string ftpPath, string localPath)
    {
        string uri = "ftp://" + _ftpServer + "/" + ftpPath;
        
        // 创建FTP请求
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        
        // 登录凭证
        request.Credentials = new NetworkCredential(_userName, _password);
        // 下载文件
        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
            using (Stream responseStream = response.GetResponseStream())
            {
                using (FileStream localFileStream = new FileStream(localPath, FileMode.Create))
                {
                    byte[] buffer = new byte[2048];
                    int bytesRead;
                    while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        localFileStream.Write(buffer, 0, bytesRead);
                    }
                }
            }
            Console.WriteLine(#34;Download Complete, status {response.StatusDescription}");
        }
    }
}
上传文件
private void btnUpload_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog1 = new OpenFileDialog();
    openFileDialog1.Filter = "All files (*.*)|*.*";
    openFileDialog1.Title = "Select a file to upload";
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        string filename = openFileDialog1.FileName;
        FileInfo fileInfo = new FileInfo(filename);
        SimpleFtpClient ftpHelper = new SimpleFtpClient("127.0.0.1:21", "admin", "123456");
        ftpHelper.UploadFile(filename, fileInfo.Name);
        MessageBox.Show("File uploaded successfully!");
    }
}
下载文件
private void btnDownload_Click(object sender, EventArgs e)
{
    SimpleFtpClient ftpHelper = new SimpleFtpClient("127.0.0.1:21", "admin", "123456");
    SaveFileDialog saveFileDialog=new SaveFileDialog();
    saveFileDialog.Filter = "All files (*.*)|*.*";
    saveFileDialog.Title = "Select a file to download";
    if (saveFileDialog.ShowDialog() == DialogResult.OK)
    {
        string filename = saveFileDialog.FileName;
        ftpHelper.DownloadFile("1724843803807.png", filename);
        MessageBox.Show("File downloaded successfully!");
    }
}
列表服务器文件
/// <summary>
/// 列出FTP服务器上指定路径的文件和目录
/// </summary>
/// <param name="path">服务器路径</param>
public List<string> ListDirectory(string path)
{
    string uri = "ftp://" + _ftpServer + "/" + path;
    List<string> lst = new List<string>();
    // 创建FTP请求
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
    // 登录凭证
    request.Credentials = new NetworkCredential(_userName, _password);
    // 获取服务器响应
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
    {
        using (Stream responseStream = response.GetResponseStream())
        {
            // 使用特定编码读取流,这里使用UTF8编码
            using (StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("GB2312")))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    lst.Add(line);
                }
            }
        } 
    }
    return lst;
}
注意事项
- 确保FTP服务器地址、用户名和密码正确。
- 检查FTP服务器的权限设置,确保具有上传和下载文件的权限。
通过以上示例,您可以实现一个基本的FTP客户端,并可根据需要进行扩展以支持更多功能和操作。
