MyException - 我的异常网
当前位置:我的异常网» 热门搜索 » c#获取ftp服务器文件

c#获取ftp服务器文件

www.MyException.Cn  网友分享于:2015-08-26   搜索量:130次
场景:怎么用C#获取FTP服务器文件列表

如何用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);
}
}
}

文章评论

Java程序员必看电影
Java程序员必看电影
鲜为人知的编程真相
鲜为人知的编程真相
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
每天工作4小时的程序员
每天工作4小时的程序员
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
代码女神横空出世
代码女神横空出世
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员应该关注的一些事儿
程序员应该关注的一些事儿
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些争议最大的编程观点
那些争议最大的编程观点
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员必看的十大电影
程序员必看的十大电影
旅行,写作,编程
旅行,写作,编程
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
老程序员的下场
老程序员的下场
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何成为一名黑客
如何成为一名黑客
编程语言是女人
编程语言是女人
 程序员的样子
程序员的样子
漫画:程序员的工作
漫画:程序员的工作
中美印日四国程序员比较
中美印日四国程序员比较
程序员都该阅读的书
程序员都该阅读的书
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我是如何打败拖延症的
我是如何打败拖延症的
我的丈夫是个程序员
我的丈夫是个程序员
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
一个程序员的时间管理
一个程序员的时间管理
程序员的鄙视链
程序员的鄙视链
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有