FTP客户端示例代码(C#源代码):连接到DriveHQ的FTP服务器许多用户询问如何在自己的软件项目中连接到 DriveHQ 的 FTP 服务器。本文首先提供一些关于 FTP 的基本信息,然后提供一些 C# 源代码。
DriveHQ 提供 FTP 服务器托管服务。我们支持标准的 FTP 和 FTPS 协议。我们 FTP 服务的主要优势之一是:它与我们广泛的云 IT 服务无缝集成。用户可以使用 Web 浏览器访问他们的 FTP 文件。 映射驱动器(WebDAV) 或者使用 DriveHQ 文件管理器客户端软件。他们还可以使用我们基于 Web 的群组管理工具来创建和管理 FTP 用户(子用户)。
普通的FTP协议由于传输数据时未加密,因此被认为是不安全的。为了获得更强的SSL安全性,可以使用FTPS(基于SSL/TLS的FTP)。有两种方法可以启用SSL安全机制:
隐式: FTP客户端直接连接到特殊的FTPS端口号(默认端口号为990);
显式(FTPES): FTP 客户端连接到常规 FTP 端口号 21,然后发出 STARTTLS 命令来升级安全性。
DriveHQ的FTP服务器同时支持FTPS和FTPES。大多数FTP客户端应用程序也支持FTPS和FTPES,例如FileZilla、CuteFTP、WsFTP、SmartFTP、WinSCP和Fetch等。
还有一种名为 SFTP 的安全文件传输协议,它经常与“安全 FTP”混淆;实际上,SFTP 指的是“SSH 文件传输协议”,这是一种完全不同的文件传输协议。从安全性的角度来看,SSL/TLS 和 SSH 基本相同。显然,SSL/TLS 比 SSH 更流行。DriveHQ 的 FTP 服务器不支持 SFTP,因为我们认为目前没有很强的 SFTP 需求。
主动模式和被动模式 FTP:
FTP 连接可能包含两个 TCP 连接(通道):命令通道和数据通道。命令通道用于发送 FTP 命令;数据通道用于传输大量数据。主动模式 FTP 需要 FTP 服务器回连 FTP 客户端以建立数据连接。这种方式通常被认为不安全,并会被许多防火墙/路由器阻止。被动模式 FTP 需要 FTP 客户端连接到 FTP 服务器的不同端口号。这种方式被认为安全,很少被阻止。DriveHQ 的 FTP 服务器同时支持主动模式和被动模式 FTP。但是,如果您的路由器/防火墙或安全软件阻止了主动模式 FTP,则该功能将无法正常工作。值得注意的是,大多数新型路由器都支持主动模式 FTP。
请注意:微软的命令行FTP客户端不支持被动FTP。几乎所有其他FTP客户端程序都同时支持主动FTP和被动FTP。
FTP 和 ProFTP
DriveHQ 拥有两个 FTP 站点,一个是 ftp.drivehq.com,所有用户均可访问;另一个是 proftp.drivehq.com,仅限付费会员(包括付费群组帐户的子用户)使用。由于 proftp.drivehq.com 仅供付费会员使用,因此不支持匿名 FTP。有关我们 FTP 服务器托管服务的更多信息,请访问[此处插入链接]:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
FTP客户端源代码示例
以下 C# 源代码按原样提供,不提供任何支持。您可以随意将其用于您自己的软件或重新分发。示例代码演示了如何连接到我们的 FTP 服务器并执行 FTP 命令,例如 LIST、GET 和 PUT;您还可以了解如何将其设置为使用被动 FTP 和 SSL。
使用 System;
使用 System.Collections.Generic;
使用 System.Linq;
使用 System.Text;
使用 System.Threading.Tasks;
使用 System.Net;
使用 System.IO;
使用 System.Security.Cryptography.X509Certificates;
/// <摘要>
/// 版权所有 (c) 2003-2016,Drive Headquarters, Inc.
///
/// FTP 客户端示例代码展示了如何使用 C# 连接到 DriveHQ 的 FTP 服务器。
/// 您可以免费使用或重新分发此代码。代码按原样提供,不提供任何修改
/// 不提供任何支持或担保。DriveHQ 对使用此代码不承担任何责任。
///
命名空间 FTPClientSample
{
课程项目
{
static string ftpServer = "ftp.drivehq.com"; // 如果您有付费帐户,也可以使用 proftp.drivehq.com。
static string username = "YOUR_USERNAME"; // 您的 DriveHQ 用户名
static string password = "YOUR_PASSWORD"; // 您的 DriveHQ 密码
static void Main(string[] args)
{
// 列出 FTP 服务器上的一个文件夹
//列表(”/”);
// 从 FTP 服务器下载文件
//DownloadFile("ServerFileName.jpg", @"c:\temp\ClientFileName.jpg");
// 将文件上传到 FTP 服务器
UploadFile(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
/// <摘要>
/// 将文件上传到FTP服务器。
///
/// FTP 服务器上的路径,例如 /temp/filename
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
如果 (String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("源文件路径。");
如果 (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(destFilePath);
// serverUri 应以 ftp:// 协议开头。
如果 (serverUri.Scheme != Uri.UriSchemeFtp)
返回 false;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// 将文件内容读取到字节数组中
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = new byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// 将文件内容发送到 FTP 服务器
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("响应状态:{0} - {1}", response.StatusCode, response.StatusDescription);
返回 true;
}
/// <摘要>
/// 将 FTP 服务器上的 srcFilePath 文件下载到 destFilePath 文件夹。(如果 destFilePath 为空,则保存到当前文件夹)
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
如果 (String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("源文件路径。");
如果 (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(srcFilePath);
//// serverUri 应以 ftp:// 协议开头。
如果 (serverUri.Scheme != Uri.UriSchemeFtp)
返回 false;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.DownloadFile);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream fileStream = new FileStream(destFilePath, FileMode.OpenOrCreate, FileAccess.Write);
byte[] buffer = new byte[32 * 1024];
while(true) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
如果 (bytesRead == 0)
休息;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("响应状态:{0} - {1}", response.StatusCode, response.StatusDescription);
返回 true;
}
/// <摘要>
/// 列出FTP文件夹的内容
///
///
public static string List(string path)
{
Uri serverUri = GetUri(path);
//// serverUri 应以 ftp:// 协议开头。
如果 (serverUri.Scheme != Uri.UriSchemeFtp)
返回 ””;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine("响应状态:{0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + result);
返回结果;
}
private static FtpWebRequest CreateFtpRequest(Uri serverUri, string method)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.EnableSsl = true;
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = true;
request.Credentials = new NetworkCredential(username, password);
请求.方法 = 方法;
退货请求;
}
private static Uri GetUri(string remoteFilePath)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
返回新的 Uri(ftpServerUri, remoteFilePath);
}
}
}