public void Download(string localPath, string fileName)
{
try
{
string uri = $"ftp://{FtpServerIP}/{fileName}";
var request = (FtpWebRequest)WebRequest.Create(uri);
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.UseBinary = true;
request.Credentials = new NetworkCredential(FtpUserId, FtpPassword);
using (var response = (FtpWebResponse)request.GetResponse())
using (var ftpStream = response.GetResponseStream())
using (var fileStream = File.Create(Path.Combine(localPath, fileName)))
{
byte[] buffer = new byte[2048];
int bytesRead;
while ((bytesRead = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, bytesRead);
}
}
}
catch (Exception ex)
{
MessageBox.Show($"下載失敗:{ex.Message}");
}
}
public string[] GetFileList()
{
try
{
var request = (FtpWebRequest)WebRequest.Create($"ftp://{FtpServerIP}/");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.UseBinary = true;
request.Credentials = new NetworkCredential(FtpUserId, FtpPassword);
using (var response = (FtpWebResponse)request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
string content = reader.ReadToEnd();
return content.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
}
}
catch (Exception ex)
{
MessageBox.Show($"取得列表失敗:{ex.Message}");
return null;
}
}
| 操作 | Method 屬性值 | 備註 |
|---|---|---|
| 重新命名 | WebRequestMethods.Ftp.Rename | 設定 request.RenameTo = "newname" |
| 刪除檔案 | WebRequestMethods.Ftp.DeleteFile | |
| 取得檔案大小 | WebRequestMethods.Ftp.GetFileSize | 回應 ContentLength |
| 詳細列表 | WebRequestMethods.Ftp.ListDirectoryDetails | 含權限、大小、時間 |
| 建立目錄 | WebRequestMethods.Ftp.MakeDirectory | URI 需包含目錄路徑 |
request.EnableSsl = true 加密傳輸(含帳密),需伺服器支援 FTPSrequest.UsePassive = true(預設),穿透客戶端防火牆request.KeepAlive = true 減少握手開銷WebException 檢查 Response.StatusCode 取得 FTP 狀態碼.NET Core / .NET 5+ 建議使用 FluentFTP 或 SSH.NET (SFTP),提供非同步 API、更豐富功能與更好相容性:
// FluentFTP 範例
using var client = new FtpClient("ftp.example.com", "user", "pass");
client.Connect();
await client.DownloadFileAsync("local.txt", "/remote.txt");
client.Disconnect();