java ftpclient quit_FTPClient
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;
using System.Threading;
public class FTPClient
{
public static object obj = new object();
#region 構(gòu)造函數(shù)
///
/// 缺省構(gòu)造函數(shù)
///
public FTPClient()
{
strRemoteHost = "";
strRemotePath = "";
strRemoteUser = "";
strRemotePass = "";
strRemotePort = 21;
bConnected = false;
}
///
/// 構(gòu)造函數(shù)
///
public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)
{
strRemoteHost = remoteHost;
strRemotePath = remotePath;
strRemoteUser = remoteUser;
strRemotePass = remotePass;
strRemotePort = remotePort;
Connect();
}
#endregion
#region 字段
private int strRemotePort;
private Boolean bConnected;
private string strRemoteHost;
private string strRemotePass;
private string strRemoteUser;
private string strRemotePath;
///
/// 服務(wù)器返回的應(yīng)答信息(包含應(yīng)答碼)
///
private string strMsg;
///
/// 服務(wù)器返回的應(yīng)答信息(包含應(yīng)答碼)
///
private string strReply;
///
/// 服務(wù)器返回的應(yīng)答碼
///
private int iReplyCode;
///
/// 進(jìn)行控制連接的socket
///
private Socket socketControl;
///
/// 傳輸模式
///
private TransferType trType;
///
/// 接收和發(fā)送數(shù)據(jù)的緩沖區(qū)
///
private static int BLOCK_SIZE = 512;
///
/// 編碼方式
///
Encoding ASCII = Encoding.ASCII;
///
/// 字節(jié)數(shù)組
///
Byte[] buffer = new Byte[BLOCK_SIZE];
#endregion
#region 屬性
///
/// FTP服務(wù)器IP地址
///
public string RemoteHost
{
get
{
return strRemoteHost;
}
set
{
strRemoteHost = value;
}
}
///
/// FTP服務(wù)器端口
///
public int RemotePort
{
get
{
return strRemotePort;
}
set
{
strRemotePort = value;
}
}
///
/// 當(dāng)前服務(wù)器目錄
///
public string RemotePath
{
get
{
return strRemotePath;
}
set
{
strRemotePath = value;
}
}
///
/// 登錄用戶(hù)賬號(hào)
///
public string RemoteUser
{
set
{
strRemoteUser = value;
}
}
///
/// 用戶(hù)登錄密碼
///
public string RemotePass
{
set
{
strRemotePass = value;
}
}
///
/// 是否登錄
///
public bool Connected
{
get
{
return bConnected;
}
}
#endregion
#region 鏈接
///
/// 建立連接
///
public void Connect()
{
lock (obj)
{
socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint 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);
}
///
/// 關(guān)閉連接
///
public void DisConnect()
{
if (socketControl != null)
{
SendCommand("QUIT");
}
CloseSocketConnect();
}
#endregion
#region 傳輸模式
///
/// 傳輸模式:二進(jìn)制類(lèi)型、ASCII類(lèi)型
///
public enum TransferType { Binary, ASCII };
///
/// 設(shè)置傳輸模式
///
/// 傳輸模式
public void SetTransferType(TransferType ttType)
{
if (ttType == TransferType.Binary)
{
SendCommand("TYPE I");//binary類(lèi)型傳輸
}
else
{
SendCommand("TYPE A");//ASCII類(lèi)型傳輸
}
if (iReplyCode != 200)
{
throw new IOException(strReply.Substring(4));
}
else
{
trType = ttType;
}
}
///
/// 獲得傳輸模式
///
/// 傳輸模式
public TransferType GetTransferType()
{
return trType;
}
#endregion
#region 文件操作
///
/// 獲得文件列表
///
/// 文件名的匹配字符串
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("\\"));
string strTypeName = strFileName.Substring(strFileName.LastIndexOf("."));
strGuid = str + "\\" + strGuid;
Socket socketData = CreateDataSocket();
SendCommand("STOR " + Path.GetFileName(strGuid));
if (!(iReplyCode == 125 || iReplyCode == 150))
{
throw new IOException(strReply.Substring(4));
}
FileStream input = new FileStream(strGuid, FileMode.Open);
input.Flush();
int iBytes = 0;
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));
}
}
}
///
/// 獲取文件大小
///
/// 文件名
/// 文件大小
public long GetFileSize(string strFileName)
{
if (!bConnected)
{
Connect();
}
SendCommand("SIZE " + Path.GetFileName(strFileName));
long lSize = 0;
if (iReplyCode == 213)
{
lSize = Int64.Parse(strReply.Substring(4));
}
else
{
throw new IOException(strReply.Substring(4));
}
return lSize;
}
///
/// 獲取文件信息
///
/// 文件名
/// 文件大小
public string GetFileInfo(string strFileName)
{
if (!bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
SendCommand("LIST " + strFileName);
string strResult = "";
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();
strResult = System.Text.Encoding.ASCII.GetString(bt);
ms.Close();
return strResult;
}
///
/// 刪除
///
/// 待刪除文件名
public void Delete(string strFileName)
{
if (!bConnected)
{
Connect();
}
SendCommand("DELE " + strFileName);
if (iReplyCode != 250)
{
throw new IOException(strReply.Substring(4));
}
}
///
/// 重命名(如果新文件名與已有文件重名,將覆蓋已有文件)
///
/// 舊文件名
/// 新文件名
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 上傳和下載
///
/// 下載一批文件
///
/// 文件名的匹配字符串
/// 本地目錄(不得以\結(jié)束)
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);
}
}
}
///
/// 下載一個(gè)文件
///
/// 要下載的文件名
/// 本地目錄(不得以\結(jié)束)
/// 保存在本地時(shí)的文件名
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));
}
FileStream 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();
socketData = null;
socketControl.Close();
bConnected = false;
socketControl = null;
}
}
///
/// 下載一個(gè)文件
///
/// 要下載的文件名
/// 本地目錄(不得以\結(jié)束)
/// 保存在本地時(shí)的文件名
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));
}
FileStream 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));
}
}
}
///
/// 上傳一批文件
///
/// 本地目錄(不得以\結(jié)束)
/// 文件名匹配字符(可以包含*和?)
public void Put(string strFolder, string strFileNameMask)
{
string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask);
foreach (string strFile in strFiles)
{
Put(strFile);
}
}
///
/// 上傳一個(gè)文件
///
/// 本地文件名
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));
}
FileStream input = new FileStream(strFileName, FileMode.Open);
int iBytes = 0;
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));
}
}
}
///
/// 上傳一個(gè)文件
///
/// 本地文件名
public void PutByGuid(string strFileName, string strGuid)
{
if (!bConnected)
{
Connect();
}
string str = strFileName.Substring(0, strFileName.LastIndexOf("\\"));
string strTypeName = strFileName.Substring(strFileName.LastIndexOf("."));
strGuid = str + "\\" + strGuid;
System.IO.File.Copy(strFileName, strGuid);
System.IO.File.SetAttributes(strGuid, System.IO.FileAttributes.Normal);
Socket socketData = CreateDataSocket();
SendCommand("STOR " + Path.GetFileName(strGuid));
if (!(iReplyCode == 125 || iReplyCode == 150))
{
throw new IOException(strReply.Substring(4));
}
FileStream 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 目錄操作
///
/// 創(chuàng)建目錄
///
/// 目錄名
public void MkDir(string strDirName)
{
if (!bConnected)
{
Connect();
}
SendCommand("MKD " + strDirName);
if (iReplyCode != 257)
{
throw new IOException(strReply.Substring(4));
}
}
///
/// 刪除目錄
///
/// 目錄名
public void RmDir(string strDirName)
{
if (!bConnected)
{
Connect();
}
SendCommand("RMD " + strDirName);
if (iReplyCode != 250)
{
throw new IOException(strReply.Substring(4));
}
}
///
/// 改變目錄
///
/// 新的工作目錄名
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ù)
///
/// 將一行應(yīng)答字符串記錄在strReply和strMsg,應(yīng)答碼記錄在iReplyCode
///
private void ReadReply()
{
strMsg = "";
strReply = ReadLine();
iReplyCode = Int32.Parse(strReply.Substring(0, 3));
}
///
/// 建立進(jìn)行數(shù)據(jù)連接的socket
///
/// 數(shù)據(jù)連接socket
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];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port);
try
{
s.Connect(ep);
}
catch (Exception)
{
throw new IOException("無(wú)法連接ftp服務(wù)器");
}
return s;
}
///
/// 關(guān)閉socket連接(用于登錄以前)
///
private void CloseSocketConnect()
{
lock (obj)
{
if (socketControl != null)
{
socketControl.Close();
socketControl = null;
}
bConnected = false;
}
}
///
/// 讀取Socket返回的所有字符串
///
/// 包含應(yīng)答碼的字符串行
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開(kāi)頭,后面接一空格,再接問(wèn)候字符串)
{
return ReadLine();
}
return strMsg;
}
///
/// 發(fā)送命令并獲取應(yīng)答碼和最后一行應(yīng)答字符串
///
/// 命令
public void SendCommand(String strCommand)
{
lock (obj)
{
Byte[] cmdBytes = Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
socketControl.Send(cmdBytes, cmdBytes.Length, 0);
Thread.Sleep(500);
ReadReply();
}
}
#endregion
}
超強(qiáng)干貨來(lái)襲 云風(fēng)專(zhuān)訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的java ftpclient quit_FTPClient的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑卡顿终结者,傲腾内存32g秒杀高速
- 下一篇: 内存插槽选择与安装:你真的了解吗?