要在 WinForms 应用程序中像访问本地文件夹一样访问 FTP 服务器上的文件夹,可以通过以下步骤实现:
1. 使用 FTP 访问远程服务器
你需要使用 FtpWebRequest
类来访问 FTP 服务器,并进行文件/文件夹的列表、上传和下载操作。
2. 显示目录结构
可以使用 TreeView
控件来显示 FTP 服务器的目录结构,并使用 ListView
控件来显示文件。通过与 FTP 服务器的连接,可以列出文件夹和文件,就像浏览本地文件系统一样。
3. 创建一个 FTP 客户端类
为了便于与 FTP 服务器交互,建议你封装一个 FTP 客户端类,提供下载、上传、列出目录等功能。
具体步骤
步骤 1:创建 FTP 客户端类
首先,创建一个封装 FTP 操作的类,包含列出目录、下载、上传等功能。
using System;
using System.IO;
using System.Net;
using System.Text;
public class FtpClient
{
private string ftpServer;
private string userName;
private string password;
public FtpClient(string ftpServer, string userName, string password)
{
this.ftpServer = ftpServer;
this.userName = userName;
this.password = password;
}
// 列出目录
public string[] ListDirectory(string path)
{
string uri = "ftp://" + ftpServer + "/" + path;
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential(userName, password);
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string directoryRaw = reader.ReadToEnd();
return directoryRaw.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
}
}
// 下载文件
public void DownloadFile(string remoteFilePath, string localFilePath)
{
string uri = "ftp://" + ftpServer + "/" + remoteFilePath;
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 fs = new FileStream(localFilePath, FileMode.Create))
{
responseStream.CopyTo(fs);
}
}
// 上传文件
public void UploadFile(string localFilePath, string remoteFilePath)
{
string uri = "ftp://" + ftpServer + "/" + remoteFilePath;
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(userName, password);
using (FileStream fs = new FileStream(localFilePath, FileMode.Open, FileAccess.Read))
using (Stream requestStream = request.GetRequestStream())
{
fs.CopyTo(requestStream);
}
}
}
步骤 2:在 WinForms 中使用 TreeView
和 ListView
使用 TreeView
控件显示文件夹,使用 ListView
控件显示文件。在用户选择文件或文件夹时,动态更新内容。
- 添加
TreeView
、ListView
控件到你的窗体中。 - 在加载时,通过
FtpClient.ListDirectory()
方法加载根目录到TreeView
中。
public partial class MainForm : Form
{
private FtpClient ftpClient;
public MainForm()
{
InitializeComponent();
ftpClient = new FtpClient("ftp.example.com", "username", "password");
// 加载根目录
LoadFtpDirectory("/");
}
// 加载目录
private void LoadFtpDirectory(string path)
{
try
{
string[] directories = ftpClient.ListDirectory(path);
foreach (var dir in directories)
{
TreeNode node = new TreeNode(dir);
treeView1.Nodes.Add(node); // 把目录加到 TreeView
}
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
// 双击 TreeView 节点时,加载对应目录内容到 ListView
private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
string selectedPath = e.Node.Text;
LoadFtpDirectory(selectedPath); // 加载选中的文件夹
}
}
步骤 3:处理文件的下载和上传
通过 ListView
控件,用户可以选择文件,右键菜单提供下载和上传的功能。
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ContextMenu contextMenu = new ContextMenu();
MenuItem downloadItem = new MenuItem("下载", DownloadFile);
contextMenu.MenuItems.Add(downloadItem);
contextMenu.Show(listView1, e.Location);
}
}
private void DownloadFile(object sender, EventArgs e)
{
string remoteFilePath = listView1.SelectedItems[0].Text; // 获取选中文件
SaveFileDialog saveFileDialog = new SaveFileDialog();
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string localPath = saveFileDialog.FileName;
ftpClient.DownloadFile(remoteFilePath, localPath); // 下载文件
}
}
总结:
-
TreeView 控件显示目录结构,
ListView
显示文件列表。 - 通过
FtpWebRequest
类实现与 FTP 服务器的交互,如列出文件、上传和下载。 - 通过右键菜单和双击事件,支持用户下载和上传文件,提供类似访问本地文件系统的体验。
这样,用户可以通过 WinForms 的图形界面与 FTP 服务器交互,类似于本地文件系统的操作体验。