C# FTP釋出檔案/資料夾至伺服器(增刪改查)
阿新 • • 發佈:2019-02-08
C#使用FTP釋出檔案或資料夾
一、選擇一個已有的ftp站點,要求已知登入資訊。如果沒有,則本地新增ftp站點,具體新增ftp站點的教程如下,百度上有很多類似教程:
https://jingyan.baidu.com/article/dca1fa6f479469f1a4405292.html
二、選擇正確的FTP操作庫。可選擇系統自帶的FTP庫,或者其他庫如(推薦用FluentFTP,Nuget裡可以下載到)
FluentFTP: https://www.nuget.org/packages/FluentFTP
三、具體程式碼
//用於驗證登入資訊是否正確
private bool validateLogin()
{
try
{
var Ip = tbxIp.Text;
var User = tbxUser.Text;
var Psw = tbxPwb.Password;
var uriStr = $"ftp://{Ip}";
var request = FtpWebRequest.Create(new Uri(_ftpPath));
request.Credentials = new NetworkCredential(_user, _password);
request.Method = WebRequestMethods.Ftp.ListDirectory;
var response = request.GetResponse();
response.Close();
request.Abort();
return true;
}
catch (Exception ex)
{
//沒有登入上
}
return false;
}
//獲取指定伺服器路徑下的檔案/資料夾路徑,此處的path應該是ftp://xxx.xxx.xxx.xx/ABC/DEF的資料夾路徑
private List<string> GetFolders(string path)
{
var lstFolders = new List<string>();
try
{
var ftpGetFolders = (FtpWebRequest)WebRequest.Create(new Uri(path));
ftpGetFolders.Credentials = new NetworkCredential(_user, _password);
ftpGetFolders.Method = WebRequestMethods.Ftp.ListDirectoryDetails;//所有的檔案列表,包括檔案和資料夾
var response = ftpGetFolders.GetResponse();
var sReader = new StreamReader(response.GetResponseStream());//獲取返回的位元組流並解析
string line = sReader.ReadLine();
while (line != null)
{
if (line.Contains("<DIR>"))//所有的資料夾都有這個標誌,但檔案也有可能有這個命名,還是比較蛋疼的
{
string msg = line.Substring(line.LastIndexOf("<DIR>") + 5).Trim();
lstFolders.Add(msg);
}
line = sReader.ReadLine();
}
sReader.Close();
response.Close();
ftpGetFolders.Abort();
}
catch (Exception ex)
{
//ignore
}
return lstFolders;
}
//建立ftp資料夾,ftpFolderpath為以ftp://開頭的資料夾完整路徑
private bool CreateFolder(string ftpFolderpath)
{
try
{
var ftpMakeFolder = (FtpWebRequest)WebRequest.Create(new Uri(ftpFolderpath));
ftpMakeFolder.Credentials = new NetworkCredential(_user, _password);
ftpMakeFolder.Method = WebRequestMethods.Ftp.MakeDirectory;
var response = ftpMakeFolder.GetResponse();
response.Close();
ftpMakeFolder.Abort();
return true;
}
catch (Exception)
{//ignore
}
return false;
}
//釋出檔案,FilePath為本地的檔案路徑
private bool PublishFile(string FilePath)
{
try
{
var newPath = @"ftp://" + Ip + Loc + $"/{Path.GetFileName(FilePath)}";//釋出的具體路徑,詳細到檔名
FtpWebRequest FTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(newPath));
FTP.Method = WebRequestMethods.Ftp.UploadFile;//選擇上傳檔案方法
FTP.Credentials = new NetworkCredential(User, Psw);
var fs = new FileStream(FilePath, FileMode.Open);
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen = 0;
var strm = FTP.GetRequestStream();
WaitHelper.StartWaiting();
contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close();
WaitHelper.CloseWaiting();
FTP.Abort();
return true;
}
catch (Exception ex)
{
ControlUtility.ShowWarningMsgbox($"上傳失敗");
return false;
}
}
本文給出的只是一個基本操作,並沒有做細節上的處理。FTP類中還有許多其他的方法有待學習。