ftp.Connect(); if (ftp.Connected) { ListFiles(new DirectoryInfo(path);); } public void ListFiles(FileSystemInfo info) { if (!info.Exists) return; DirectoryInfo dir = info as DirectoryInfo;
if (dir == null) return; FileSystemInfo[] files = dir.GetFileSystemInfos(); for (int i = 0; i < files.Length; i++) { FileInfo file = files[i] as FileInfo; //是文件 if (file != null) { ftp.Put(file.FullName);//上传文件 } //对于子目录,进行递归调用 else { ftp.MkDir(files[i].Name);//新建目录 ftp.ChDir(files[i].Name);//进入该目录 ListFiles(files[i]); ftp.ChDir("..");//返回上一级目录 } } }
获得某一目录下第一级的所有文件和文件夹列表,很容易办到: DirectoryInfo di=new DirectoryInfo(strBaseDir);//strBaseDir是起始目录,绝对地址 DirectoryInfo[] diA=di.GetDirectories();//获得了所有一级子目录 FileInfo[] fiA=di.GetFiles();//获得了所有起始目录下的文件 要是想获得某一目录下的所有文件和目录(包含所有子目录),那该怎么办呢?目录都是一层套一层的,我们不能预知某个目录的深度,只有获得了父节点,才有可能了解子节点,解决这个问题,只有递归这个概念了。 那么什么是递归呢?请不会C语言的朋友先去看书吧,我这里只简单的说一下我的理解:递归就是一个方法,在这个方法里面,再次调用它本身这个方法,从而描述了某一事物运作的深度…… - - 不废话了,看代码吧: public ArrayList al=new ArrayList(); //我把ArrayList当成动态数组用,非常好用 public void GetAllDirList(string strBaseDir) { DirectoryInfo di=new DirectoryInfo(strBaseDir); DirectoryInfo[] diA=di.GetDirectories(); for(int i=0;i<diA.Length;i++) { al.Add(diA[i].FullName); //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中 GetAllDirList(diA[i].FullName); //注意:递归了。逻辑思维正常的人应该能反应过来 } }最后,如何把所有目录信息从ArrayList中取出来呢?如下: for(int i=0;i<al.Count;i++) { textBox1.AppendText(al[i].ToString()+" "); //textBox1是容器,拷贝我的代码,注意要换一个你自己的容器 } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Collections;namespace bianlimulu { public partial class Form1 : Form { public ArrayList a1 = new ArrayList(); //引用是 using System.Collections; public void GetAllDirList(string strBaseDir) { DirectoryInfo di = new DirectoryInfo(strBaseDir); //引用using System.IO; DirectoryInfo[] diA = di.GetDirectories(); for(int i = 0; i < diA.Length; i++) { a1.Add(diA[i].FullName); GetAllDirList(diA[i].FullName); } } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { DialogResult aa = folderBrowserDialog1.ShowDialog(); if (aa == DialogResult.OK) { textBox1.Text = folderBrowserDialog1.SelectedPath; GetAllDirList(textBox1.Text); for (int i = 0; i < a1.Count; i++) { listBox1.Items.Add(a1[i].ToString() + " "); } /*得到一成目录和当前的文件 DirectoryInfo di = new DirectoryInfo(textBox1.Text); DirectoryInfo[] diA = di.GetDirectories(); FileInfo[] fiA = di.GetFiles(); listBox1.Items.AddRange(diA); listBox1.Items.AddRange(fiA); */ } } } } using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO;public partial class index : System.Web.UI.Page { public ArrayList al = new ArrayList(); public int aaa = 0; public void GetAllDirList(string strBaseDir) { DirectoryInfo di = new DirectoryInfo(strBaseDir); DirectoryInfo[] diA = di.GetDirectories(); if(aaa==0) { FileInfo[] fis2 = di.GetFiles(); //有关目录下的文件 for (int i2 = 0; i2 < fis2.Length; i2++) { al.Add(fis2[i2].FullName); //fis2[i2].FullName是根目录中文件的绝对地址,把它记录在ArrayList中 } } for (int i = 0; i < diA.Length; i++) { aaa++; al.Add(diA[i].FullName + "\t<目录>"); //diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中 DirectoryInfo di1 = new DirectoryInfo(diA[i].FullName); DirectoryInfo[] diA1 = di1.GetDirectories(); FileInfo[] fis1 = di1.GetFiles(); //有关目录下的文件 for (int ii = 0; ii < fis1.Length;ii++ ) { al.Add(fis1[ii].FullName); //fis1[ii].FullName是某个子目录中文件的绝对地址,把它记录在ArrayList中 } GetAllDirList(diA[i].FullName); //注意:递归了。逻辑思维正常的人应该能反应过来 }
//exeFile为服务器winRAR exe文件地址,比如"C:\Program Files\WinRAR\WinRAR.exe"
public static void UnZip(string exeFile,string folder,string filePath)
{
//解压Rar文件
System.Diagnostics.Process Process1=new Process();
Process1.StartInfo.FileName = exeFile;
Directory.CreateDirectory(folder); //创建解压文件夹
Process1.StartInfo.Arguments = " x -inul -y " + filePath + " " + folder;
Process1.Start();//解压开始
while(!Process1.HasExited) //等待解压的完成
{
}
File.Delete(filePath);//删除rar文件
}
ftp.Connect();
if (ftp.Connected)
{
ListFiles(new DirectoryInfo(path););
}
public void ListFiles(FileSystemInfo info)
{
if (!info.Exists) return; DirectoryInfo dir = info as DirectoryInfo;
if (dir == null) return; FileSystemInfo[] files = dir.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
FileInfo file = files[i] as FileInfo;
//是文件
if (file != null)
{
ftp.Put(file.FullName);//上传文件
}
//对于子目录,进行递归调用
else
{
ftp.MkDir(files[i].Name);//新建目录
ftp.ChDir(files[i].Name);//进入该目录
ListFiles(files[i]);
ftp.ChDir("..");//返回上一级目录
}
}
}
获得某一目录下第一级的所有文件和文件夹列表,很容易办到:
DirectoryInfo di=new DirectoryInfo(strBaseDir);//strBaseDir是起始目录,绝对地址
DirectoryInfo[] diA=di.GetDirectories();//获得了所有一级子目录
FileInfo[] fiA=di.GetFiles();//获得了所有起始目录下的文件
要是想获得某一目录下的所有文件和目录(包含所有子目录),那该怎么办呢?目录都是一层套一层的,我们不能预知某个目录的深度,只有获得了父节点,才有可能了解子节点,解决这个问题,只有递归这个概念了。
那么什么是递归呢?请不会C语言的朋友先去看书吧,我这里只简单的说一下我的理解:递归就是一个方法,在这个方法里面,再次调用它本身这个方法,从而描述了某一事物运作的深度…… - - 不废话了,看代码吧:
public ArrayList al=new ArrayList();
//我把ArrayList当成动态数组用,非常好用
public void GetAllDirList(string strBaseDir)
{
DirectoryInfo di=new DirectoryInfo(strBaseDir);
DirectoryInfo[] diA=di.GetDirectories();
for(int i=0;i<diA.Length;i++)
{
al.Add(diA[i].FullName);
//diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
GetAllDirList(diA[i].FullName);
//注意:递归了。逻辑思维正常的人应该能反应过来
}
}最后,如何把所有目录信息从ArrayList中取出来呢?如下:
for(int i=0;i<al.Count;i++)
{
textBox1.AppendText(al[i].ToString()+" ");
//textBox1是容器,拷贝我的代码,注意要换一个你自己的容器
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;namespace bianlimulu
{
public partial class Form1 : Form
{ public ArrayList a1 = new ArrayList(); //引用是 using System.Collections;
public void GetAllDirList(string strBaseDir)
{
DirectoryInfo di = new DirectoryInfo(strBaseDir); //引用using System.IO;
DirectoryInfo[] diA = di.GetDirectories();
for(int i = 0; i < diA.Length; i++)
{
a1.Add(diA[i].FullName);
GetAllDirList(diA[i].FullName);
}
}
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
DialogResult aa = folderBrowserDialog1.ShowDialog();
if (aa == DialogResult.OK)
{
textBox1.Text = folderBrowserDialog1.SelectedPath;
GetAllDirList(textBox1.Text); for (int i = 0; i < a1.Count; i++)
{
listBox1.Items.Add(a1[i].ToString() + " ");
} /*得到一成目录和当前的文件
DirectoryInfo di = new DirectoryInfo(textBox1.Text);
DirectoryInfo[] diA = di.GetDirectories();
FileInfo[] fiA = di.GetFiles();
listBox1.Items.AddRange(diA);
listBox1.Items.AddRange(fiA);
*/ }
}
}
}
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;public partial class index : System.Web.UI.Page
{
public ArrayList al = new ArrayList();
public int aaa = 0;
public void GetAllDirList(string strBaseDir)
{
DirectoryInfo di = new DirectoryInfo(strBaseDir);
DirectoryInfo[] diA = di.GetDirectories();
if(aaa==0)
{
FileInfo[] fis2 = di.GetFiles(); //有关目录下的文件
for (int i2 = 0; i2 < fis2.Length; i2++)
{
al.Add(fis2[i2].FullName);
//fis2[i2].FullName是根目录中文件的绝对地址,把它记录在ArrayList中
}
}
for (int i = 0; i < diA.Length; i++)
{
aaa++;
al.Add(diA[i].FullName + "\t<目录>");
//diA[i].FullName是某个子目录的绝对地址,把它记录在ArrayList中
DirectoryInfo di1 = new DirectoryInfo(diA[i].FullName);
DirectoryInfo[] diA1 = di1.GetDirectories();
FileInfo[] fis1 = di1.GetFiles(); //有关目录下的文件
for (int ii = 0; ii < fis1.Length;ii++ )
{
al.Add(fis1[ii].FullName);
//fis1[ii].FullName是某个子目录中文件的绝对地址,把它记录在ArrayList中 }
GetAllDirList(diA[i].FullName);
//注意:递归了。逻辑思维正常的人应该能反应过来
}
} protected void Page_Load(object sender, EventArgs e)
{ }
protected void Button1_Click(object sender, EventArgs e)
{
if (this.TextBox2.Text=="")
{
this.Response.Write("<script>alert('路径不能为空!');</script>");
return;
}
TextBox1.Text = "";
DirectoryInfo d = new DirectoryInfo(TextBox2.Text);
//如果目录错误
if (d == null)
return; try
{
System.IO.DirectoryInfo[] dir = d.GetDirectories();
foreach (DirectoryInfo fi in dir) //有关目录下的目录
{
TextBox1.Text = TextBox1.Text + fi.Name.ToString() + "\t<目录>\r\n";//如果你要再处理目录下的目录。递归一下本代码.
}
FileInfo[] fis = d.GetFiles(); //有关目录下的文件
foreach (FileInfo fi in fis)
{
TextBox1.Text = TextBox1.Text + fi.Name.ToString() + "\r\n"; }
}
catch
{
this.Response.Write("<script>alert('路径书写错误!');</script>");
return; }
}
protected void Button2_Click(object sender, EventArgs e)
{
if (this.TextBox2.Text == "")
{
this.Response.Write("<script>alert('路径不能为空!');</script>");
return;
}
TextBox1.Text = "";
try
{
this.GetAllDirList(this.TextBox2.Text.ToString());
for (int i = 0; i < al.Count; i++)
{
TextBox1.Text = TextBox1.Text.ToString() + (al[i].ToString() + " \r\n");
//TextBox1是容器,拷贝我的代码,注意要换一个你自己的容器
}
}
catch
{
this.Response.Write("<script>alert('路径书写错误!');</script>");
return; }
}
}
(),这样可以对子目录用递归来继续遍历。
public void FindAllFile(string path)
{
DirectoryInfo[] ChildDirectory;//子目录集
FileInfo[] NewFileInfo;//当前所有文件
DirectoryInfo FatherDirectory=new DirectoryInfo(path); //当前目录
ChildDirectory=FatherDirectory.GetDirectories("*.*"); //得到子目录集
NewFileInfo=FatherDirectory.GetFiles();//得到文件集,可以进行操作
foreach(DirectoryInfo dirInfo in ChildDirectory)
{
FindAllFile(dirInfo.FullName);
}
}
using System;
using System.IO;//目录遍历static public void ListDirectory(string strFullPathName)
{
DirectoryInfo dir = new DirectoryInfo(strFullPathName);
DirectoryInfo[] dirSubs = dir.GetDirectories(); //遍历子目录
foreach(DirectoryInfo dirSub in dirSubs)
{
if((dirSub.Attributes & FileAttributes.System) == FileAttributes.System)
Console.Write("[系统目录]"); if((dirSub.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
Console.Write("[隐藏目录]"); // 输出目录名
Console.WriteLine(dirSub.FullName); // 递归调用ListDirectory
ListDirectory(dirSub.FullName);
} //获取目录中的文件 FileInfo[] files=dir.GetFiles();
foreach(FileInfo file in files)
{
if((file.Attributes & FileAttributes.System) == FileAttributes.System)
Console.Write("[系统文件]"); if((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
Console.Write("[隐藏文件]"); // 输出文件名
Console.WriteLine(file.Name);
}
}// 调用
ListDirectory("c:\windows");
/// <summary>
/// 下载一个文件
/// </summary>
/// <param name="strRemoteFileName">要下载的文件名</param>
/// <param name="strFolder">本地目录(不得以\结束)</param>
/// <param name="strLocalFileName">保存在本地时的文件名</param>
public void Get(string strRemoteFileName,string strFolder,string strLocalFileName)
{
if(!bConnected)
{
Connect();
}
SetTransferType(TransferType.Binary);
if (strLocalFileName.Equals(""))
{
strLocalFileName = strRemoteFileName;
}
if(!File.Exists(strLocalFileName))
{
Stream st = File.Create(strLocalFileName);
st.Close();
}
FileStream output = new
FileStream(strFolder + "\\" + strLocalFileName,FileMode.Create);
Socket socketData = CreateDataSocket();
SendCommand("RETR " + strRemoteFileName);
if(!(iReplyCode == 150 || iReplyCode == 125
|| iReplyCode == 226 || iReplyCode == 250))
{
throw new IOException(strReply.Substring(4));
}
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">本地目录(不得以\结束)</param>
/// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
public void Put(string strFolder,string strFileNameMask)
{
string[] strFiles = Directory.GetFiles(strFolder,strFileNameMask);
foreach(string strFile in strFiles)
{
//strFile是完整的文件名(包含路径)
Put(strFile);
}
}
/// <summary>
/// </summary>
/// <param name="strFileName">本地文件名</param>
public void Put(string strFileName)
{
if(!bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
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));
}
}
}
#endregion
#region 目录操作
/// <summary>
/// 创建目录
/// </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 内部变量
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string strMsg;
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string strReply;
/// <summary>
/// 服务器返回的应答码
/// </summary>
private int iReplyCode;
/// <summary>
/// 进行控制连接的socket
/// </summary>
private Socket socketControl;
/// <summary>
/// 传输模式
/// </summary>
private TransferType trType;
/// <summary>
/// 接收和发送数据的缓冲区
/// </summary>
private static int BLOCK_SIZE = 512;
Byte[] buffer = new Byte[BLOCK_SIZE];
/// <summary>
/// 编码方式
/// </summary>
Encoding ASCII = Encoding.ASCII;
#endregion
#region 内部函数
/// <summary>
/// 将一行应答字符串记录在strReply和strMsg
/// 应答码记录在iReplyCode
/// </summary>
private void ReadReply()
{
strMsg = "";
strReply = ReadLine();
iReplyCode = Int32.Parse(strReply.Substring(0,3));
} /// <summary>
/// 建立进行数据连接的socket
/// </summary>
/// <returns>数据连接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];
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("Can't connect to remote server");
}
return s;
}
/// <summary>
/// 关闭socket连接(用于登录以前)
/// </summary>
private void CloseSocketConnect()
{
if(socketControl!=null)
{
socketControl.Close();
socketControl = null;
}
bConnected = false;
}/// <summary>
/// 读取Socket返回的所有字符串
/// </summary>
/// <returns>包含应答码的字符串行</returns>
private string ReadLine()
{
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];
//seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,
//但也会分配为空字符串给后面(也是最后一个)字符串数组,
//所以最后一个mess是没用的空字符串
//但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格
}
else
{
strMsg = mess[0];
}
if(!strMsg.Substring(3,1).Equals(" "))//返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
{
return ReadLine();
}
return strMsg;
}
/// <summary>
/// 发送命令并获取应答码和最后一行应答字符串
/// </summary>
/// <param name="strCommand">命令</param>
private void SendCommand(String strCommand)
{
//Byte[] cmdBytes =
// Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
byte[] cmdBytes = Encoding.GetEncoding("gb2312").GetBytes((strCommand + "\r\n").ToCharArray());
socketControl.Send(cmdBytes, cmdBytes.Length, 0);
ReadReply();
}
#endregion
}
/// </summary>
/// <param name="strFileName">本地文件名</param>
public void Put(string strFileName)
{
if(!bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
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));
}
}
}
#endregion
#region 目录操作
/// <summary>
/// 创建目录
/// </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 内部变量
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string strMsg;
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string strReply;
/// <summary>
/// 服务器返回的应答码
/// </summary>
private int iReplyCode;
/// <summary>
/// 进行控制连接的socket
/// </summary>
private Socket socketControl;
/// <summary>
/// 传输模式
/// </summary>
private TransferType trType;
/// <summary>
/// 接收和发送数据的缓冲区
/// </summary>
private static int BLOCK_SIZE = 512;
Byte[] buffer = new Byte[BLOCK_SIZE];
/// <summary>
/// 编码方式
/// </summary>
Encoding ASCII = Encoding.ASCII;
#endregion
#region 内部函数
/// <summary>
/// 将一行应答字符串记录在strReply和strMsg
/// 应答码记录在iReplyCode
/// </summary>
private void ReadReply()
{
strMsg = "";
strReply = ReadLine();
iReplyCode = Int32.Parse(strReply.Substring(0,3));
} /// <summary>
/// 建立进行数据连接的socket
/// </summary>
/// <returns>数据连接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];
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("Can't connect to remote server");
}
return s;
}
/// <summary>
/// 关闭socket连接(用于登录以前)
/// </summary>
private void CloseSocketConnect()
{
if(socketControl!=null)
{
socketControl.Close();
socketControl = null;
}
bConnected = false;
}/// <summary>
/// 读取Socket返回的所有字符串
/// </summary>
/// <returns>包含应答码的字符串行</returns>
private string ReadLine()
{
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];
//seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,
//但也会分配为空字符串给后面(也是最后一个)字符串数组,
//所以最后一个mess是没用的空字符串
//但为什么不直接取mess[0],因为只有最后一行字符串应答码与信息之间有空格
}
else
{
strMsg = mess[0];
}
if(!strMsg.Substring(3,1).Equals(" "))//返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
{
return ReadLine();
}
return strMsg;
}
/// <summary>
/// 发送命令并获取应答码和最后一行应答字符串
/// </summary>
/// <param name="strCommand">命令</param>
private void SendCommand(String strCommand)
{
//Byte[] cmdBytes =
// Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
byte[] cmdBytes = Encoding.GetEncoding("gb2312").GetBytes((strCommand + "\r\n").ToCharArray());
socketControl.Send(cmdBytes, cmdBytes.Length, 0);
ReadReply();
}
#endregion
}