概念
FTP = File Transfer Protocol 文件传输协议
使得主机间可以共享文件。 FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似 TELNET 协议在主机间交换命令和消息。文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录。
FTP使用TCP的服务。
FTP有两种使用模式:主动和被动。
FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,并且是命令通向ftp服务器的进口。
操作
(1)下载
public void Download()
{
FtpWebRequest reqFTP;
FtpWebResponse response;
Stream ftpStream;
FileStream fs;
foreach (string fileName in fileList)
{
FileInfo fileInfo = new FileInfo(fileName);
string name = fileInfo.Name;
fs = new FileStream(string.Format("c:\\ftp\\{0}", name), FileMode.Create);
reqFTP = FtpWebRequest.Create(new Uri(string.Format("ftp://{0}/{1}",auth.Server,fileName))) as FtpWebRequest;
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
if (!string.IsNullOrEmpty(auth.Name))
{
reqFTP.Credentials = new NetworkCredential(auth.Name, auth.Password);
}
response = (FtpWebResponse)reqFTP.GetResponse();
ftpStream = response.GetResponseStream();
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
fs.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
response.Close();
fs.Close();
ftpStream.Close();
}
}
(2)上传
public void Upload()
{
FtpWebRequest reqFTP;
foreach (string fileName in fileList)
{
FileInfo fileInfo = new FileInfo(fileName);
string uri = "ftp://" + auth.Server + "/" + fileInfo.Name;
// 根据uri创建FtpWebRequest对象
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
if (string.IsNullOrEmpty(auth.Name))
{
// ftp用户名和密码
reqFTP.Credentials = new NetworkCredential(auth.Name, auth.Password);
}
// 默认为true,连接不会被关闭
// 在一个命令之后被执行
reqFTP.KeepAlive = false;
// 指定执行什么命令
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
// 指定数据传输类型
reqFTP.UseBinary = true;
// 上传文件时通知服务器文件的大小
reqFTP.ContentLength = fileInfo.Length;
// 缓冲大小设置为2kb
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
// 打开一个文件流 (System.IO.FileStream) 去读上传的文件
FileStream fs = fileInfo.OpenRead();
// 把上传的文件写入流
Stream stream = reqFTP.GetRequestStream();
// 每次读文件流的2kb
contentLen = fs.Read(buff, 0, buffLength);
// 流内容没有结束
while (contentLen != 0)
{
// 把内容从file stream 写入 upload stream
stream.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
// 关闭两个流
stream.Close();
fs.Close();
}
}
相关教程网页:
http://www.sufeinet.com/forum.php?mod=viewthread&tid=1736&extra=page%3D1%26filter%3Dtypeid%26typeid%3D275%26typeid%3D275http://www.cnitblog.com/windforce/articles/49479.html
http://www.cnblogs.com/swtseaman/archive/2011/03/29/1998611.html
http://blog.csdn.net/cuker919/article/details/6403925