如何用C#获取FTP服务器文件列表?
请高手指点,谢谢!
[解决办法]
vs2005有一个专门的ftp类,你仔细看看,里面应该有方法
[解决办法]
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;
namespace zhangyuk.net.csdn.blog.ftpclient
{
/// <summary>
/// FTP Client
/// </summary>
public class FTPClient
{
#region 构造函数
/// <summary>
/// 缺省构造函数
/// </summary>
public FTPClient()
{
strRemoteHost = " ";
strRemotePath = " ";
strRemoteUser = " ";
strRemotePass = " ";
strRemotePort = 21;
bConnected = false;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name= "remoteHost "> </param>
/// <param name= "remotePath "> </param>
/// <param name= "remoteUser "> </param>
/// <param name= "remotePass "> </param>
/// <param name= "remotePort "> </param>
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 登陆
/// <summary>
/// FTP服务器IP地址
/// </summary>
private string strRemoteHost;
public string RemoteHost
{
get
{
return strRemoteHost;
}
set
{
strRemoteHost = value;
}
}
/// <summary>
/// FTP服务器端口
/// </summary>
private int strRemotePort;
public int RemotePort
{
get
{
return strRemotePort;
}
set
{
strRemotePort = value;
}
}
/// <summary>
/// 当前服务器目录
/// </summary>
private string strRemotePath;
public string RemotePath
{
get
{
return strRemotePath;
}
set
{
strRemotePath = value;
}
}
/// <summary>
/// 登录用户账号
/// </summary>
private string strRemoteUser;
public string RemoteUser
{
set
{
strRemoteUser = value;
}
}
/// <summary>
/// 用户登录密码
/// </summary>
private string strRemotePass;
public string RemotePass
{
set
{
strRemotePass = value;
}
}
/// <summary>
/// 是否登录
/// </summary>
private Boolean bConnected;
public bool Connected
{
get
{
return bConnected;
}
}
#endregion
[解决办法]
#region 链接
/// <summary>
/// 建立连接
/// </summary>
public void Connect()
{
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( "Couldn 't connect to remote server ");
}
// 获取应答码
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>
/// 关闭连接
/// </summary>
public void DisConnect()
{
if( socketControl != null )
{
SendCommand( "QUIT ");
}
CloseSocketConnect();
}
#endregion
#region 传输模式
/// <summary>
/// 传输模式:二进制类型、ASCII类型
/// </summary>
public enum TransferType {Binary,ASCII};
/// <summary>
/// 设置传输模式
/// </summary>
/// <param name= "ttType "> 传输模式 </param>
public void SetTransferType(TransferType ttType)
{
if(ttType == TransferType.Binary)
{
SendCommand( "TYPE I ");//binary类型传输
}
else
{
SendCommand( "TYPE A ");//ASCII类型传输
}
if (iReplyCode != 200)
{
throw new IOException(strReply.Substring(4));
}
else
{
trType = ttType;
}
}
/// <summary>
/// 获得传输模式
/// </summary>
/// <returns> 传输模式 </returns>
public TransferType GetTransferType()
{
return trType;
}
#endregion
[解决办法]
这个类太长了,给我你的邮箱,我把cs文件发给你
下面是对文件的操作,里面有获取文件列表的方法
#region 文件操作
/// <summary>
/// 获得文件列表
/// </summary>
/// <param name= "strMask "> 文件名的匹配字符串 </param>
/// <returns> </returns>
public string[] Dir(string strMask)
{
// 建立链接
if(!bConnected)
{
Connect();
}
//建立进行数据连接的socket
Socket socketData = CreateDataSocket();
//传送命令
SendCommand( "NLST " + strMask);
//分析应答代码
if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
{
throw new IOException(strReply.Substring(4));
}
//获得结果
strMsg = " ";
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();//数据socket关闭时也会有返回码
if(iReplyCode != 226)
{
ReadReply();
if(iReplyCode != 226)
{
throw new IOException(strReply.Substring(4));
}
}
return strsFileList;
}
/// <summary>
/// 获取文件大小
/// </summary>
/// <param name= "strFileName "> 文件名 </param>
/// <returns> 文件大小 </returns>
private 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;
}
/// <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
[解决办法]
这个要从ftp协议来实现
[解决办法]
vs2005有一个ftp类,里面应该有方法!
[解决办法]
Red_angelX(八戒) ( ) 信誉:100 Blog 2007-03-29 10:55:42 得分: 0
这个要从ftp协议来实现
---------------------------
up
[解决办法]
mark
[解决办法]
可以的话.请LS那位大哥也发我一份...
Shinaterry@126.com
[解决办法]
设置FtpWebRequest.Method为WebRequestMethods.Ftp.ListDirectory或WebRequestMethods.Ftp.ListDirectoryDetails
[解决办法]
cdjhjiangyi@263.net 老大能给我也发一份吗?
[解决办法]
设置FtpWebRequest.Method为WebRequestMethods.Ftp.ListDirectory或WebRequestMethods.Ftp.ListDirectoryDetails
[解决办法]
#region 遍历ftp文件夹
void ReadDir(string path, string username, string password)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(path);
request.Credentials = new NetworkCredential(username, password);
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
List <string> DirName = new List <string> ();
while (!sr.EndOfStream)
{
string name = sr.ReadLine();
if ((name.Substring(0, 1) == "d ") && (name.Substring(name.Length - 1, 1) != ". "))
{
name = name.Substring(name.LastIndexOf( ": ") + 4);
DirName.Add(path + name + "/ ");
}
else if (name.Substring(0, 1) != "d ")
{
name = name.Substring(name.LastIndexOf( ": ") + 4);
if (LocalFilesAreNew(path + name) == false)
{
//FoundNew = true;
Update(path + name);
}
}
}
sr.Close();
if (DirName.Count > 0)
{
for (int i = 0; i <= DirName.Count - 1; i++)
{
ReadDir(DirName[i].ToString(), username, password);
}
}
}
#endregion
我写了一个函数,可以实现你的功能。但不知道怎么把里面的 递归 改成 迭代........
[解决办法]
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;
namespace FtpFactory
{
/// <summary>
/// FTP Client
/// </summary>
public class FTPClient
{
#region 构造函数
/// <summary>
/// 缺省构造函数
/// </summary>
public FTPClient()
{
strRemoteHost = " ";
strRemotePath = " ";
strRemoteUser = " ";
strRemotePass = " ";
strRemotePort = 21;
bConnected = false;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name= "remoteHost "> </param>
/// <param name= "remotePath "> </param>
/// <param name= "remoteUser "> </param>
/// <param name= "remotePass "> </param>
/// <param name= "remotePort "> </param>
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 登陆
/// <summary>
/// FTP服务器IP地址
/// </summary>
private string strRemoteHost;
public string RemoteHost
{
get
{
return strRemoteHost;
}
set
{
strRemoteHost = value;
}
}
/// <summary>
/// FTP服务器端口
/// </summary>
private int strRemotePort;
public int RemotePort
{
get
{
return strRemotePort;
}
set
{
strRemotePort = value;
}
}
/// <summary>
/// 当前服务器目录
/// </summary>
private string strRemotePath;
public string RemotePath
{
get
{
return strRemotePath;
}
set
{
strRemotePath = value;
}
}
/// <summary>
/// 登录用户账号
/// </summary>
private string strRemoteUser;
public string RemoteUser
{
set
{
strRemoteUser = value;
}
}
/// <summary>
/// 用户登录密码
/// </summary>
private string strRemotePass;
public string RemotePass
{
set
{
strRemotePass = value;
}
}
/// <summary>
/// 是否登录
/// </summary>
private Boolean bConnected;
public bool Connected
{
get
{
return bConnected;
}
}
#endregion
#region 链接
/// <summary>
/// 建立连接
/// </summary>
public void Connect()
{
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( "Couldn 't connect to remote server ");
}
// 获取应答码
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>
/// 关闭连接
/// </summary>
public void DisConnect()
{
if( socketControl != null )
{
SendCommand( "QUIT ");
}
CloseSocketConnect();
}
#endregion
#region 传输模式
/// <summary>
/// 传输模式:二进制类型、ASCII类型
/// </summary>
public enum TransferType {Binary,ASCII};
/// <summary>
/// 设置传输模式
/// </summary>
/// <param name= "ttType "> 传输模式 </param>
public void SetTransferType(TransferType ttType)
{
if(ttType == TransferType.Binary)
{
SendCommand( "TYPE I ");//binary类型传输
}
else
{
SendCommand( "TYPE A ");//ASCII类型传输
}
if (iReplyCode != 200)
{
throw new IOException(strReply.Substring(4));
}
else
{
trType = ttType;
}
}
/// <summary>
/// 获得传输模式
/// </summary>
/// <returns> 传输模式 </returns>
public TransferType GetTransferType()
{
return trType;
}
#endregion
#region 文件操作
/// <summary>
/// 获得文件列表
/// </summary>
/// <param name= "strMask "> 文件名的匹配字符串 </param>
/// <returns> </returns>
public string[] Dir(string strMask)
{
// 建立链接
if(!bConnected)
{
Connect();
}
//建立进行数据连接的socket
Socket socketData = CreateDataSocket();
//传送命令
SendCommand( "NLST " + strMask);
//分析应答代码
if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
{
throw new IOException(strReply.Substring(4));
}
//获得结果
strMsg = " ";
while(true)
{
int iBytes = socketData.Receive(buffer, buffer.Length, 0);
strMsg += Encoding.GetEncoding( "gb2312 ").GetString(buffer, 0, iBytes);
if(iBytes < buffer.Length)
{
break;
}
}
char[] seperator = { '\n '};
string[] strsFileList = strMsg.Split(seperator);
socketData.Close();//数据socket关闭时也会有返回码
if(iReplyCode != 226)
{
ReadReply();
if(iReplyCode != 226)
{
throw new IOException(strReply.Substring(4));
}
}
return strsFileList;
}
/// <summary>
/// 获取文件大小
/// </summary>
/// <param name= "strFileName "> 文件名 </param>
/// <returns> 文件大小 </returns>
private 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;
}
/// <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 "> 本地目录(不得以\结束) </param>
public void Get(string strFileNameMask,string strFolder)
{
if(!bConnected)
{
Connect();
}
string[] strFiles = Dir(strFileNameMask);
foreach(string strFile in strFiles)
{
if(!strFile.Equals( " "))//一般来说strFiles的最后一个元素可能是空字符串
{
Get(strFile,strFolder,strFile);
}
}
}