C# 实现一个简单的 FTP 客户端

C# 实现一个简单的 FTP 客户端

编码文章call10242025-06-08 15:21:2410A+A-

FTP(File Transfer Protocol,文件传输协议)是一种用于在客户端和服务器之间传输文件的标准网络协议。使用C#编程语言,我们可以轻松实现一个FTP客户端。本文将探讨如何实现基本的FTP功能,包括连接FTP服务器、上传和下载文件。

技术特点

  1. 易于使用:C#提供了FtpWebRequest类,使得FTP操作如上传、下载变得非常容易。
  2. 功能全面:支持多种FTP操作,包括上传、下载、删除、列目录等。
  3. 可扩展性强:可以轻松扩展以满足特定的业务需求。

服务端

实现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客户端,并可根据需要进行扩展以支持更多功能和操作。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4