C#版ftp方法实现类的代码

/* 
FTPFactory.cs 
Better view with tab space=4 
Written by Jaimon Mathew (jaimonmathew@rediffmail.com) 
Rolander,Dan (Dan.Rolander@marriott.com) has modified the 
download 
method to cope with file name with path information. He also 
provided 
the XML comments so that the library provides Intellisense 
descriptions. 
use the following line to compile 
csc /target:library /out:FTPLib.dll /r:System.DLL FTPFactory.cs 
*/ 
using System; 
using System.Threading; 
using System.Net; 
using System.IO; 
using System.Text; 
using System.Net.Sockets; 
using System.Configuration; 
namespace AudioCollect 

/// <summary> 
/// FTPFactory 的摘要说明。 
/// </summary> 
public class FTPFactory 

static readonly log4net.ILog log = log4net.LogManager.GetLogger("log4net"); 
private string 
remoteHost,remotePath,remoteUser,remotePass,mes; 
private int remotePort,bytes; 
private Socket clientSocket; 
private int retValue; 
private Boolean debug; 
private Boolean logined; 
private string reply; 
private static int BLOCK_SIZE = 512; 
Byte[] buffer = new Byte[BLOCK_SIZE]; 
Encoding ASCII = Encoding.ASCII; 
public FTPFactory() 

string FTPRemoteIP = ConfigurationSettings.AppSettings["FTPRemoteIP"]; 
int FTPRemotePort = Convert.ToInt32( ConfigurationSettings.AppSettings["FTPRemotePort"] ); 
string FTPUser = ConfigurationSettings.AppSettings["FTPUser"]; 
string FTPPassword = ConfigurationSettings.AppSettings["FTPPassword"]; 
remoteHost = FTPRemoteIP; 
remotePath = "."; 
remoteUser = FTPUser; 
remotePass = FTPPassword; 
remotePort =FTPRemotePort; 
debug = false; 
logined = false; 

/// 
/// Set the name of the FTP server to connect to. 
/// 
/// Server name 
public void setRemoteHost(string remoteHost) 

this.remoteHost = remoteHost; 

/// 
/// Return the name of the current FTP server. 
/// 
/// Server name 
public string getRemoteHost() 

return remoteHost; 

/// 
/// Set the port number to use for FTP. 
/// 
/// Port number 
public void setRemotePort(int remotePort) 

this.remotePort = remotePort; 

/// 
/// Return the current port number. 
/// 
/// Current port number 
public int getRemotePort() 

return remotePort; 

/// 
/// Set the remote directory path. 
/// 
/// The remote directory path 
public void setRemotePath(string remotePath) 

this.remotePath = remotePath; 

/// 
/// Return the current remote directory path. 
/// 
/// The current remote directory path. 
public string getRemotePath() 

return remotePath; 

/// 
/// Set the user name to use for logging into the remote server. 
/// 
/// Username 
public void setRemoteUser(string remoteUser) 

this.remoteUser = remoteUser; 

/// 
/// Set the password to user for logging into the remote server. 
/// 
/// Password 
public void setRemotePass(string remotePass) 

this.remotePass = remotePass; 

/// 
/// Return a string array containing the remote directory's file list. 
/// 
/// 
/// 
public string[] getFileList(string mask) 

if(!logined) 

login(); 

Socket cSocket = createDataSocket(); 
sendCommand("NLST " + mask); 
if(!(retValue == 150 || retValue == 125)) 

throw new IOException(reply.Substring(4)); 

mes = ""; 
Thread.Sleep(700); 
while(true) 

if(cSocket.Connected) 

int bytes = cSocket.Receive(buffer, buffer.Length, 0); 
mes += ASCII.GetString(buffer, 0, bytes); 
if(bytes < buffer.Length) 

break; 


else 

log.Info("socket 连接断了!"); 


log.Info(mes); 
char[] seperator = {'\n'}; 
string[] mess = mes.Split(seperator); 
foreach(string fileName in mess) 

log.Info(fileName); 

cSocket.Close(); 
readReply(); 
if(retValue != 226) 

throw new IOException(reply.Substring(4)); 

return mess; 

public string[] getFileList() 

if(!logined) 

login(); 

Socket cSocket = createDataSocket(); 
sendCommand("LIST "); 
if(!(retValue == 150 || retValue == 125)) 

throw new IOException(reply.Substring(4)); 

mes = ""; 
while(true) 

int bytes = cSocket.Receive(buffer, buffer.Length, 0); 
mes += ASCII.GetString(buffer, 0, bytes); 
if(bytes < buffer.Length) 

break; 


log.Info(mes); 
char[] seperator = {'\n'}; 
string[] mess = mes.Split(seperator); 
cSocket.Close(); 
readReply(); 
if(retValue != 226) 

throw new IOException(reply.Substring(4)); 

return mess; 

/// 
/// Return the size of a file. 
/// 
/// 
/// 
public long getFileSize(string fileName) 

if(!logined) 

login(); 

sendCommand("SIZE " + fileName); 
long size=0; 
if(retValue == 213) 

size = Int64.Parse(reply.Substring(4)); 

else 

throw new IOException(reply.Substring(4)); 

return size; 

/// 
/// Login to the remote server. 
/// 
public void login() 

clientSocket = new 
Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
IPEndPoint ep = new 
IPEndPoint(Dns.Resolve(remoteHost).AddressList[0], remotePort); 
try 

clientSocket.Connect(ep); 

catch(Exception) 

throw new IOException("Couldn't connect to remote server"); 

readReply(); 
if(retValue != 220) 

close(); 
throw new IOException(reply.Substring(4)); 

if(debug) 
Console.WriteLine("USER "+remoteUser); 
sendCommand("USER "+remoteUser); 
if( !(retValue == 331 || retValue == 230) ) 

cleanup(); 
throw new IOException(reply.Substring(4)); 

if( retValue != 230 ) 

if(debug) 
Console.WriteLine("PASS xxx"); 
sendCommand("PASS "+remotePass); 
if( !(retValue == 230 || retValue == 202) ) 

cleanup(); 
throw new IOException(reply.Substring(4)); 


logined = true; 
Console.WriteLine("Connected to "+remoteHost); 
chdir(remotePath); 

/// 
/// If the value of mode is true, set binary mode for downloads. 
/// Else, set Ascii mode. 
/// 
/// 
public void setBinaryMode(Boolean mode) 

if(mode) 

sendCommand("TYPE I"); 

else 

sendCommand("TYPE A"); 

if (retValue != 200) 

throw new IOException(reply.Substring(4)); 


/// 
/// Download a file to the Assembly's local directory, 
/// keeping the same file name. 
/// 
/// 
public void download(string remFileName) 

download(remFileName,"",false); 

/// 
/// Download a remote file to the Assembly's local directory, 
/// keeping the same file name, and set the resume flag. 
/// 
/// 
/// 
public void download(string remFileName,Boolean resume) 

download(remFileName,"",resume); 

/// 
/// Download a remote file to a local file name which can include 
/// a path. The local file name will be created or overwritten, 
/// but the path must exist. 
/// 
/// 
/// 
public void download(string remFileName,string locFileName) 

download(remFileName,locFileName,false); 

/// 
/// Download a remote file to a local file name which can include 
/// a path, and set the resume flag. The local file name will be 
/// created or overwritten, but the path must exist. 
/// 
/// 
/// 
/// 
public void download(string remFileName,string 
locFileName,Boolean resume) 

if(!logined) 

login(); 

setBinaryMode(false); 
Console.WriteLine("Downloading file "+remFileName+" from "+remoteHost + "//"+remotePath); 
if (locFileName.Equals("")) 

locFileName = remFileName; 

if(!File.Exists(locFileName)) 

Stream st = File.Create(locFileName); 
st.Close(); 

FileStream output = new 
FileStream(locFileName,FileMode.Create); 
Socket cSocket = createDataSocket(); 
long offset = 0; 
if(resume) 

offset = output.Length; 
if(offset > 0 ) 

setBinaryMode(false); 
sendCommand("REST "+offset); 
if(retValue != 350) 

//throw new IOException(reply.Substring(4)); 
//Some servers may not support resuming. 
offset = 0; 


if(offset > 0) 

if(debug) 

Console.WriteLine("seeking to " + offset); 

long npos = output.Seek(offset,SeekOrigin.Begin); 
Console.WriteLine("new pos="+npos); 


sendCommand("RETR " + remFileName); 
if(!(retValue == 150 || retValue == 125)) 

throw new IOException(reply.Substring(4)); 

while(true) 

bytes = cSocket.Receive(buffer, buffer.Length, 0); 
output.Write(buffer,0,bytes); 
if(bytes <= 0) 

break; 


output.Close(); 
if (cSocket.Connected) 

cSocket.Close(); 

Console.WriteLine(""); 
readReply(); 
if( !(retValue == 226 || retValue == 250) ) 

throw new IOException(reply.Substring(4)); 


/// 
/// Upload a file. 
/// 
/// 
public void upload(string fileName) 

upload(fileName,false); 

/// 
/// Upload a file and set the resume flag. 
/// 
/// 
/// 
public void upload(string fileName,Boolean resume) 

if(!logined) 

login(); 

Socket cSocket = createDataSocket(); 
long offset=0; 
if(resume) 

try 

setBinaryMode(true); 
offset = getFileSize(fileName); 

catch(Exception) 

offset = 0; 


if(offset > 0 ) 

sendCommand("REST " + offset); 
if(retValue != 350) 

//throw new IOException(reply.Substring(4)); 
//Remote server may not support resuming. 
offset = 0; 


/*==========================*/ 
sendCommand("STOR "+Path.GetFileName(fileName)); 
if( !(retValue == 125 || retValue == 150) ) 

throw new IOException(reply.Substring(4)); 

// open input stream to read source file 
FileStream input = new FileStream(fileName,FileMode.Open); 
if(offset != 0) 

if(debug) 

Console.WriteLine("seeking to " + offset); 

input.Seek(offset,SeekOrigin.Begin); 

Console.WriteLine("Uploading file "+fileName+" to "+remotePath); 
while ((bytes = input.Read(buffer,0,buffer.Length)) > 0) 

cSocket.Send(buffer, bytes, 0); 

input.Close(); 
Console.WriteLine(""); 
if (cSocket.Connected) 

cSocket.Close(); 

readReply(); 
if( !(retValue == 226 || retValue == 250) ) 

throw new IOException(reply.Substring(4)); 


/// 
/// Delete a file from the remote FTP server. 
/// 
/// 
public void deleteRemoteFile(string fileName) 

if(!logined) 

login(); 

sendCommand("DELE "+fileName); 
if(retValue != 250) 

throw new IOException(reply.Substring(4)); 


/// 
/// Rename a file on the remote FTP server. 
/// 
/// 
/// 
public void renameRemoteFile(string oldFileName,string 
newFileName) 

if(!logined) 

login(); 

sendCommand("RNFR "+oldFileName); 
if(retValue != 350) 

throw new IOException(reply.Substring(4)); 

// known problem 
// rnto will not take care of existing file. 
// i.e. It will overwrite if newFileName exist 
sendCommand("RNTO "+newFileName); 
if(retValue != 250) 

throw new IOException(reply.Substring(4)); 


/// 
/// Create a directory on the remote FTP server. 
/// 
/// 
public void mkdir(string dirName) 

if(!logined) 

login(); 

sendCommand("MKD "+dirName); 
if(retValue != 250) 

throw new IOException(reply.Substring(4)); 


/// 
/// Delete a directory on the remote FTP server. 
/// 
/// 
public void rmdir(string dirName) 

if(!logined) 

login(); 

sendCommand("RMD "+dirName); 
if(retValue != 250) 

throw new IOException(reply.Substring(4)); 


/// 
/// Change the current working directory on the remote FTP server. 
/// 
/// 
public void chdir(string dirName) 

if(dirName.Equals(".")) 

return; 

if(!logined) 

login(); 

sendCommand("CWD "+dirName); 
if(retValue != 250) 

throw new IOException(reply.Substring(4)); 

this.remotePath = dirName; 
Console.WriteLine("Current directory is "+remotePath); 

/// 
/// Close the FTP connection. 
/// 
public void close() 

if( clientSocket != null ) 

sendCommand("QUIT"); 

cleanup(); 
Console.WriteLine("Closing..."); 

/// 
/// Set debug mode. 
/// 
/// 
public void setDebug(Boolean debug) 

this.debug = debug; 

private void readReply() 

mes = ""; 
reply = readLine(); 
retValue = Int32.Parse(reply.Substring(0,3)); 

private void cleanup() 

if(clientSocket!=null) 

clientSocket.Close(); 
clientSocket = null; 

logined = false; 

private string readLine() 

while(true) 

bytes = clientSocket.Receive(buffer, buffer.Length, 0); 
mes += ASCII.GetString(buffer, 0, bytes); 
if(bytes < buffer.Length) 

break; 


char[] seperator = {'\n'}; 
string[] mess = mes.Split(seperator); 
if(mes.Length > 2) 

mes = mess[mess.Length-2]; 

else 

mes = mess[0]; 

if(!mes.Substring(3,1).Equals(" ")) 

return readLine(); 

if(debug) 

for(int k=0;k < mess.Length-1;k++) 

Console.WriteLine(mess[k]); 


return mes; 

private void sendCommand(String command) 

Byte[] cmdBytes = 
Encoding.ASCII.GetBytes((command+"\r\n").ToCharArray()); 
clientSocket.Send(cmdBytes, cmdBytes.Length, 0); 
readReply(); 

private Socket createDataSocket() 

sendCommand("PASV"); 
if(retValue != 227) 

throw new IOException(reply.Substring(4)); 

int index1 = reply.IndexOf('('); 
int index2 = reply.IndexOf(')'); 
string ipData = 
reply.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 reply: " + 
reply); 

if (ch == ',' || i+1 == len) 

try 

parts[partCount++] = Int32.Parse(buf); 
buf=""; 

catch (Exception) 

throw new IOException("Malformed PASV reply: " + 
reply); 



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); 
s.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 5000); 
IPEndPoint ep = new 
IPEndPoint(Dns.Resolve(ipAddress).AddressList[0], port); 
try 

s.Connect(ep); 

catch(Exception) 

    throw new IOException("Can't connect to remote server"); 

return s; 


}

(0)

相关推荐

  • C# FTP,GetResponse(),远程服务器返回错误

    FtpWebRequest类实现ftp功能的一般过程 1.创建一个FtpWebRequest对象,指向ftp服务器的uri 2.设置ftp的执行方法(上传,下载等) 3.给FtpWebRequest对象设置属性(是否支持ssl,是否使用二进制传输等) 4.设置登录验证(用户名,密码) 5.执行请求 6.接收相应流(如果需要的话) 7.如果没有打开的流,则关闭ftp请求 其中一些重要的属性如下: ·Credentials - 指定登录ftp服务器的用户名和密码. ·KeepAlive - 指定连接

  • C#实现FTP客户端的案例

    本文是利用C# 实现FTP客户端的小例子,主要实现上传,下载,删除等功能,以供学习分享使用. 思路: 通过读取FTP站点的目录信息,列出对应的文件及文件夹. 双击目录,则显示子目录,如果是文件,则点击右键,进行下载和删除操作. 通过读取本地电脑的目录,以树状结构展示,选择本地文件,右键进行上传操作. 涉及知识点: FtpWebRequest[实现文件传输协议 (FTP) 客户端] / FtpWebResponse[封装文件传输协议 (FTP) 服务器对请求的响应]Ftp的操作主要集中在两个类中.

  • C#实现自定义FTP操作封装类实例

    本文实例讲述了C#实现自定义FTP操作封装类.分享给大家供大家参考.具体如下: 这个C#类封装了FTP的常用操作,包括连接ftp服务器.列表服务器上的目录和文件,从ftp下载文件,上传文件到ftp服务器等等 using System; using System.Text; using System.IO; namespace DotNet.Utilities { public class FTPOperater { #region 属性 private FTPClient ftp; /// <s

  • C#操作ftp类完整实例

    本文实例讲述了C#操作ftp类.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net; using System.Globalization; namespace FtpTest1 { public class FtpWeb { string ftpServerIP; string ftpRemotePath; st

  • C#操作FTP出现500错误解决办法

    在网上也没有找到好的解决方案,于是自己研究了下给解决了,分享给大家,希望对大家能有所帮助. 一.异常信息 这种情况是因为FTP设置的默认目录引发的,以我现在的项目为例,在程序中我要访问的路径为 ftp://192.168.0.225/2007/35/0037/00001/1.jpg 这个路径,但服务器上设置的默认路径为 E:\pmserver\FTPServer\FTPSERVER , 我们打开相应的ftp目录看下,这个目录下面并没有我要访问的2007这个文件夹 那2007这个文件夹在什么位置呢

  • C# winfrom 模拟ftp文件管理实现代码

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Windows.Forms; namespace ConvertData{    class FtpUpDown    { string ftpServerIP;        string ftpUserID;        string ftp

  • c#操作ftp类分享

    复制代码 代码如下: class ftp{    private string host = null;    private string user = null;    private string pass = null;    private FtpWebRequest ftpRequest = null;    private FtpWebResponse ftpResponse = null;    private Stream ftpStream = null;    privat

  • 关于c#连接ftp进行上传下载实现原理及代码

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; namespace ftponload { class Program { static void Main(string[] args) { //上传文件的方法 onload("D://outPut.txt"); //下载文件的方法 fload(); } pub

  • 分享用于操作FTP的客户端C#类

    这是一个用于操作FTP的客户端C#类,类已经封装好了各种常用的Ftp操作方法,调用非常简单,你不需要关心ftp连接和操作的细节,只要调用这个类里的相关方法就可以了. using System; using System.Net; using System.IO; using System.Text; using System.Net.Sockets; using System.Threading; namespace DotNet.Utilities { public class FTPClie

  • FtpHelper实现ftp服务器文件读写操作(C#)

    最近做了一个项目,需要读取ftp服务器上的文件,于是参考了网上提供的一些帮组方法,使用过程中,出现一些小细节问题,于是本人做了一些修改,拿来分享一下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using System.Threading; using System.Configuration; na

随机推荐