/// <summary>
/// 移除FTP上的指定文件
/// </summary>
/// <param name="filename">要移除的文件名稱</param>
public void RemoveFile(string filename)
{
Connect();
SendCommand("DELE " + filename);
ReadResponse();
if (response != 250)
{
errormessage += responseStr;
}
}
/// <summary>
/// 重命名FTP上的文件
/// </summary>
/// <param name="oldfilename">原文件名</param>
/// <param name="newfilename">新文件名</param>
public void RenameFile(string oldfilename, string newfilename)
{
Connect();
SendCommand("RNFR " + oldfilename);
ReadResponse();
if (response != 350)
{
errormessage += responseStr;
}
else
{
SendCommand("RNTO " + newfilename);
ReadResponse();
if (response != 250)
{
errormessage += responseStr;
}
}
}
/// <summary>
/// 獲得指定文件的大小(如果FTP支持)
/// </summary>
/// <param name="filename">指定的文件</param>
/// <returns>返回指定文件的大小</returns>
public long GetFileSize(string filename)
{
Connect();
SendCommand("SIZE " + filename);
ReadResponse();
if (response != 213)
{
errormessage += responseStr;
}
return Int64.Parse(responseStr.Substring(4));
}
/// <summary>
/// 上傳指定的文件
/// </summary>
/// <param name="filename">要上傳的文件</param>
public bool OpenUpload(string filename)
{
return OpenUpload(filename, filename, false);
}
/// <summary>
/// 上傳指定的文件
/// </summary>
/// <param name="filename">本地文件名</param>
/// <param name="remotefilename">遠程要覆蓋的文件名</param>
public bool OpenUpload(string filename, string remotefilename)
{
return OpenUpload(filename, remotefilename, false);
}
/// <summary>
/// 上傳指定的文件
/// </summary>
/// <param name="filename">本地文件名</param>
/// <param name="resume">如果存在,則嘗試恢復(fù)</param>
public bool OpenUpload(string filename, bool resume)
{
return OpenUpload(filename, filename, resume);
}
/// <summary>
/// 上傳指定的文件
/// </summary>
/// <param name="filename">本地文件名</param>
/// <param name="remote_filename">遠程要覆蓋的文件名</param>
/// <param name="resume">如果存在,則嘗試恢復(fù)</param>
public bool OpenUpload(string filename, string remote_filename, bool resume)
{
Connect();
SetBinaryMode(true);
OpenDataSocket();
bytes_total = 0;
try
{
file = new FileStream(filename, FileMode.Open);
}
catch (Exception ex)
{
file = null;
errormessage += ex.Message;
return false;
}
file_size = file.Length;
if (resume)
{
long size = GetFileSize(remote_filename);
SendCommand("REST " + size);
ReadResponse();
if (response == 350)
file.Seek(size, SeekOrigin.Begin);
}
SendCommand("STOR " + remote_filename);
ReadResponse();
switch (response)
{
case 125:
case 150:
break;
default:
file.Close();
file = null;
errormessage += responseStr;
return false;
}
ConnectDataSocket();
return true;
}
/// <summary>
/// 下載指定文件
/// </summary>
/// <param name="filename">遠程文件名稱</param>
public void OpenDownload(string filename)
{
OpenDownload(filename, filename, false);
}
/// <summary>
/// 下載并恢復(fù)指定文件
/// </summary>
/// <param name="filename">遠程文件名稱</param>
/// <param name="resume">如文件存在,則嘗試恢復(fù)</param>
public void OpenDownload(string filename, bool resume)
{
OpenDownload(filename, filename, resume);
}
/// <summary>
/// 下載指定文件
/// </summary>
/// <param name="filename">遠程文件名稱</param>
/// <param name="localfilename">本地文件名</param>
public void OpenDownload(string remote_filename, string localfilename)
{
OpenDownload(remote_filename, localfilename, false);
}
/// <summary>
/// 打開并下載文件
/// </summary>
/// <param name="remote_filename">遠程文件名稱</param>
/// <param name="local_filename">本地文件名</param>
/// <param name="resume">如果文件存在則恢復(fù)</param>
public void OpenDownload(string remote_filename, string local_filename, bool resume)
{
Connect();
SetBinaryMode(true);
bytes_total = 0;
try
{
file_size = GetFileSize(remote_filename);
}
catch
{
file_size = 0;
}
if (resume && File.Exists(local_filename))
{
try
{
file = new FileStream(local_filename, FileMode.Open);
}
catch (Exception ex)
{
file = null;
throw new Exception(ex.Message);
}
SendCommand("REST " + file.Length);
ReadResponse();
if (response != 350)
throw new Exception(responseStr);
file.Seek(file.Length, SeekOrigin.Begin);
bytes_total = file.Length;
}
else
{
try
{
file = new FileStream(local_filename, FileMode.Create);
}
catch (Exception ex)
{
file = null;
throw new Exception(ex.Message);
}
}
OpenDataSocket();
SendCommand("RETR " + remote_filename);
ReadResponse();
switch (response)
{
case 125:
case 150:
break;
default:
file.Close();
file = null;
errormessage += responseStr;
return;
}
ConnectDataSocket();
return;
}
/// <summary>
/// 上傳文件(循環(huán)調(diào)用直到上傳完畢)
/// </summary>
/// <returns>發(fā)送的字節(jié)數(shù)</returns>
public long DoUpload()
{
Byte[] bytes = new Byte[512];
long bytes_got;
try
{
bytes_got = file.Read(bytes, 0, bytes.Length);
bytes_total += bytes_got;
data_sock.Send(bytes, (int)bytes_got, 0);
if (bytes_got <= 0)
{
//上傳完畢或有錯誤發(fā)生
file.Close();
file = null;
CloseDataSocket();
ReadResponse();
switch (response)
{
case 226:
case 250:
break;
default: //當上傳中斷時
{
errormessage += responseStr;
return -1;
}
}
SetBinaryMode(false);
}
}
catch (Exception ex)
{
file.Close();
file = null;
CloseDataSocket();
ReadResponse();
SetBinaryMode(false);
//throw ex;
//當上傳中斷時
errormessage += ex.Message;
return -1;
}
return bytes_got;
}
/// <summary>
/// 下載文件(循環(huán)調(diào)用直到下載完畢)
/// </summary>
/// <returns>接收到的字節(jié)點</returns>
public long DoDownload()
{
Byte[] bytes = new Byte[512];
long bytes_got;
try
{
bytes_got = data_sock.Receive(bytes, bytes.Length, 0);
if (bytes_got <= 0)
{
//下載完畢或有錯誤發(fā)生
CloseDataSocket();
file.Close();
file = null;
ReadResponse();
switch (response)
{
case 226:
case 250:
break;
default:
{
errormessage += responseStr;
return -1;
}
}
SetBinaryMode(false);
return bytes_got;
}
file.Write(bytes, 0, (int)bytes_got);
bytes_total += bytes_got;
}
catch (Exception ex)
{
CloseDataSocket();
file.Close();
file = null;
ReadResponse();
SetBinaryMode(false);
//throw ex;
//當下載中斷時
errormessage += ex.Message;
return -1;
}
return bytes_got;
}
#endregion
}
}
簡單使用示例:
程序代碼
FTP ftp = new FTP("127.0.0.1", "abc", "123456");
//建立文件夾
ftp.MakeDir("com");
ftp.ChangeDir("com");
ftp.MakeDir("mzwu");
ftp.ChangeDir("mzwu");
//文件夾列表
ArrayList list = ftp.ListDirectories();
for (int i = 0; i < list.Count; i++)
{
Response.Write(list[i].ToString() + "<br/>");
}
//刪除文件夾(不能直接刪除非空文件夾)
ftp.RemoveDir("com\\mzwu");
//上傳文件
ftp.Connect();
ftp.OpenUpload(@"F:\mzwucom.jpg", Path.GetFileName(@"F:\mzwucom.jpg"));
while (ftp.DoUpload() > 0)
{
int perc = (int)(((ftp.BytesTotal) * 100) / ftp.FileSize);
Response.Write(perc.ToString() + "%<br/>");
Response.Flush();
}
ftp.Disconnect();
//下載文件
ftp.Connect();
ftp.OpenDownload("mzwucom.jpg", @"E:\mzwucom.jpg");
while (ftp.DoDownload() > 0)
{
int perc = (int)(((ftp.BytesTotal) * 100) / ftp.FileSize);
Response.Write(perc.ToString() + "%<br/>");
Response.Flush();
}
ftp.Disconnect();
//文件列表
ArrayList list = ftp.ListFiles();
for (int i = 0; i < list.Count; i++)
{
Response.Write(list[i].ToString() + "<br/>");
}
//文件重命名
ftp.RenameFile("mzwucom.jpg", "test.jpg");
//刪除文件
ftp.RemoveFile("test.jpg");
//顯示錯誤信息
Response.Write(ftp.errormessage);