c#下winform的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.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;
namespace WindowsApplication1
...{
public class FTPFactory
...{
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 = ;
Byte[] buffer = new Byte[BLOCK_SIZE];
Encoding ASCII = Encoding.ASCII;
public FTPFactory()
...{
remoteHost = "localhost";
remotePath = ".";
remoteUser = "anonymous";
remotePass = "jaimon@school2000.co.uk";
remotePort = ;
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 == || retValue == ))
...{
throw new IOException(reply.Substring());
}
mes = "";
while(true)
...{
int bytes = cSocket.Receive(buffer, buffer.Length, );
mes += ASCII.GetString(buffer, , bytes);
if(bytes < buffer.Length)
...{
break;
}
}
char[] seperator = ...{' '};
string[] mess = mes.Split(seperator);
cSocket.Close();
readReply();
if(retValue != )
...{
throw new IOException(reply.Substring());
}
return mess;
}
/**////
/// Return the size of a file.
///
///
///
public long getFileSize(string fileName)
...{
if(!logined)
...{
login();
}
sendCommand("SIZE " + fileName);
long size=;
if(retValue == )
...{
size = Int64.Parse(reply.Substring());
}
else
...{
throw new IOException(reply.Substring());
}
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[], remotePort);
try
...{
clientSocket.Connect(ep);
}
catch(Exception)
...{
throw new IOException("Couldn't connect to remote server");
}
readReply();
if(retValue != )
...{
close();
throw new IOException(reply.Substring());
}
if(debug)
Console.WriteLine("USER "+remoteUser);
sendCommand("USER "+remoteUser);
if( !(retValue == || retValue == ) )
...{
cleanup();
throw new IOException(reply.Substring());
}
if( retValue != )
...{
if(debug)
Console.WriteLine("PASS xxx");
sendCommand("PASS "+remotePass);
if( !(retValue == || retValue == ) )
...{
cleanup();
throw new IOException(reply.Substring());
}
}
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 != )
...{
throw new IOException(reply.Substring());
}
}
/**////
/// 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(true);
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.Open);
Socket cSocket = createDataSocket();
long offset = ;
if(resume)
...{
offset = output.Length;
if(offset > )
...{
sendCommand("REST "+offset);
if(retValue != )
...{
//throw new IOException(reply.Substring(4));
//Some servers may not support resuming.
offset = ;
}
}
if(offset > )
...{
if(debug)
...{
Console.WriteLine("seeking to " + offset);
}
long npos = output.Seek(offset,SeekOrigin.Begin);
Console.WriteLine("new pos="+npos);
}
}
sendCommand("RETR " + remFileName);
if(!(retValue == || retValue == ))
...{
throw new IOException(reply.Substring());
}
while(true)
...{
bytes = cSocket.Receive(buffer, buffer.Length, );
output.Write(buffer,,bytes);
if(bytes <= )
...{
break;
}
}
output.Close();
if (cSocket.Connected)
...{
cSocket.Close();
}
Console.WriteLine("");
readReply();
if( !(retValue == || retValue == ) )
...{
throw new IOException(reply.Substring());
}
}
/**////
/// 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=;
if(resume)
...{
try
...{
setBinaryMode(true);
offset = getFileSize(fileName);
}
catch(Exception)
...{
offset = ;
}
}
if(offset > )
...{
sendCommand("REST " + offset);
if(retValue != )
...{
//throw new IOException(reply.Substring(4));
//Remote server may not support resuming.
offset = ;
}
}
sendCommand("STOR "+Path.GetFileName(fileName));
if( !(retValue == || retValue == ) )
...{
throw new IOException(reply.Substring());
}
// open input stream to read source file
FileStream input = new
FileStream(fileName,FileMode.Open);
if(offset != )
...{
if(debug)
...{
Console.WriteLine("seeking to " + offset);
}
input.Seek(offset,SeekOrigin.Begin);
}
Console.WriteLine("Uploading file "+fileName+" to "+remotePath);
while ((bytes = input.Read(buffer,,buffer.Length)) > )
...{
cSocket.Send(buffer, bytes, );
}
input.Close();
Console.WriteLine("");
if (cSocket.Connected)
...{
cSocket.Close();
}
readReply();
if( !(retValue == || retValue == ) )
...{
throw new IOException(reply.Substring());
}
}
/**////
/// Delete a file from the remote FTP server.
///
///
public void deleteRemoteFile(string fileName)
...{
if(!logined)
...{
login();
}
sendCommand("DELE "+fileName);
if(retValue != )
...{
throw new IOException(reply.Substring());
}
}
/**////
/// Rename a file on the remote FTP server.
///
///
///
public void renameRemoteFile(string oldFileName,string
newFileName)
...{
if(!logined)
...{
login();
}
sendCommand("RNFR "+oldFileName);
if(retValue != )
...{
throw new IOException(reply.Substring());
}
// known problem
// rnto will not take care of existing file.
// i.e. It will overwrite if newFileName exist
sendCommand("RNTO "+newFileName);
if(retValue != )
...{
throw new IOException(reply.Substring());
}
}
/**////
/// Create a directory on the remote FTP server.
///
///
public void mkdir(string dirName)
...{
if(!logined)
...{
login();
}
sendCommand("MKD "+dirName);
if(retValue != )
...{
throw new IOException(reply.Substring());
}
}
/**////
/// Delete a directory on the remote FTP server.
///
///
public void rmdir(string dirName)
...{
if(!logined)
...{
login();
}
sendCommand("RMD "+dirName);
if(retValue != )
...{
throw new IOException(reply.Substring());
}
}
/**////
/// 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 != )
...{
throw new IOException(reply.Substring());
}
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(,));
}
private void cleanup()
...{
if(clientSocket!=null)
...{
clientSocket.Close();
clientSocket = null;
}
logined = false;
}
private string readLine()
...{
while(true)
...{
bytes = clientSocket.Receive(buffer, buffer.Length, );
mes += ASCII.GetString(buffer, , bytes);
if(bytes < buffer.Length)
...{
break;
}
}
char[] seperator = ...{' '};
string[] mess = mes.Split(seperator);
if(mes.Length > )
...{
mes = mess[mess.Length-];
}
else
...{
mes = mess[];
}
if(!mes.Substring(,).Equals(" "))
...{
return readLine();
}
if(debug)
...{
for(int k=;k < mess.Length-;k++)
...{
Console.WriteLine(mess[k]);
}
}
return mes;
}
private void sendCommand(String command)
...{
Byte[] cmdBytes =
Encoding.ASCII.GetBytes((command+" ").ToCharArray());
clientSocket.Send(cmdBytes, cmdBytes.Length, );
readReply();
}
private Socket createDataSocket()
...{
sendCommand("PASV");
if(retValue != )
...{
throw new IOException(reply.Substring());
}
int index1 = reply.IndexOf('(');
int index2 = reply.IndexOf(')');
string ipData =
reply.Substring(index1+,index2-index1-);
int[] parts = new int[];
int len = ipData.Length;
int partCount = ;
string buf="";
for (int i = ; i < len && partCount <= ; i++)
...{
char ch = Char.Parse(ipData.Substring(i,));
if (Char.IsDigit(ch))
buf+=ch;
else if (ch != ',')
...{
throw new IOException("Malformed PASV reply: " +
reply);
}
if (ch == ',' || i+ == len)
...{
try
...{
parts[partCount++] = Int32.Parse(buf);
buf="";
}
catch (Exception)
...{
throw new IOException("Malformed PASV reply: " +
reply);
}
}
}
string ipAddress = parts[] + "."+ parts[]+ "." +
parts[] + "." + parts[];
int port = (parts[] << ) + parts[];
Socket s = new
Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint ep = new
IPEndPoint(Dns.Resolve(ipAddress).AddressList[], port);
try
...{
s.Connect(ep);
}
catch(Exception)
...{
throw new IOException("Can't connect to remote server");
}
return s;
}
}
}
/*
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.Net;
using System.IO;
using System.Text;
using System.Net.Sockets;
namespace WindowsApplication1
...{
public class FTPFactory
...{
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()
...{
remoteHost = "localhost";
remotePath = ".";
remoteUser = "anonymous";
remotePass = "jaimon@school2000.co.uk";
remotePort = 21;
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 = "";
while(true)
...{
int bytes = cSocket.Receive(buffer, buffer.Length, 0);
mes += ASCII.GetString(buffer, 0, bytes);
if(bytes < buffer.Length)
...{
break;
}
}
char[] seperator = ...{' '};
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(true);
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.Open);
Socket cSocket = createDataSocket();
long offset = 0;
if(resume)
...{
offset = output.Length;
if(offset > 0 )
...{
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 = ...{' '};
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+"").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);
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;
}
以上是在C#项目下添加ftp类
配置ftp 服务器 (xp下局域网内)
1.server下,打开设置-->控制面板-->管理工具-->IIS,找到本地计算机下的ftp站点,打开默认ftp站点的属性,做如下配置:
1)ftp站点选项卡
IP地址:指定一IP地址,如:192.168.0.101
端口号:21
2)主目录选项卡
选择内容来源为:此计算机上的目录
ftp站点目录:配置一本机目录,最好为非系统盘,如D:/ftp。选择读取、写入、记录访问
2.server下,网络邻居里的本地连接,属性-->常规-->TCP/IP协议-->属性,取消自动获取IP地址,手动输入如上IP:192.168.0.101
3.client下,网络邻居里的本地连接,属性-->常规-->TCP/IP协议-->属性,取消自动获取IP地址,手动输入IP:192.168.0.102
4:测试:把文件copy到ftp主目录下,即D:/ftp,通过在server端以及client端的IE,输入ftp://192.168.0.101或者ftp://servername (作为服务器的计算机名,可在我的电脑-->属性-->计算机名里获得)可访问到文件,则测试成功。
在主函数中创建实例

查看代码
FTPFactory ff = new FTPFactory();
ff.setDebug(true);
ff.setRemoteHost("192.168.0.101");
ff.setRemoteUser("Anonymous");
ff.setRemotePass("");
ff.login();
ff.chdir(".");
string[] fileNames = ff.getFileList("*.*");
for(int i=0;i < fileNames.Length;i++)
...{
Console.WriteLine(fileNames[i]);
}
ff.setBinaryMode(true);
ff.upload("D:/项目资料/档案馆/简介/mps1.ppt");
ff.close();
说明:
1.参数设置
1)RemoteHost=server的IP地址
2)RemoteUser=用户名,匿名情况下不能为" ",而应为"Anonymous"
3)此处的chdir或别处的remotePath,为设置或修改服务器的当前目录,若没有当前目录(只有根目录),应设置为"."。比较奇怪的是我试过“D:/ftp/”(服务器主目录以及其变形“/ftp”等)或者ftp://servername/(或者“//servername/”等),都无法识别,盼高人指点
4) ftp应答码及其意义
110
重新启动标记应答。在这种情况下文本是确定的,它必须是:MARK yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。
120
服务在nnn分钟内準备好
125
数据连接已打开,準备传送
150
文件状态良好,打开数据连接
200
命令成功
202
命令未实现
211
系统状态或系统帮助响应
212
目录状态
213
文件状态
214
帮助信息,信息仅对人类用户有用
215
名字系统类型
220
对新用户服务準备好
221
服务关闭控制连接,可以退出登录
225
数据连接打开,无传输正在进行
226
关闭数据连接,请求的文件操作成功
227
进入被动模式
230
用户登录
250
请求的文件操作完成
257
创建"PATHNAME"
331
用户名正确,需要口令
332
登录时需要帐户信息
350
请求的文件操作需要进一步命令
421
不能提供服务,关闭控制连接
425
不能打开数据连接
426
关闭连接,中止传输
450
请求的文件操作未执行
451
中止请求的操作:有本地错误
452
未执行请求的操作:系统存储空间不足
500
格式错误,命令不可识别
501
参数语法错误
502
命令未实现
503
命令顺序错误
504
此参数下的命令功能未实现
530
未登录
532
存储文件需要帐户信息
550
未执行请求的操作
551
请求操作中止:页类型未知
552
请求的文件操作中止,存储分配溢出
553
未执行请求的操作:文件名不合法
c#下winform的ftp上传的更多相关文章
- osx或windows系统下,用ftp上传文件到阿里云虚拟主机脚本
某天突然发现,一直在用的ftp工具并不好用,操作界面太过繁琐,而且不太稳定.于是自己找资料,整合了几句虽然简单,但是方便的代码. mac脚本 #从本地向FTP批量上传文档 需要赋予该.shell文件权 ...
- windows系统下ftp上传下载和一些常用命令
先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...
- windows下ftp上传下载和一些常用命令
先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...
- windows下定时利用bat脚本实现ftp上传和下载
前言: 工作中可能会遇到以下情况,利用windows作为中转,来实现两台linux服务器的文件传输. 实现步骤: 1.FTP上传和下载的bat脚本. 脚本分为两部分:可执行bat脚本和ftp命令文件: ...
- Debian下自动备份文件并上传到远程FTP服务器且删除指定日期前的备份Shell脚本
说明: 1.备份目录/home/osyunwei下面所有的文件到/home/osyunweibak里面,并且保存为osyunwei20120701.tar.gz的压缩文件格式(2012_07_01是 ...
- 在附件管理模块中增加对FTP 上传和预览的支持
在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理, ...
- C# ftp 上传、下载、删除
public class FtpHelper { public static readonly FtpHelper Instance = new FtpHelper(); /// <summar ...
- 通过cmd完成FTP上传文件操作
一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...
- FTP上传文件到服务器
一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...
随机推荐
- BAT美团滴滴java面试大纲(带答案版)之三:多线程Lock
继续面试大纲系列文章. 这是多线程的第二篇. 多线程就像武学中对的吸星大法,理解透了用好了可以得道成仙,俯瞰芸芸众生:而滥用则会遭其反噬. 在多线程编程中要渡的第二个“劫”,则是Lock.在很多时候, ...
- RTSP连接中断重连的问题
最近在调查的一个问题. 起因是我司的一款数据链产品,15km数字图传,测试时发现视频画面经常会出现马赛克或卡顿. 图传设置了10Mbps速率,而视频码流是4Mbps,按道理不应该出现这种问题. 经过几 ...
- uestc 1703一道更简单的字符串题目
https://vjudge.net/problem/UESTC-1703 题意:略 思路: 枚举+字符串hash. ans从1到len开始枚举字符串的长度,然后就依次比较各段长度为ans的字符串的h ...
- Eureka服务注册中心
Eureka服务注册中心 最近在研究Spring Cloud,发现其中的组件实在是太多了,真的是头大,只能一块一块看,像盲人摸象一样.要想很短时间内掌握Spring Cloud是不可能的,小编就学习一 ...
- 简述SharePoint designer 工作流实现用户撤回申请得解决方案,how to revoke/recall application in SharePoint designer workflow
在工作中很容易碰到用户提出,需要可以撤回申请得需求.有这么几种实现方法. 方案一:designer中加一个parallel(平行)得anction, 然后在里面添加两个平行运行得审批 第一个是给真正得 ...
- 【推荐】CentOS修复OpenSSH用户枚举漏洞
注:以下所有操作均在CentOS 6.8 x86_64位系统下完成. #漏洞说明# OpenSSH(OpenBSD Secure Shell)是OpenBSD计划组所维护的一套用于安全访问远程计算机的 ...
- requests之一:HTTP请求 状态码
1.请求方法主要有如下几种: Verb 描述 HEAD 只获取某个资源的头部信息,元数据.比如只想了解某个文件的大小,某个资源的修改日期等 GET 获取资源,一个或者多个 POST 创建资源 PATC ...
- Vue练手项目(包含typescript版本)
本项目的git仓库https://github.com/lznism/xiachufang-vue 对应的使用typescript实现的版本地址https://github.com/lznism/xi ...
- pymysql实现从a表过滤出有效信息添加至b表
# Author: yeshengbao # -- coding: utf-8 -- # @Time : 2018/4/16 19:23 import pymysql # 创建连接 conn = py ...
- WebApi的安全性及其解决方案
一.前言 WebApi的小白想要了解一些关于WebApi安全性相关的问题,本篇文章是整理一些关于WebApi安全.权限认证的文章. 二.内容正文 2.1 不进行验证 客户端调用:http:// ...