FTPClientHelper輔助類 實(shí)現(xiàn)文件上傳,目錄操作,下載等操作
文檔說(shuō)明
本文檔使用Socket通信方式來(lái)實(shí)現(xiàn)ftp文件的上傳下載等命令的執(zhí)行
1.基本介紹
由于最近的項(xiàng)目是客戶端的程序,需要將客戶端的圖片文件【切圖】-【打包】-【ftp上傳】,現(xiàn)在就差最后一步了,慢慢的把這些小功能實(shí)現(xiàn)了,合并到一起就是一個(gè)大功能了,所以一個(gè)業(yè)務(wù)需要拆分的很小很小才可以看清楚,這個(gè)項(xiàng)目實(shí)際需要用到哪些知識(shí)點(diǎn),下面介紹一下ftp上傳的命令
ftp命令的參考鏈接://www.jb51.net/article/12199.htm
ftp適合小文件上傳
對(duì)帶寬要求要求較高
服務(wù)器安全性也要考慮到
命令需要熟悉,不然比較難
2.實(shí)際項(xiàng)目
文件上傳
文件下載
刪除文件
創(chuàng)建文件夾
文件夾重命名
刪除文件夾
改變目錄
獲取文件夾中文件列表
等等
2.1 圖片上傳和下載
寫了幾個(gè)方法,一般用的最多的就是Put,具體的可以下載復(fù)制源碼下來(lái)進(jìn)行實(shí)戰(zhàn)一下。
2.2 目錄創(chuàng)建和刪除
這個(gè)方法今天剛好用上了,折騰了一會(huì),才搞定的。
3.調(diào)用代碼參考
由于這個(gè)幫助類不是靜態(tài)的,所以需要實(shí)例化
string userName = "xxx";
string password = "xxx";
var ftp = new FTPClientHelper("xxx", ".", userName, password, 1021);
下面還是調(diào)用常用的方法,就可以了,因?yàn)橘~號(hào)、密碼、服務(wù)器的IP地址都被我用“xxx”代替了,所以大家自己改下,還有ftp默認(rèn)端口號(hào)是:1021,如果有變動(dòng)還是需要自己改下的。
4.FTPClientHelper下載
//-------------------------------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2015 , ZTO , Ltd .
//-------------------------------------------------------------------------------------
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace ZTO.PicTest.Utilities
{
/// <summary>
/// FTP操作幫助類
///
/// 修改紀(jì)錄
///
/// 2016-4-4 版本:1.0 YangHengLian 創(chuàng)建主鍵,注意命名空間的排序,測(cè)試非常好。
///
/// 版本:1.0
///
/// <author>
/// <name>YangHengLian</name>
/// <date>2016-4-4</date>
/// </author>
/// </summary>
public class FTPClientHelper
{
public static object Obj = new object();
#region 構(gòu)造函數(shù)
/// <summary>
/// 缺省構(gòu)造函數(shù)
/// </summary>
public FTPClientHelper()
{
RemoteHost = "";
_strRemotePath = "";
_strRemoteUser = "";
_strRemotePass = "";
_strRemotePort = 21;
_bConnected = false;
}
/// <summary>
/// 構(gòu)造函數(shù)
/// </summary>
public FTPClientHelper(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)
{
// Ip地址
RemoteHost = remoteHost;
// 這個(gè)很重要,表示連接路徑,如果是.表示根目錄
_strRemotePath = remotePath;
// 登錄賬號(hào)
_strRemoteUser = remoteUser;
// 登錄密碼
_strRemotePass = remotePass;
// ftp端口號(hào)
_strRemotePort = remotePort;
Connect();
}
#endregion
#region 字段
private int _strRemotePort;
private Boolean _bConnected;
private string _strRemotePass;
private string _strRemoteUser;
private string _strRemotePath;
/// <summary>
/// 服務(wù)器返回的應(yīng)答信息(包含應(yīng)答碼)
/// </summary>
private string _strMsg;
/// <summary>
/// 服務(wù)器返回的應(yīng)答信息(包含應(yīng)答碼)
/// </summary>
private string _strReply;
/// <summary>
/// 服務(wù)器返回的應(yīng)答碼
/// </summary>
private int _iReplyCode;
/// <summary>
/// 進(jìn)行控制連接的socket
/// </summary>
private Socket _socketControl;
/// <summary>
/// 傳輸模式
/// </summary>
private TransferType _trType;
/// <summary>
/// 接收和發(fā)送數(shù)據(jù)的緩沖區(qū)
/// </summary>
private const int BlockSize = 512;
/// <summary>
/// 編碼方式
/// </summary>
readonly Encoding _ascii = Encoding.ASCII;
/// <summary>
/// 字節(jié)數(shù)組
/// </summary>
readonly Byte[] _buffer = new Byte[BlockSize];
#endregion
#region 屬性
/// <summary>
/// FTP服務(wù)器IP地址
/// </summary>
public string RemoteHost { get; set; }
/// <summary>
/// FTP服務(wù)器端口
/// </summary>
public int RemotePort
{
get
{
return _strRemotePort;
}
set
{
_strRemotePort = value;
}
}
/// <summary>
/// 當(dāng)前服務(wù)器目錄
/// </summary>
public string RemotePath
{
get
{
return _strRemotePath;
}
set
{
_strRemotePath = value;
}
}
/// <summary>
/// 登錄用戶賬號(hào)
/// </summary>
public string RemoteUser
{
set
{
_strRemoteUser = value;
}
}
/// <summary>
/// 用戶登錄密碼
/// </summary>
public string RemotePass
{
set
{
_strRemotePass = value;
}
}
/// <summary>
/// 是否登錄
/// </summary>
public bool Connected
{
get
{
return _bConnected;
}
}
#endregion
#region 鏈接
/// <summary>
/// 建立連接
/// </summary>
public void Connect()
{
lock (Obj)
{
_socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var ep = new IPEndPoint(IPAddress.Parse(RemoteHost), _strRemotePort);
try
{
_socketControl.Connect(ep);
}
catch (Exception)
{
throw new IOException("不能連接ftp服務(wù)器");
}
}
ReadReply();
if (_iReplyCode != 220)
{
DisConnect();
throw new IOException(_strReply.Substring(4));
}
SendCommand("USER " + _strRemoteUser);
if (!(_iReplyCode == 331 || _iReplyCode == 230))
{
CloseSocketConnect();
throw new IOException(_strReply.Substring(4));
}
if (_iReplyCode != 230)
{
SendCommand("PASS " + _strRemotePass);
if (!(_iReplyCode == 230 || _iReplyCode == 202))
{
CloseSocketConnect();
throw new IOException(_strReply.Substring(4));
}
}
_bConnected = true;
ChDir(_strRemotePath);
}
/// <summary>
/// 關(guān)閉連接
/// </summary>
public void DisConnect()
{
if (_socketControl != null)
{
SendCommand("QUIT");
}
CloseSocketConnect();
}
#endregion
#region 傳輸模式
/// <summary>
/// 傳輸模式:二進(jìn)制類型、ASCII類型
/// </summary>
public enum TransferType { Binary, ASCII };
/// <summary>
/// 設(shè)置傳輸模式
/// </summary>
/// <param name="ttType">傳輸模式</param>
public void SetTransferType(TransferType ttType)
{
SendCommand(ttType == TransferType.Binary ? "TYPE I" : "TYPE A");
if (_iReplyCode != 200)
{
throw new IOException(_strReply.Substring(4));
}
_trType = ttType;
}
/// <summary>
/// 獲得傳輸模式
/// </summary>
/// <returns>傳輸模式</returns>
public TransferType GetTransferType()
{
return _trType;
}
#endregion
#region 文件操作
/// <summary>
/// 獲得文件列表
/// </summary>
/// <param name="strMask">文件名的匹配字符串</param>
public string[] Dir(string strMask)
{
if (!_bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
SendCommand("NLST " + strMask);
if (!(_iReplyCode == 150 || _iReplyCode == 125 || _iReplyCode == 226))
{
throw new IOException(_strReply.Substring(4));
}
_strMsg = "";
Thread.Sleep(2000);
while (true)
{
int iBytes = socketData.Receive(_buffer, _buffer.Length, 0);
_strMsg += _ascii.GetString(_buffer, 0, iBytes);
if (iBytes < _buffer.Length)
{
break;
}
}
char[] seperator = { '\n' };
string[] strsFileList = _strMsg.Split(seperator);
socketData.Close(); //數(shù)據(jù)socket關(guān)閉時(shí)也會(huì)有返回碼
if (_iReplyCode != 226)
{
ReadReply();
if (_iReplyCode != 226)
{
throw new IOException(_strReply.Substring(4));
}
}
return strsFileList;
}
public void NewPutByGuid(string strFileName, string strGuid)
{
if (!_bConnected)
{
Connect();
}
string str = strFileName.Substring(0, strFileName.LastIndexOf("\\", StringComparison.Ordinal));
string strTypeName = strFileName.Substring(strFileName.LastIndexOf(".", StringComparison.Ordinal));
strGuid = str + "\\" + strGuid;
Socket socketData = CreateDataSocket();
SendCommand("STOR " + Path.GetFileName(strGuid));
if (!(_iReplyCode == 125 || _iReplyCode == 150))
{
throw new IOException(_strReply.Substring(4));
}
var input = new FileStream(strGuid, FileMode.Open);
input.Flush();
int iBytes;
while ((iBytes = input.Read(_buffer, 0, _buffer.Length)) > 0)
{
socketData.Send(_buffer, iBytes, 0);
}
input.Close();
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
ReadReply();
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
throw new IOException(_strReply.Substring(4));
}
}
}
/// <summary>
/// 獲取文件大小
/// </summary>
/// <param name="strFileName">文件名</param>
/// <returns>文件大小</returns>
public long GetFileSize(string strFileName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("SIZE " + Path.GetFileName(strFileName));
long lSize;
if (_iReplyCode == 213)
{
lSize = Int64.Parse(_strReply.Substring(4));
}
else
{
throw new IOException(_strReply.Substring(4));
}
return lSize;
}
/// <summary>
/// 獲取文件信息
/// </summary>
/// <param name="strFileName">文件名</param>
/// <returns>文件大小</returns>
public string GetFileInfo(string strFileName)
{
if (!_bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
SendCommand("LIST " + strFileName);
if (!(_iReplyCode == 150 || _iReplyCode == 125
|| _iReplyCode == 226 || _iReplyCode == 250))
{
throw new IOException(_strReply.Substring(4));
}
byte[] b = new byte[512];
MemoryStream ms = new MemoryStream();
while (true)
{
int iBytes = socketData.Receive(b, b.Length, 0);
ms.Write(b, 0, iBytes);
if (iBytes <= 0)
{
break;
}
}
byte[] bt = ms.GetBuffer();
string strResult = Encoding.ASCII.GetString(bt);
ms.Close();
return strResult;
}
/// <summary>
/// 刪除
/// </summary>
/// <param name="strFileName">待刪除文件名</param>
public void Delete(string strFileName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("DELE " + strFileName);
if (_iReplyCode != 250)
{
throw new IOException(_strReply.Substring(4));
}
}
/// <summary>
/// 重命名(如果新文件名與已有文件重名,將覆蓋已有文件)
/// </summary>
/// <param name="strOldFileName">舊文件名</param>
/// <param name="strNewFileName">新文件名</param>
public void Rename(string strOldFileName, string strNewFileName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("RNFR " + strOldFileName);
if (_iReplyCode != 350)
{
throw new IOException(_strReply.Substring(4));
}
// 如果新文件名與原有文件重名,將覆蓋原有文件
SendCommand("RNTO " + strNewFileName);
if (_iReplyCode != 250)
{
throw new IOException(_strReply.Substring(4));
}
}
#endregion
#region 上傳和下載
/// <summary>
/// 下載一批文件
/// </summary>
/// <param name="strFileNameMask">文件名的匹配字符串</param>
/// <param name="strFolder">本地目錄(不得以\結(jié)束)</param>
public void Get(string strFileNameMask, string strFolder)
{
if (!_bConnected)
{
Connect();
}
string[] strFiles = Dir(strFileNameMask);
foreach (string strFile in strFiles)
{
if (!strFile.Equals(""))//一般來(lái)說(shuō)strFiles的最后一個(gè)元素可能是空字符串
{
Get(strFile, strFolder, strFile);
}
}
}
/// <summary>
/// 下載一個(gè)文件
/// </summary>
/// <param name="strRemoteFileName">要下載的文件名</param>
/// <param name="strFolder">本地目錄(不得以\結(jié)束)</param>
/// <param name="strLocalFileName">保存在本地時(shí)的文件名</param>
public void Get(string strRemoteFileName, string strFolder, string strLocalFileName)
{
Socket socketData = CreateDataSocket();
try
{
if (!_bConnected)
{
Connect();
}
SetTransferType(TransferType.Binary);
if (strLocalFileName.Equals(""))
{
strLocalFileName = strRemoteFileName;
}
SendCommand("RETR " + strRemoteFileName);
if (!(_iReplyCode == 150 || _iReplyCode == 125 || _iReplyCode == 226 || _iReplyCode == 250))
{
throw new IOException(_strReply.Substring(4));
}
var output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
while (true)
{
int iBytes = socketData.Receive(_buffer, _buffer.Length, 0);
output.Write(_buffer, 0, iBytes);
if (iBytes <= 0)
{
break;
}
}
output.Close();
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
ReadReply();
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
throw new IOException(_strReply.Substring(4));
}
}
}
catch
{
socketData.Close();
_socketControl.Close();
_bConnected = false;
_socketControl = null;
}
}
/// <summary>
/// 下載一個(gè)文件
/// </summary>
/// <param name="strRemoteFileName">要下載的文件名</param>
/// <param name="strFolder">本地目錄(不得以\結(jié)束)</param>
/// <param name="strLocalFileName">保存在本地時(shí)的文件名</param>
public void GetNoBinary(string strRemoteFileName, string strFolder, string strLocalFileName)
{
if (!_bConnected)
{
Connect();
}
if (strLocalFileName.Equals(""))
{
strLocalFileName = strRemoteFileName;
}
Socket socketData = CreateDataSocket();
SendCommand("RETR " + strRemoteFileName);
if (!(_iReplyCode == 150 || _iReplyCode == 125 || _iReplyCode == 226 || _iReplyCode == 250))
{
throw new IOException(_strReply.Substring(4));
}
var output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
while (true)
{
int iBytes = socketData.Receive(_buffer, _buffer.Length, 0);
output.Write(_buffer, 0, iBytes);
if (iBytes <= 0)
{
break;
}
}
output.Close();
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
ReadReply();
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
throw new IOException(_strReply.Substring(4));
}
}
}
/// <summary>
/// 上傳一批文件
/// </summary>
/// <param name="strFolder">本地目錄(不得以\結(jié)束)</param>
/// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
public void Put(string strFolder, string strFileNameMask)
{
string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask);
foreach (string strFile in strFiles)
{
Put(strFile);
}
}
/// <summary>
/// 上傳一個(gè)文件
/// </summary>
/// <param name="strFileName">本地文件名</param>
public void Put(string strFileName)
{
if (!_bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
if (Path.GetExtension(strFileName) == "")
SendCommand("STOR " + Path.GetFileNameWithoutExtension(strFileName));
else
SendCommand("STOR " + Path.GetFileName(strFileName));
if (!(_iReplyCode == 125 || _iReplyCode == 150))
{
throw new IOException(_strReply.Substring(4));
}
var input = new FileStream(strFileName, FileMode.Open);
int iBytes;
while ((iBytes = input.Read(_buffer, 0, _buffer.Length)) > 0)
{
socketData.Send(_buffer, iBytes, 0);
}
input.Close();
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
ReadReply();
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
throw new IOException(_strReply.Substring(4));
}
}
}
/// <summary>
/// 上傳一個(gè)文件
/// </summary>
/// <param name="strFileName">本地文件名</param>
///
/// <param name="strGuid"> </param>
public void PutByGuid(string strFileName, string strGuid)
{
if (!_bConnected)
{
Connect();
}
string str = strFileName.Substring(0, strFileName.LastIndexOf("\\", StringComparison.Ordinal));
string strTypeName = strFileName.Substring(strFileName.LastIndexOf(".", System.StringComparison.Ordinal));
strGuid = str + "\\" + strGuid;
File.Copy(strFileName, strGuid);
File.SetAttributes(strGuid, FileAttributes.Normal);
Socket socketData = CreateDataSocket();
SendCommand("STOR " + Path.GetFileName(strGuid));
if (!(_iReplyCode == 125 || _iReplyCode == 150))
{
throw new IOException(_strReply.Substring(4));
}
var input = new FileStream(strGuid, FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
int iBytes = 0;
while ((iBytes = input.Read(_buffer, 0, _buffer.Length)) > 0)
{
socketData.Send(_buffer, iBytes, 0);
}
input.Close();
File.Delete(strGuid);
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
ReadReply();
if (!(_iReplyCode == 226 || _iReplyCode == 250))
{
throw new IOException(_strReply.Substring(4));
}
}
}
#endregion
#region 目錄操作
/// <summary>
/// 創(chuàng)建目錄
/// </summary>
/// <param name="strDirName">目錄名</param>
public void MkDir(string strDirName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("MKD " + strDirName);
if (_iReplyCode != 257)
{
throw new IOException(_strReply.Substring(4));
}
}
/// <summary>
/// 刪除目錄
/// </summary>
/// <param name="strDirName">目錄名</param>
public void RmDir(string strDirName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("RMD " + strDirName);
if (_iReplyCode != 250)
{
throw new IOException(_strReply.Substring(4));
}
}
/// <summary>
/// 改變目錄
/// </summary>
/// <param name="strDirName">新的工作目錄名</param>
public void ChDir(string strDirName)
{
if (strDirName.Equals(".") || strDirName.Equals(""))
{
return;
}
if (!_bConnected)
{
Connect();
}
SendCommand("CWD " + strDirName);
if (_iReplyCode != 250)
{
throw new IOException(_strReply.Substring(4));
}
this._strRemotePath = strDirName;
}
#endregion
#region 內(nèi)部函數(shù)
/// <summary>
/// 將一行應(yīng)答字符串記錄在strReply和strMsg,應(yīng)答碼記錄在iReplyCode
/// </summary>
private void ReadReply()
{
_strMsg = "";
_strReply = ReadLine();
_iReplyCode = Int32.Parse(_strReply.Substring(0, 3));
}
/// <summary>
/// 建立進(jìn)行數(shù)據(jù)連接的socket
/// </summary>
/// <returns>數(shù)據(jù)連接socket</returns>
private Socket CreateDataSocket()
{
SendCommand("PASV");
if (_iReplyCode != 227)
{
throw new IOException(_strReply.Substring(4));
}
int index1 = _strReply.IndexOf('(');
int index2 = _strReply.IndexOf(')');
string ipData = _strReply.Substring(index1 + 1, index2 - index1 - 1);
int[] parts = new int[6];
int len = ipData.Length;
int partCount = 0;
string buf = "";
for (int i = 0; i < len && partCount <= 6; i++)
{
char ch = Char.Parse(ipData.Substring(i, 1));
if (Char.IsDigit(ch))
buf += ch;
else if (ch != ',')
{
throw new IOException("Malformed PASV strReply: " + _strReply);
}
if (ch == ',' || i + 1 == len)
{
try
{
parts[partCount++] = Int32.Parse(buf);
buf = "";
}
catch (Exception)
{
throw new IOException("Malformed PASV strReply: " + _strReply);
}
}
}
string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3];
int port = (parts[4] << 8) + parts[5];
var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var ep = new IPEndPoint(IPAddress.Parse(ipAddress), port);
try
{
s.Connect(ep);
}
catch (Exception)
{
throw new IOException("無(wú)法連接ftp服務(wù)器");
}
return s;
}
/// <summary>
/// 關(guān)閉socket連接(用于登錄以前)
/// </summary>
private void CloseSocketConnect()
{
lock (Obj)
{
if (_socketControl != null)
{
_socketControl.Close();
_socketControl = null;
}
_bConnected = false;
}
}
/// <summary>
/// 讀取Socket返回的所有字符串
/// </summary>
/// <returns>包含應(yīng)答碼的字符串行</returns>
private string ReadLine()
{
lock (Obj)
{
while (true)
{
int iBytes = _socketControl.Receive(_buffer, _buffer.Length, 0);
_strMsg += _ascii.GetString(_buffer, 0, iBytes);
if (iBytes < _buffer.Length)
{
break;
}
}
}
char[] seperator = { '\n' };
string[] mess = _strMsg.Split(seperator);
if (_strMsg.Length > 2)
{
_strMsg = mess[mess.Length - 2];
}
else
{
_strMsg = mess[0];
}
if (!_strMsg.Substring(3, 1).Equals(" ")) //返回字符串正確的是以應(yīng)答碼(如220開頭,后面接一空格,再接問(wèn)候字符串)
{
return ReadLine();
}
return _strMsg;
}
/// <summary>
/// 發(fā)送命令并獲取應(yīng)答碼和最后一行應(yīng)答字符串
/// </summary>
/// <param name="strCommand">命令</param>
public void SendCommand(String strCommand)
{
lock (Obj)
{
Byte[] cmdBytes = Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
_socketControl.Send(cmdBytes, cmdBytes.Length, 0);
Thread.Sleep(100);
ReadReply();
}
}
#endregion
}
}
5.FTP常用的命令
#region 程序集 System.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll
#endregion
using System;
namespace System.Net
{
// 摘要:
// System.Net.WebRequestMethods.Ftp、System.Net.WebRequestMethods.File 和 System.Net.WebRequestMethods.Http
// 類的容器類。無(wú)法繼承此類
public static class WebRequestMethods
{
// 摘要:
// 表示可用于 FILE 請(qǐng)求的文件協(xié)議方法的類型。無(wú)法繼承此類。
public static class File
{
// 摘要:
// 表示用來(lái)從指定的位置檢索文件的 FILE GET 協(xié)議方法。
public const string DownloadFile = "GET";
//
// 摘要:
// 表示用來(lái)將文件復(fù)制到指定位置的 FILE PUT 協(xié)議方法。
public const string UploadFile = "PUT";
}
// 摘要:
// 表示可與 FTP 請(qǐng)求一起使用的 FTP 協(xié)議方法的類型。無(wú)法繼承此類。
public static class Ftp
{
// 摘要:
// 表示要用于將文件追加到 FTP 服務(wù)器上的現(xiàn)有文件的 FTP APPE 協(xié)議方法。
public const string AppendFile = "APPE";
//
// 摘要:
// 表示要用于刪除 FTP 服務(wù)器上的文件的 FTP DELE 協(xié)議方法。
public const string DeleteFile = "DELE";
//
// 摘要:
// 表示要用于從 FTP 服務(wù)器下載文件的 FTP RETR 協(xié)議方法。
public const string DownloadFile = "RETR";
//
// 摘要:
// 表示要用于從 FTP 服務(wù)器上的文件檢索日期時(shí)間戳的 FTP MDTM 協(xié)議方法。
public const string GetDateTimestamp = "MDTM";
//
// 摘要:
// 表示要用于檢索 FTP 服務(wù)器上的文件大小的 FTP SIZE 協(xié)議方法。
public const string GetFileSize = "SIZE";
//
// 摘要:
// 表示獲取 FTP 服務(wù)器上的文件的簡(jiǎn)短列表的 FTP NLIST 協(xié)議方法。
public const string ListDirectory = "NLST";
//
// 摘要:
// 表示獲取 FTP 服務(wù)器上的文件的詳細(xì)列表的 FTP LIST 協(xié)議方法。
public const string ListDirectoryDetails = "LIST";
//
// 摘要:
// 表示在 FTP 服務(wù)器上創(chuàng)建目錄的 FTP MKD 協(xié)議方法。
public const string MakeDirectory = "MKD";
//
// 摘要:
// 表示打印當(dāng)前工作目錄的名稱的 FTP PWD 協(xié)議方法。
public const string PrintWorkingDirectory = "PWD";
//
// 摘要:
// 表示移除目錄的 FTP RMD 協(xié)議方法。
public const string RemoveDirectory = "RMD";
//
// 摘要:
// 表示重命名目錄的 FTP RENAME 協(xié)議方法。
public const string Rename = "RENAME";
//
// 摘要:
// 表示將文件上載到 FTP 服務(wù)器的 FTP STOR 協(xié)議方法。
public const string UploadFile = "STOR";
//
// 摘要:
// 表示將具有唯一名稱的文件上載到 FTP 服務(wù)器的 FTP STOU 協(xié)議方法。
public const string UploadFileWithUniqueName = "STOU";
}
// 摘要:
// 表示可與 HTTP 請(qǐng)求一起使用的 HTTP 協(xié)議方法的類型。
public static class Http
{
// 摘要:
// 表示與代理一起使用的 HTTP CONNECT 協(xié)議方法,該代理可以動(dòng)態(tài)切換到隧道,如 SSL 隧道的情況。
public const string Connect = "CONNECT";
//
// 摘要:
// 表示一個(gè) HTTP GET 協(xié)議方法。
public const string Get = "GET";
//
// 摘要:
// 表示一個(gè) HTTP HEAD 協(xié)議方法。除了服務(wù)器在響應(yīng)中只返回消息頭不返回消息體以外,HEAD 方法和 GET 是一樣的。
public const string Head = "HEAD";
//
// 摘要:
// 表示一個(gè) HTTP MKCOL 請(qǐng)求,該請(qǐng)求在請(qǐng)求 URI(統(tǒng)一資源標(biāo)識(shí)符)指定的位置新建集合,如頁(yè)的集合。
public const string MkCol = "MKCOL";
//
// 摘要:
// 表示一個(gè) HTTP POST 協(xié)議方法,該方法用于將新實(shí)體作為補(bǔ)充發(fā)送到某個(gè) URI。
public const string Post = "POST";
//
// 摘要:
// 表示一個(gè) HTTP PUT 協(xié)議方法,該方法用于替換 URI 標(biāo)識(shí)的實(shí)體。
public const string Put = "PUT";
}
}
}
以上就是本文的全部?jī)?nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持我們。
上一篇:C#遞歸算法之分而治之策略
欄 目:C#教程
下一篇:C#中數(shù)組Array,ArrayList,泛型List詳細(xì)對(duì)比
本文標(biāo)題:FTPClientHelper輔助類 實(shí)現(xiàn)文件上傳,目錄操作,下載等操作
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6428.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)實(shí)體類與字符串互相轉(zhuǎn)換的方法
- 01-10C#通過(guò)Semaphore類控制線程隊(duì)列的方法
- 01-10C#3.0使用EventLog類寫Windows事件日志的方法
- 01-10C#操作ftp類完整實(shí)例
- 01-10winform簡(jiǎn)單緩存類實(shí)例
- 01-10C#實(shí)現(xiàn)控制攝像頭的類
- 01-10WPF實(shí)現(xiàn)類似360安全衛(wèi)士界面的程序源碼分享
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二
- 01-10C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量三
- 01-10C#編程自學(xué)之類和對(duì)象


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載


