c_实现FTP方法(一)-FtpWebRequest
ftp教程
ftp教程FTP(文件传输协议)是一种用于在网络上进行文件传输的标准协议。
通过FTP,用户可以将文件从一台计算机(称为FTP 客户端)传输到另一台计算机(称为FTP服务器),也可以从FTP服务器上下载文件到本地计算机。
使用FTP进行文件传输需要以下几个步骤:1. 连接到FTP服务器:用户首先需要使用FTP客户端连接到FTP服务器。
通常,用户需要提供FTP服务器的IP地址、用户名和密码进行连接。
可以使用命令行的ftp命令或者图形化的FTP客户端软件来连接FTP服务器。
2. 导航到目标文件夹:连接成功后,用户需要导航到FTP服务器上的目标文件夹,以便进行上传或下载操作。
FTP服务器通常具有类似操作系统的目录结构,用户可以使用FTP命令或FTP客户端软件提供的界面进行目录切换。
3. 上传文件:要上传文件到FTP服务器,用户需要使用put (或send)命令。
用户需要指定本地计算机上文件的路径和文件名,以及目标文件夹中要保存文件的名称。
例如,put local_file.txt remote_file.txt。
4. 下载文件:要从FTP服务器下载文件到本地计算机,用户需要使用get(或recv)命令。
用户需要指定FTP服务器上文件的路径和文件名,以及本地计算机上保存文件的路径和文件名。
例如,get remote_file.txt local_file.txt。
5. 断开连接:在完成文件传输后,用户可以断开与FTP服务器的连接。
可以使用bye或quit命令来断开连接。
FTP还支持其他一些命令,例如删除文件、重命名文件、创建目录等,可以根据具体的需求进行使用。
需要注意的是,FTP是一种明文协议,传输的数据是未加密的。
为了提高安全性,可以使用基于TLS或SSL的加密协议(FTPS)或SSH文件传输协议(SFTP)来替代FTP进行文件传输。
希望这个简单的FTP教程对您有所帮助!。
FTP(文件传输协议)的原理与实现
FTP(文件传输协议)的原理与实现FTP,即文件传输协议(File Transfer Protocol),是一种用于在计算机网络中进行文件传输的应用层协议。
它允许用户通过客户端和服务器之间进行文件的上传、下载和删除等操作。
本文将介绍FTP的原理和实现。
一、FTP的原理FTP的原理基于客户端-服务器(client-server)模型。
客户端和服务器通过FTP协议进行通信,客户端发出命令请求,服务器进行相应的处理并返回结果。
FTP采用不同的连接来进行数据传输和命令传输。
1. 命令传输连接命令传输连接是客户端和服务器之间进行命令交互的通道。
客户端通过该连接发送各种FTP命令,如登录、目录操作、文件操作等。
服务器接收到命令后执行对应的操作,并返回结果给客户端。
该连接使用TCP协议的默认端口号21。
2. 数据传输连接数据传输连接用于在客户端和服务器之间传输文件内容。
FTP支持两种方式的数据传输:主动模式(Active Mode)和被动模式(Passive Mode)。
- 主动模式:客户端向服务器发起数据传输连接,在该连接上进行文件的传输。
客户端随机选择一个端口并通过PORT命令告知服务器。
服务器返回连接确认请求,然后在该连接上进行数据的传输。
主动模式需要客户端开放一个端口用于接收服务器的连接。
- 被动模式:服务器向客户端发起数据传输连接,在该连接上进行文件的传输。
客户端发送PASV命令给服务器,服务器在随机开放的端口上等待客户端的连接。
客户端接收到服务器的地址和端口信息后,通过该地址和端口和服务器进行数据传输。
被动模式通过服务器来建立数据传输连接,适用于客户端无法开放端口的情况(如在防火墙后)。
通过命令传输连接和数据传输连接的组合,客户端和服务器可以实现文件的上传、下载和删除等功能。
二、FTP的实现FTP的实现涉及到客户端和服务器端的开发。
下面分别介绍两者的实现要点。
1. 客户端实现客户端实现主要包括以下几个方面的工作:- 用户界面设计:客户端需要提供一个用户界面供用户输入FTP服务器地址、用户名和密码等信息,并显示服务器返回的文件列表及操作结果等信息。
c#实现FTP方法(一)-FtpWebRequest
/// ftp登录信息
/// </summary>
/// <param name="ftpServerIP">ftpServerIP</param>
/// <param name="ftpUserID">ftpUserID</param>
}
public string[] GetFileList()//上面的代码示例了如何从ftp服务器上获得文件列表
{
return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory);
line = reader.ReadLine();
}
// to remove the trailing '\n'
result.Remove(result.ToString().LastIndexOf('\n'), 1);
this.ftpServerIP = ftpServerIP;
this.ftpUserID = ftpUserID;
this.ftpPassword = ftpPassword;
}
#endregion
errorinfo = "完成";
return true;
}
catch (Exception ex)
/// <returns></returns>
C#-FTP递归下载文件
C#-FTP递归下载⽂件c# ftp递归下载⽂件,找来找去这个最好。
(打断点,⼀⼩处foreach要改成for)///<summary>/// ftp⽂件上传、下载操作类///</summary>public class FTPHelper{///<summary>/// ftp⽤户名,匿名为“”///</summary>private string ftpUser;///<summary>/// ftp⽤户密码,匿名为“”///</summary>private string ftpPassWord;///<summary>///通过⽤户名,密码连接到FTP服务器///</summary>///<param name="ftpUser">ftp⽤户名,匿名为“”</param>///<param name="ftpPassWord">ftp登陆密码,匿名为“”</param>public FTPHelper(string ftpUser, string ftpPassWord){this.ftpUser = ftpUser;this.ftpPassWord = ftpPassWord;}///<summary>///匿名访问///</summary>public FTPHelper(){this.ftpUser = "";this.ftpPassWord = "";}///<summary>///上传⽂件到Ftp服务器///</summary>///<param name="uri">把上传的⽂件保存为ftp服务器⽂件的uri,如"ftp://192.168.1.104/capture-212.avi"</param> ///<param name="upLoadFile">要上传的本地的⽂件路径,如D:\capture-2.avi</param>public void UpLoadFile(string UpLoadUri, string upLoadFile){Stream requestStream = null;FileStream fileStream = null;FtpWebResponse uploadResponse = null;try{Uri uri = new Uri(UpLoadUri);FtpWebRequest uploadRequest = (FtpWebRequest)WebRequest.Create(uri);uploadRequest.Method = WebRequestMethods.Ftp.UploadFile;uploadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);requestStream = uploadRequest.GetRequestStream();fileStream = File.Open(upLoadFile, FileMode.Open);byte[] buffer = new byte[1024];int bytesRead;while (true){bytesRead = fileStream.Read(buffer, 0, buffer.Length);if (bytesRead == 0)break;requestStream.Write(buffer, 0, bytesRead);}requestStream.Close();uploadResponse = (FtpWebResponse)uploadRequest.GetResponse();}catch (Exception ex){throw new Exception("上传⽂件到ftp服务器出错,⽂件名:" + upLoadFile + "异常信息:" + ex.ToString()); }finally{if (uploadResponse != null)uploadResponse.Close();if (fileStream != null)fileStream.Close();if (requestStream != null)requestStream.Close();}}///<summary>///从ftp下载⽂件到本地服务器///</summary>///<param name="downloadUrl">要下载的ftp⽂件路径,如ftp://192.168.1.104/capture-2.avi</param>///<param name="saveFileUrl">本地保存⽂件的路径,如(@"d:\capture-22.avi"</param>public void DownLoadFile(string downloadUrl, string saveFileUrl){Stream responseStream = null;FileStream fileStream = null;StreamReader reader = null;try{// string downloadUrl = "ftp://192.168.1.104/capture-2.avi";FtpWebRequest downloadRequest = (FtpWebRequest)WebRequest.Create(downloadUrl);downloadRequest.Method = WebRequestMethods.Ftp.DownloadFile;//string ftpUser = "yoyo";//string ftpPassWord = "123456";downloadRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);FtpWebResponse downloadResponse = (FtpWebResponse)downloadRequest.GetResponse();responseStream = downloadResponse.GetResponseStream();fileStream = File.Create(saveFileUrl);byte[] buffer = new byte[1024];int bytesRead;while (true){bytesRead = responseStream.Read(buffer, 0, buffer.Length);if (bytesRead == 0)break;fileStream.Write(buffer, 0, bytesRead);}}catch (Exception ex){throw new Exception("从ftp服务器下载⽂件出错,⽂件名:" + downloadUrl + "异常信息:" + ex.ToString()); }finally{if (reader != null){reader.Close();}if (responseStream != null){responseStream.Close();}if (fileStream != null){fileStream.Close();}}}///<summary>///从FTP下载⽂件到本地服务器,⽀持断点下载///</summary>///<param name="ftpUri">ftp⽂件路径,如"ftp://localhost/test.txt"</param>///<param name="saveFile">保存⽂件的路径,如C:\\test.txt</param>public void BreakPointDownLoadFile(string ftpUri, string saveFile){System.IO.FileStream fs = null;.FtpWebResponse ftpRes = null;System.IO.Stream resStrm = null;try{//下载⽂件的URIUri u = new Uri(ftpUri);//设定下载⽂件的保存路径string downFile = saveFile;//FtpWebRequest的作成.FtpWebRequest ftpReq = (.FtpWebRequest).WebRequest.Create(u);//设定⽤户名和密码ftpReq.Credentials = new workCredential(ftpUser, ftpPassWord);//MethodにWebRequestMethods.Ftp.DownloadFile("RETR")设定ftpReq.Method = .WebRequestMethods.Ftp.DownloadFile;//要求终了后关闭连接ftpReq.KeepAlive = false;//使⽤ASCII⽅式传送eBinary = false;//设定PASSIVE⽅式⽆效ePassive = false;//判断是否继续下载//继续写⼊下载⽂件的FileStreamif (System.IO.File.Exists(downFile)){//继续下载ftpReq.ContentOffset = (new System.IO.FileInfo(downFile)).Length;fs = new System.IO.FileStream(downFile, System.IO.FileMode.Append, System.IO.FileAccess.Write);}else{//⼀般下载fs = new System.IO.FileStream(downFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);}//取得FtpWebResponseftpRes = (.FtpWebResponse)ftpReq.GetResponse();//为了下载⽂件取得StreamresStrm = ftpRes.GetResponseStream();//写⼊下载的数据byte[] buffer = new byte[1024];while (true){int readSize = resStrm.Read(buffer, 0, buffer.Length);if (readSize == 0)break;fs.Write(buffer, 0, readSize);}}catch (Exception ex){throw new Exception("从ftp服务器下载⽂件出错,⽂件名:" + ftpUri + "异常信息:" + ex.ToString()); }finally{fs.Close();resStrm.Close();ftpRes.Close();}}#region从FTP上下载整个⽂件夹,包括⽂件夹下的⽂件和⽂件夹///<summary>///列出FTP服务器上⾯当前⽬录的所有⽂件和⽬录///</summary>///<param name="ftpUri">FTP⽬录</param>///<returns></returns>public List<FileStruct> ListFilesAndDirectories(string ftpUri){WebResponse webresp = null;StreamReader ftpFileListReader = null;FtpWebRequest ftpRequest = null;try{ftpRequest = (FtpWebRequest)WebRequest.Create(new Uri(ftpUri));ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;ftpRequest.Credentials = new NetworkCredential(ftpUser, ftpPassWord);webresp = ftpRequest.GetResponse();ftpFileListReader = new StreamReader(webresp.GetResponseStream(), Encoding.Default);}catch (Exception ex){throw new Exception("获取⽂件列表出错,错误信息如下:" + ex.ToString());}string Datastring = ftpFileListReader.ReadToEnd();return GetList(Datastring);}///<summary>///列出FTP⽬录下的所有⽂件///</summary>///<param name="ftpUri">FTP⽬录</param>///<returns></returns>public List<FileStruct> ListFiles(string ftpUri){List<FileStruct> listAll = ListFilesAndDirectories(ftpUri);List<FileStruct> listFile = new List<FileStruct>();foreach (FileStruct file in listAll){if (!file.IsDirectory){listFile.Add(file);}}return listFile;}///<summary>///列出FTP⽬录下的所有⽬录///</summary>///<param name="ftpUri">FRTP⽬录</param>///<returns>⽬录列表</returns>public List<FileStruct> ListDirectories(string ftpUri){List<FileStruct> listAll = ListFilesAndDirectories(ftpUri);List<FileStruct> listDirectory = new List<FileStruct>();foreach (FileStruct file in listAll){if (file.IsDirectory){listDirectory.Add(file);}}return listDirectory;}///<summary>///获得⽂件和⽬录列表///</summary>///<param name="datastring">FTP返回的列表字符信息</param>private List<FileStruct> GetList(string datastring){List<FileStruct> myListArray = new List<FileStruct>();string[] dataRecords = datastring.Split('\n');FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);foreach (string s in dataRecords){if (_directoryListStyle != FileListStyle.Unknown && s != ""){FileStruct f = new FileStruct(); = "..";switch (_directoryListStyle){case FileListStyle.UnixStyle:f = ParseFileStructFromUnixStyleRecord(s);break;case FileListStyle.WindowsStyle:f = ParseFileStructFromWindowsStyleRecord(s);break;}if (!( == "." || == "..")){myListArray.Add(f);}}}return myListArray;}///<summary>///从Unix格式中返回⽂件信息///</summary>///<param name="Record">⽂件信息</param>private FileStruct ParseFileStructFromUnixStyleRecord(string Record) {FileStruct f = new FileStruct();string processstr = Record.Trim();f.Flags = processstr.Substring(0, 10);f.IsDirectory = (f.Flags[0] == 'd');processstr = (processstr.Substring(11)).Trim();_cutSubstringFromStringWithTrim(ref processstr, '', 0); //跳过⼀部分f.Owner = _cutSubstringFromStringWithTrim(ref processstr, '', 0);f.Group = _cutSubstringFromStringWithTrim(ref processstr, '', 0);_cutSubstringFromStringWithTrim(ref processstr, '', 0); //跳过⼀部分string yearOrTime = processstr.Split(new char[] { '' }, StringSplitOptions.RemoveEmptyEntries)[2];if (yearOrTime.IndexOf(":") >= 0) //time{processstr = processstr.Replace(yearOrTime, DateTime.Now.Year.ToString());}f.CreateTime = DateTime.Parse(_cutSubstringFromStringWithTrim(ref processstr, '', 8)); = processstr; //最后就是名称return f;}///<summary>///从Windows格式中返回⽂件信息///</summary>///<param name="Record">⽂件信息</param>private FileStruct ParseFileStructFromWindowsStyleRecord(string Record){FileStruct f = new FileStruct();string processstr = Record.Trim();string dateStr = processstr.Substring(0, 8);processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();string timeStr = processstr.Substring(0, 7);processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();DateTimeFormatInfo myDTFI = new CultureInfo("en-US", false).DateTimeFormat;myDTFI.ShortTimePattern = "t";f.CreateTime = DateTime.Parse(dateStr + "" + timeStr, myDTFI);if (processstr.Substring(0, 5) == "<DIR>"){f.IsDirectory = true;processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();}else{string[] strs = processstr.Split(new char[] { '' },2);// StringSplitOptions.RemoveEmptyEntries); // true); processstr = strs[1];f.IsDirectory = false;} = processstr;return f;}///<summary>///按照⼀定的规则进⾏字符串截取///</summary>///<param name="s">截取的字符串</param>///<param name="c">查找的字符</param>///<param name="startIndex">查找的位置</param>private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex){int pos1 = s.IndexOf(c, startIndex);string retString = s.Substring(0, pos1);s = (s.Substring(pos1)).Trim();return retString;}///<summary>///判断⽂件列表的⽅式Window⽅式还是Unix⽅式///</summary>///<param name="recordList">⽂件信息列表</param>private FileListStyle GuessFileListStyle(string[] recordList){foreach (string s in recordList){if (s.Length > 10&& Regex.IsMatch(s.Substring(0, 10), "(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)")){return FileListStyle.UnixStyle;}else if (s.Length > 8&& Regex.IsMatch(s.Substring(0, 8), "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]")){return FileListStyle.WindowsStyle;}}return FileListStyle.Unknown;}///<summary>///从FTP下载整个⽂件夹///</summary>///<param name="ftpDir">FTP⽂件夹路径</param>///<param name="saveDir">保存的本地⽂件夹路径</param>public void DownFtpDir(string ftpDir, string saveDir){List<FileStruct> files = ListFilesAndDirectories(ftpDir);if (!Directory.Exists(saveDir)){Directory.CreateDirectory(saveDir);}foreach (FileStruct f in files){if (f.IsDirectory) //⽂件夹,递归查询{DownFtpDir(ftpDir + "/" + , saveDir + "\\" + ); }else//⽂件,直接下载{DownLoadFile(ftpDir + "/" + , saveDir + "\\" + ); }}}#endregion}#region⽂件信息结构public struct FileStruct{public string Flags;public string Owner;public string Group;public bool IsDirectory;public DateTime CreateTime;public string Name;}public enum FileListStyle{UnixStyle,WindowsStyle,Unknown}#endregion。
C#使用FtpWebRequest与FtpWebResponse完成FTP操作
C#使⽤FtpWebRequest与FtpWebResponse完成FTP操作⼀、WebRequestMethods.Ftp类:表⽰可与 FTP 请求⼀起使⽤的 FTP 协议⽅法的类型。
Append F ile:表⽰要⽤于将⽂件追加到 FTP 服务器上的现有⽂件的 FTP APPE 协议⽅法。
Delete F ile:表⽰要⽤于删除 FTP 服务器上的⽂件的 FTP DELE 协议⽅法。
Download F ile:表⽰要⽤于从 FTP 服务器下载⽂件的 FTP RETR 协议⽅法。
Get D ate T imestamp:表⽰要⽤于从 FTP 服务器上的⽂件检索⽇期时间戳的 FTP MDTM 协议⽅法。
Get F ile S ize:表⽰要⽤于检索 FTP 服务器上的⽂件⼤⼩的 FTP SIZE 协议⽅法。
List D irectory:表⽰获取 FTP 服务器上的⽂件的简短列表的 FTP NLIST 协议⽅法。
List D irectory D etails:表⽰获取 FTP 服务器上的⽂件的详细列表的 FTP LIST 协议⽅法。
Make D irectory:表⽰在 FTP 服务器上创建⽬录的 FTP MKD 协议⽅法。
Print W orking D irectory:表⽰打印当前⼯作⽬录的名称的 FTP PWD 协议⽅法。
Remove D irectory:表⽰移除⽬录的 FTP RMD 协议⽅法。
Rename:表⽰重命名⽬录的 FTP RENAME 协议⽅法。
Upload F ile:表⽰将⽂件上载到 FTP 服务器的 FTP STOR 协议⽅法。
Upload F ile W ith U nique N ame:表⽰将具有唯⼀名称的⽂件上载到 FTP 服务器的 FTP STOU 协议⽅法。
⼆、上传⽂件:OpenFileDialog opFilDlg = new OpenFileDialog();if (opFilDlg.ShowDialog() == DialogResult.OK){ ftp = new YBBFTPClass("", "", "csp", "welcome", 0);ftp.UploadFile(opFilDlg.FileName);MessageBox.Show("上传成功");}/// <summary>/// ⽂件上传/// </summary>/// <param name="filename">本地⽂件路径</param>public void UploadFile(string filename){FileInfo fileInf = new FileInfo(filename);string uri = "ftp://" + RemoteHost + "/" + ;FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + RemoteHost + "/" + ));// 根据uri创建FtpWebRequest对象reqFTP.Credentials = new NetworkCredential(RemoteUser, RemotePass); // ftp⽤户名和密码reqFTP.KeepAlive = false; // 默认为true,连接不会被关闭,在⼀个命令之后被执⾏reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 指定执⾏什么命令eBinary = true; // 指定数据传输类型reqFTP.ContentLength = fileInf.Length; // 上传⽂件时通知服务器⽂件的⼤⼩int contentLen;FileStream fileStream = fileInf.OpenRead(); // 打开⼀个⽂件读取内容到fileStream中contentLen = fileStream.Read(buffer, 0, buffer.Length); ;//从fileStream读取数据到buffer中Stream requestStream = reqFTP.GetRequestStream();// 流内容没有结束while (contentLen != 0){requestStream.Write(buffer, 0, contentLen);// 把内容从buffer 写⼊ requestStream中,完成上传。
FTP C语言源代码
memset( &fileinfo, 0x00, sizeof(fileinfo) ); nRet = recv( s , ( char *)&fileinfo, sizeof(fileinfo), 0 ); if( nRet == SOCKET_ERROR ) {
return SOCK_RECVE_ERR; }
case SOCK_LISTEN_ERR: cout<<"SOCK_LISTEN_ERR"<<endl; break; 失败
// 监 听
case SOCK_ACCEPT_ERR: cout<<"SOCK_ACCEPT_ERR"<<endl; break; 连接失败
// 等 待
case SOCK_SEND_ERR: 失败
SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );//创建套接字
if( s == INVALID_SOCKET )
{ return SOCK_CRSOCK_ERR;
//错误处理
}
unsigned long uladdr; uladdr = inet_addr("127.0.0.1");
#define #define #define #define #define #define #define #define #define #define #define
TRAN_SUCCESS 1 //传输成功
SOCK_WSA_ERR (-1) //启动 winsock 失败
SOCK_CRSOCK_ERR (-2) //创建套接字失败
//保证字节顺序 //保证字节顺序
ftp操作方法整理
ftp操作⽅法整理1.整理简化了下C#的ftp操作,⽅便使⽤1.⽀持创建多级⽬录2.批量删除3.整个⽬录上传4.整个⽬录删除5.整个⽬录下载2.调⽤⽅法展⽰,var ftp = new FtpHelper("10.136.12.11", "qdx1213123", "123ddddf");//初始化ftp,创建ftp对象ftp.DelAll("test");//删除ftptest⽬录及其⽬录下的所有⽂件ftp.UploadAllFile("F:\\test\\wms.zip");//上传单个⽂件到指定⽬录ftp.UploadAllFile("F:\\test");//将本地test⽬录的所有⽂件上传ftp.DownloadFile("test\\wms.zip", "F:\\test1");//下载单个⽬录ftp.DownloadAllFile("test", "F:\\test1");//批量下载整个⽬录ftp.MakeDir("aaa\\bbb\\ccc\\ddd");//创建多级⽬录3.FtpHelper 代码。
1.异常⽅法委托,通过Lamda委托统⼀处理异常,⽅便改写。
加了个委托⽅便控制异常输出2.ftp的删除需要递归查找所有⽬录存⼊list,然后根据 level倒序排序,从最末级开始遍历删除3.其他的整个⽬录操作都是同上1using System;2using System.Collections.Generic;3using System.Linq;4using ;5using System.IO;67namespace MyStuday8 {9///<summary>10/// ftp帮助类11///</summary>12public class FtpHelper13 {14private string ftpHostIP { get; set; }15private string username { get; set; }16private string password { get; set; }17private string ftpURI { get { return $@"ftp://{ftpHostIP}/"; } }1819///<summary>20///初始化ftp参数21///</summary>22///<param name="ftpHostIP">ftp主机IP</param>23///<param name="username">ftp账户</param>24///<param name="password">ftp密码</param>25public FtpHelper(string ftpHostIP, string username, string password)26 {27this.ftpHostIP = ftpHostIP;ername = username;29this.password = password;30 }3132///<summary>33///异常⽅法委托,通过Lamda委托统⼀处理异常,⽅便改写34///</summary>35///<param name="method">当前执⾏的⽅法</param>36///<param name="action"></param>37///<returns></returns>38private bool MethodInvoke(string method, Action action)39 {40if (action != null)41 {42try43 {44 action();45//Logger.Write2File($@"FtpHelper.{method}:执⾏成功");46 FluentConsole.Magenta.Line($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执⾏成功"); 47return true;48 }49catch (Exception ex)50 {51 FluentConsole.Red.Line($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执⾏失败:\n {ex}"); 52// Logger.Write2File(FtpHelper({ftpHostIP},{username},{password}).{method}:执⾏失败 \r\n{ex}");53return false;54 }55 }57 {58return false;59 }60 }6162///<summary>63///异常⽅法委托,通过Lamda委托统⼀处理异常,⽅便改写64///</summary>65///</summary>66///<typeparam name="T"></typeparam>67///<param name="method"></param>68///<param name="func"></param>69///<returns></returns>70private T MethodInvoke<T>(string method, Func<T> func)71 {72if (func != null)73 {74try75 {76//FluentConsole.Magenta.Line($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执⾏成功");77//Logger.Write2File($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执⾏成功");78return func();79 }80catch (Exception ex)81 {82//FluentConsole.Red.Line($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执⾏失败:").Line(ex); 83// Logger.Write2File($@"FtpHelper({ftpHostIP},{username},{password}).{method}:执⾏失败 \r\n{ex}");84return default(T);85 }86 }87else88 {89return default(T);90 }91 }92private FtpWebRequest GetRequest(string URI)93 {94//根据服务器信息FtpWebRequest创建类的对象95 FtpWebRequest result = (FtpWebRequest)WebRequest.Create(URI);96 result.Credentials = new NetworkCredential(username, password);97 result.KeepAlive = false;98 ePassive = false;99 eBinary = true;100return result;101 }102103///<summary>上传⽂件</summary>104///<param name="filePath">需要上传的⽂件路径</param>105///<param name="dirName">⽬标路径</param>106public bool UploadFile(string filePath, string dirName = "")107 {108 FileInfo fileInfo = new FileInfo(filePath);109if (dirName != "") MakeDir(dirName);//检查⽂件⽬录,不存在就⾃动创建110string uri = bine(ftpURI, dirName, );111return MethodInvoke($@"uploadFile({filePath},{dirName})", () =>112 {113 FtpWebRequest ftp = GetRequest(uri);114 ftp.Method = WebRequestMethods.Ftp.UploadFile;115 ftp.ContentLength = fileInfo.Length;116int buffLength = 2048;117byte[] buff = new byte[buffLength];118int contentLen;119using (FileStream fs = fileInfo.OpenRead())120 {121using (Stream strm = ftp.GetRequestStream())122 {123 contentLen = fs.Read(buff, 0, buffLength);124while (contentLen != 0)125 {126 strm.Write(buff, 0, contentLen);127 contentLen = fs.Read(buff, 0, buffLength);128 }129 strm.Close();130 }131 fs.Close();132 }133 });134 }135136///<summary>137///从⼀个⽬录将其内容复制到另⼀⽬录138///</summary>139///<param name="localDir">源⽬录</param>140///<param name="DirName">⽬标⽬录</param>141public void UploadAllFile(string localDir, string DirName = "")142 {143string localDirName = string.Empty;144int targIndex = stIndexOf("\\");145if (targIndex > -1 && targIndex != (localDir.IndexOf(":\\") + 1))146 localDirName = localDir.Substring(0, targIndex);147 localDirName = localDir.Substring(targIndex + 1);148string newDir = bine(DirName, localDirName);149 MethodInvoke($@"UploadAllFile({localDir},{DirName})", () =>151 MakeDir(newDir);152 DirectoryInfo directoryInfo = new DirectoryInfo(localDir);153 FileInfo[] files = directoryInfo.GetFiles();154//复制所有⽂件155foreach (FileInfo file in files)156 {157 UploadFile(file.FullName, newDir);158 }159//最后复制⽬录160 DirectoryInfo[] directoryInfoArray = directoryInfo.GetDirectories();161foreach (DirectoryInfo dir in directoryInfoArray)162 {163 UploadAllFile(bine(localDir, ), newDir);164 }165 });166 }167168///<summary>169///删除单个⽂件170///</summary>171///<param name="filePath"></param>172public bool DelFile(string filePath)173 {174string uri = bine(ftpURI, filePath);175return MethodInvoke($@"DelFile({filePath})", () =>176 {177 FtpWebRequest ftp = GetRequest(uri);178 ftp.Method = WebRequestMethods.Ftp.DeleteFile;179 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();180 response.Close();181 });182 }183184///<summary>185///删除最末及空⽬录186///</summary>187///<param name="dirName"></param>188private bool DelDir(string dirName)189 {190string uri = bine(ftpURI, dirName);191return MethodInvoke($@"DelDir({dirName})", () =>192 {193 FtpWebRequest ftp = GetRequest(uri);194 ftp.Method = WebRequestMethods.Ftp.RemoveDirectory;195 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();196 response.Close();197 });198 }199200///<summary>删除⽬录或者其⽬录下所有的⽂件</summary>201///<param name="dirName">⽬录名称</param>202///<param name="ifDelSub">是否删除⽬录下所有的⽂件</param>203public bool DelAll(string dirName)204 {205var list = GetAllFtpFile(new List<ActFile>(),dirName);206if (list == null) return DelDir(dirName);207if (list.Count==0) return DelDir(dirName);//删除当前⽬录208var newlist = list.OrderByDescending(x => x.level);209foreach (var item in newlist)210 {211 FluentConsole.Yellow.Line($@"level:{item.level},isDir:{item.isDir},path:{item.path}"); 212 }213string uri = bine(ftpURI, dirName);214return MethodInvoke($@"DelAll({dirName})", () =>215 {216foreach (var item in newlist)217 {218if (item.isDir)//判断是⽬录调⽤⽬录的删除⽅法219 DelDir(item.path);220else221 DelFile(item.path);222 }223 DelDir(dirName);//删除当前⽬录224return true;225 });226 }227228///<summary>229///下载单个⽂件230///</summary>231///<param name="ftpFilePath">从ftp要下载的⽂件路径</param>232///<param name="localDir">下载⾄本地路径</param>233///<param name="filename">⽂件名</param>234public bool DownloadFile(string ftpFilePath, string saveDir)235 {236string filename = ftpFilePath.Substring(stIndexOf("\\") + 1);237string tmpname = Guid.NewGuid().ToString();238string uri = bine(ftpURI, ftpFilePath);239return MethodInvoke($@"DownloadFile({ftpFilePath},{saveDir},{filename})", () =>240 {241if (!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir);242 FtpWebRequest ftp = GetRequest(uri);246using (Stream responseStream = response.GetResponseStream())247 {248using (FileStream fs = new FileStream(bine(saveDir, filename), FileMode.CreateNew))249 {250byte[] buffer = new byte[2048];251int read = 0;252do253 {254 read = responseStream.Read(buffer, 0, buffer.Length);255 fs.Write(buffer, 0, read);256 } while (!(read == 0));257 responseStream.Close();258 fs.Flush();259 fs.Close();260 }261 responseStream.Close();262 }263 response.Close();264 }265 });266 }267268///<summary>269///从FTP下载整个⽂件夹270///</summary>271///<param name="dirName">FTP⽂件夹路径</param>272///<param name="saveDir">保存的本地⽂件夹路径</param>273public void DownloadAllFile(string dirName, string saveDir)274 {275 MethodInvoke($@"DownloadAllFile({dirName},{saveDir})", () =>276 {277 List<ActFile> files = GetFtpFile(dirName);278if (!Directory.Exists(saveDir))279 {280 Directory.CreateDirectory(saveDir);281 }282foreach (var f in files)283 {284if (f.isDir) //⽂件夹,递归查询285 {286 DownloadAllFile(bine(dirName,), bine(saveDir ,));287 }288else//⽂件,直接下载289 {290 DownloadFile(bine(dirName,), saveDir);291 }292 }293 });294 }295296///<summary>297///获取当前⽬录下的⽬录及⽂件298///</summary>299/// param name="ftpfileList"></param>300///<param name="dirName"></param>301///<returns></returns>302public List<ActFile> GetFtpFile(string dirName,int ilevel = 0)303 {304var ftpfileList = new List<ActFile>();305string uri = bine(ftpURI, dirName);306return MethodInvoke($@"GetFtpFile({dirName})", () =>307 {308var a = new List<List<string>>();309 FtpWebRequest ftp = GetRequest(uri);310 ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;311 Stream stream = ftp.GetResponse().GetResponseStream();312using (StreamReader sr = new StreamReader(stream))313 {314string line = sr.ReadLine();315while (!string.IsNullOrEmpty(line))316 {317 ftpfileList.Add(new ActFile { isDir = line.IndexOf("<DIR>") > -1, name = line.Substring(39).Trim(), path = bine(dirName, line.Substring(39).Trim()), level= ilevel }); 318 line = sr.ReadLine();319 }320 sr.Close();321 }322return ftpfileList;323 });324325326 }327328///<summary>329///获取FTP⽬录下的所有⽬录及⽂件包括其⼦⽬录和⼦⽂件330///</summary>331/// param name="result"></param>332///<param name="dirName"></param>333///<returns></returns>334public List<ActFile> GetAllFtpFile(List<ActFile> result,string dirName, int level = 0)335 {336var ftpfileList = new List<ActFile>();340 ftpfileList = GetFtpFile(dirName, level);341 result.AddRange(ftpfileList);342var newlist = ftpfileList.Where(x => x.isDir).ToList();343foreach (var item in newlist)344 {345 GetAllFtpFile(result,item.path, level+1);346 }347return result;348 });349350 }351352///<summary>353///检查⽬录是否存在354///</summary>355///<param name="dirName"></param>356///<param name="currentDir"></param>357///<returns></returns>358public bool CheckDir(string dirName, string currentDir = "")359 {360string uri = bine(ftpURI, currentDir);361return MethodInvoke($@"CheckDir({dirName}{currentDir})", () =>362 {363 FtpWebRequest ftp = GetRequest(uri);364 eBinary = true;365 ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;366 Stream stream = ftp.GetResponse().GetResponseStream();367using (StreamReader sr = new StreamReader(stream))368 {369string line = sr.ReadLine();370while (!string.IsNullOrEmpty(line))371 {372if (line.IndexOf("<DIR>") > -1)373 {374if (line.Substring(39).Trim() == dirName)375return true;376 }377 line = sr.ReadLine();378 }379 sr.Close();380 }381 stream.Close();382return false;383 });384385 }386387///</summary>388///在ftp服务器上创建指定⽬录,⽗⽬录不存在则创建389///</summary>390///<param name="dirName">创建的⽬录名称</param>391public bool MakeDir(string dirName)392 {393var dirs = dirName.Split('\\').ToList();//针对多级⽬录分割394string currentDir = string.Empty;395return MethodInvoke($@"MakeDir({dirName})", () =>396 {397foreach (var dir in dirs)398 {399if (!CheckDir(dir, currentDir))//检查⽬录不存在则创建400 {401 currentDir = bine(currentDir, dir);402string uri = bine(ftpURI, currentDir);403 FtpWebRequest ftp = GetRequest(uri);404 ftp.Method = WebRequestMethods.Ftp.MakeDirectory;405 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();406 response.Close();407 }408else409 {410 currentDir = bine(currentDir, dir);411 }412 }413414 });415416 }417418///<summary>⽂件重命名</summary>419///<param name="currentFilename">当前名称</param>420///<param name="newFilename">重命名名称</param>421///<param name="currentFilename">所在的⽬录</param>422public bool Rename(string currentFilename, string newFilename, string dirName = "") 423 {424string uri = bine(ftpURI, dirName, currentFilename);425return MethodInvoke($@"Rename({currentFilename},{newFilename},{dirName})", () => 426 {427 FtpWebRequest ftp = GetRequest(uri);428 ftp.Method = WebRequestMethods.Ftp.Rename;429 ftp.RenameTo = newFilename;430 FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();434 }435436public class ActFile437 {438public int level { get; set; } = 0; 439public bool isDir { get; set; }440public string name { get; set; } 441public string path { get; set; } = ""; 442 }443 }。
ftp工作原理
ftp工作原理FTP(File Transfer Protocol)是一种用于在计算机之间进行文件传输的标准网络协议。
它通过客户端和服务器之间的通信来实现文件的上传、下载和管理。
本文将详细介绍FTP的工作原理,包括连接建立、认证、数据传输和断开连接等过程。
1. 连接建立在FTP工作中,客户端与服务器之间通过TCP/IP协议建立连接。
客户端向服务器发送连接请求,服务器接受请求并建立连接。
连接建立后,客户端可以发送命令给服务器,并接收伏务器的响应。
2. 认证连接建立后,客户端需要进行身份认证以获得访问权限。
常见的认证方式包括用户名和密码认证,匿名访问和密钥认证等。
客户端发送用户名和密码给服务器进行验证,如果验证通过,客户端就可以执行后续的文件操作。
3. 命令传输客户端通过发送命令给服务器来控制文件的传输和管理。
常见的FTP命令包括:LIST(列出文件和目录)、CWD(改变当前工作目录)、PWD(显示当前工作目录)、RETR(下载文件)、STOR(上传文件)等。
客户端发送命令后,服务器会执行相应的操作,并返回响应给客户端。
4. 数据传输FTP使用两种模式进行数据传输:主动模式和被动模式。
在主动模式下,服务器主动连接客户端的数据端口,发送数据给客户端。
在被动模式下,客户端主动连接服务器的数据端口,接收伏务器发送的数据。
数据传输过程中,FTP使用二进制或者文本模式对数据进行传输,具体模式取决于文件的类型。
5. 断开连接当文件传输完成或者再也不需要连接时,客户端可以发送QUIT命令给服务器来断开连接。
服务器接收到QUIT命令后,关闭连接并释放相关资源。
总结:FTP工作原理包括连接建立、认证、命令传输、数据传输和断开连接等过程。
通过TCP/IP协议建立连接后,客户端发送命令给服务器进行文件的上传、下载和管理。
FTP支持多种认证方式,可以根据需求选择合适的方式进行身份验证。
数据传输过程中,FTP使用主动模式或者被动模式进行数据的传输。
用标准C语言编写一个ftp协议上传文件的简单程序
printf("Please input server's ip address : "); scanf("%s",strIP); //构建服务器地址信息 saServer.sin_family = AF_INET; saServer.sin_port = htons(SERVER_PORT); wIP = inet_addr(strIP);
#define #define
SERVER_PORT BUFFERLEN
6666 128
int main()
{
WORD
wVersionRequested;
WSADATA
wsadata;
int ret, nLength,length;
SOCKET
sListen, sServer;
/archiver/tid-196949.html
printf("bind() failed! error code: %d\n \n",WSAGetLastError()); closesocket(sListen); WSACleanup(); return 4; }
//侦听连接请求 ret = listen(sListen,5); if( ret == SOCKET_ERROR) {
//构建本地地址信息 saServer.sin_family = AF_INET; saServer.sin_port = htons(SERVER_PORT); saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
FtpWebRequest
//FtpWebRequest实现FTP上传//FtpWebRequest实现FTP上传//FtpWebRequest实现FTP上传//FtpWebRequest实现FTP上传//FtpWebRequest实现FTP上传//FtpWebRequest实现FTP上传class FTP_Class{string ftpServerIP;string ftpUserID;string ftpPassword;FtpWebRequest reqFTP;public void Connecttest(string ftpServerIP, string ftpUserID, string ftpPassword){// 根据uri创建FtpWebRequest对象reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP));// 指定数据传输类型eBinary = true;// ftp用户名和密码reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);}#region 连接/// <summary>/// 连接/// </summary>/// <param name="path"></param>private void Connect(String path)//连接ftp{// 根据uri创建FtpWebRequest对象reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));// 指定数据传输类型eBinary = true;// ftp用户名和密码reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);}#endregion#region ftp登录信息/// <summary>/// ftp登录信息/// </summary>/// <param name="ftpServerIP">ftpServerIP</param>/// <param name="ftpUserID">ftpUserID</param>/// <param name="ftpPassword">ftpPassword</param>public void FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword){this.ftpServerIP = ftpServerIP;this.ftpUserID = ftpUserID;this.ftpPassword = ftpPassword;}#endregion#region 获取文件列表/// <summary>/// 获取文件列表/// </summary>/// <param name="path"></param>/// <param name="WRMethods"></param>/// <returns></returns>private string[] GetFileList(string path, string WRMethods)//上面的代码示例了如何从ftp服务器上获得文件列表{string[] downloadFiles;StringBuilder result = new StringBuilder();Try{Connect(path);reqFTP.Method = WRMethods;WebResponse response = reqFTP.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);//中文文件名string line = reader.ReadLine();while (line != null){result.Append(line);result.Append("\n");line = reader.ReadLine();}// to remove the trailing '\n'result.Remove(result.ToString().LastIndexOf('\n'), 1);reader.Close();response.Close();return result.ToString().Split('\n');}catch (Exception ex){System.Windows.Forms.MessageBox.Show(ex.Message);downloadFiles = null;return downloadFiles;}}public string[] GetFileList(string path)//上面的代码示例了如何从ftp服务器上获得文件列表{return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory);}public string[] GetFileList()//上面的代码示例了如何从ftp服务器上获得文件列表{return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory);}#endregion#region 上传文件/// <summary>/// 上传文件/// </summary>/// <param name="filename"></param>public bool Upload(string filename, string path, out string errorinfo) //上面的代码实现了从ftp服务器上载文件的功能{path = path.Replace("\\", "/");FileInfo fileInf = new FileInfo(filename);string uri = "ftp://" + path + "/" + ;Connect(uri);//连接// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.UploadFile;// 上传文件时通知服务器文件的大小reqFTP.ContentLength = fileInf.Length;// 缓冲大小设置为kbint buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;// 打开一个文件流(System.IO.FileStream) 去读上传的文件FileStream fs = fileInf.OpenRead();try{// 把上传的文件写入流Stream strm = reqFTP.GetRequestStream();// 每次读文件流的kbcontentLen = fs.Read(buff, 0, buffLength);// 流内容没有结束while (contentLen != 0){// 把内容从file stream 写入upload streamstrm.Write(buff, 0, contentLen);contentLen = fs.Read(buff, 0, buffLength);}// 关闭两个流strm.Close();fs.Close();errorinfo = "完成";return true;}catch (Exception ex){errorinfo = string.Format("因{0},无法完成上传", ex.Message);return false;}}#endregion#region 续传文件/// <summary>/// 续传文件/// </summary>/// <param name="filename"></param>public bool Upload(string filename, long size,string path, out string errorinfo) //上面的代码实现了从ftp服务器上载文件的功能{path = path.Replace("\\", "/");FileInfo fileInf = new FileInfo(filename);//string uri = "ftp://" + path + "/" + ;string uri = "ftp://" + path;Connect(uri);//连接// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.AppendFile;// 上传文件时通知服务器文件的大小reqFTP.ContentLength = fileInf.Length;// 缓冲大小设置为kbint buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;// 打开一个文件流(System.IO.FileStream) 去读上传的文件FileStream fs = fileInf.OpenRead();try{StreamReader dsad = new StreamReader(fs);fs.Seek(size, SeekOrigin.Begin);// 把上传的文件写入流Stream strm = reqFTP.GetRequestStream();// 每次读文件流的kbcontentLen = fs.Read(buff, 0, buffLength);// 流内容没有结束while (contentLen != 0){// 把内容从file stream 写入upload streamstrm.Write(buff, 0, contentLen);contentLen = fs.Read(buff, 0, buffLength);}// 关闭两个流strm.Close();fs.Close();errorinfo = "完成";return true;}catch (Exception ex){errorinfo = string.Format("因{0},无法完成上传", ex.Message);return false;}}#endregion#region 下载文件/// <summary>/// 下载文件/// </summary>/// <param name="filePath"></param>/// <param name="fileName"></param>/// <param name="errorinfo"></param>/// <returns></returns>public bool Download(string ftpfilepath, string filePath, string fileName, out string errorinfo)////上面的代码实现了从ftp服务器下载文件的功能{try{filePath = filePath.Replace("我的电脑\\", "");String onlyFileName = Path.GetFileName(fileName);string newFileName = filePath + onlyFileName;if (File.Exists(newFileName)){errorinfo = string.Format("本地文件{0}已存在,无法下载", newFileName);return false;}ftpfilepath = ftpfilepath.Replace("\\", "/");string url = "ftp://" + ftpfilepath;Connect(url);//连接reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();long cl = response.ContentLength;int bufferSize = 2048;int readCount;byte[] buffer = new byte[bufferSize];readCount = ftpStream.Read(buffer, 0, bufferSize);FileStream outputStream = new FileStream(newFileName, FileMode.Create);while (readCount > 0){outputStream.Write(buffer, 0, readCount);readCount = ftpStream.Read(buffer, 0, bufferSize);}ftpStream.Close();outputStream.Close();response.Close();errorinfo = "";return true;}catch (Exception ex){errorinfo = string.Format("因{0},无法下载", ex.Message);return false;}}#endregion#region 删除文件/// <summary>/// 删除文件/// </summary>/// <param name="fileName"></param>public void DeleteFileName(string fileName){try{FileInfo fileInf = new FileInfo(fileName);string uri = "ftp://" + ftpServerIP + "/" + ;Connect(uri);//连接// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){//MessageBox.Show(ex.Message, "删除错误");}}#endregion#region 在ftp上创建目录/// <summary>/// 在ftp上创建目录/// </summary>/// <param name="dirName"></param>public void MakeDir(string dirName){try{string uri = "ftp://" + ftpServerIP + "/" + dirName;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){// MessageBox.Show(ex.Message);}}#endregion#region 删除ftp上目录/// <summary>/// 删除ftp上目录/// </summary>/// <param name="dirName"></param>public void delDir(string dirName){try{string uri = "ftp://" + ftpServerIP + "/" + dirName;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){// MessageBox.Show(ex.Message);}}#endregion#region 获得ftp上文件大小/// <summary>/// 获得ftp上文件大小/// </summary>/// <param name="filename"></param>/// <returns></returns>public long GetFileSize(string filename){long fileSize = 0;filename = filename.Replace("\\","/");try{// FileInfo fileInf = new FileInfo(filename);//string uri1 = "ftp://" + ftpServerIP + "/" + ;// string uri = filename;string uri = "ftp://" + filename;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();fileSize = response.ContentLength;response.Close();}catch (Exception ex){// MessageBox.Show(ex.Message);}return fileSize;}#endregion#region ftp上文件改名/// <summary>/// ftp上文件改名/// </summary>/// <param name="currentFilename"></param>/// <param name="newFilename"></param>public void Rename(string currentFilename, string newFilename){try{FileInfo fileInf = new FileInfo(currentFilename);string uri = "ftp://" + ftpServerIP + "/" + ;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.Rename;reqFTP.RenameTo = newFilename;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();//Stream ftpStream = response.GetResponseStream();//ftpStream.Close();response.Close();}catch (Exception ex){// MessageBox.Show(ex.Message);}}#endregion#region 获得文件明晰/// <summary>/// 获得文件明晰/// </summary>/// <returns></returns>public string[] GetFilesDetailList(){return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails);}/// <summary>/// 获得文件明晰/// </summary>/// <param name="path"></param>/// <returns></returns>public string[] GetFilesDetailList(string path){path = path.Replace("\\", "/");return GetFileList("ftp://" + path, WebRequestMethods.Ftp.ListDirectoryDetails);}#endregion}。
ftp用法
ftp用法FTP用法FTP(File Transfer Protocol)是一种用于在网络上传输文件的标准协议。
它允许用户从一个计算机向另一个计算机传输文件,也可以从远程计算机下载文件到本地计算机。
FTP的使用非常广泛,特别是在网站管理、软件开发和文件共享等领域。
下面将详细介绍FTP的用法。
一、FTP客户端软件要使用FTP,需要安装一款FTP客户端软件。
常见的FTP客户端软件有FileZilla、CuteFTP、WinSCP等。
这些软件都提供了图形界面,使得用户可以方便地进行文件传输操作。
二、连接到FTP服务器在使用FTP之前,需要连接到目标服务器。
通常情况下,需要输入以下信息:1. FTP服务器地址:通常是一个IP地址或域名。
2. 用户名:登录FTP服务器所需的用户名。
3. 密码:登录FTP服务器所需的密码。
连接方式有两种:1. 匿名登录:如果目标服务器允许匿名登录,则可以不输入用户名和密码直接连接到服务器。
2. 普通登录:如果目标服务器要求输入用户名和密码,则需要输入正确的用户名和密码才能连接到服务器。
三、上传文件上传文件是指将本地计算机中的文件传输到远程服务器上。
上传文件有两种方式:1. 通过拖拽上传:打开本地计算机中的文件夹,将需要上传的文件拖拽到FTP客户端软件中的远程服务器目录下即可。
2. 通过上传按钮上传:在FTP客户端软件中选择需要上传的文件,点击上传按钮即可将文件传输到远程服务器。
四、下载文件下载文件是指将远程服务器上的文件传输到本地计算机上。
下载文件有两种方式:1. 通过拖拽下载:打开FTP客户端软件中的远程服务器目录,将需要下载的文件拖拽到本地计算机中的文件夹即可。
2. 通过下载按钮下载:在FTP客户端软件中选择需要下载的文件,点击下载按钮即可将文件传输到本地计算机。
五、管理FTP服务器除了进行文件传输操作之外,FTP客户端软件还可以对FTP服务器进行管理。
常见的管理操作有以下几种:1. 创建目录:在FTP客户端软件中选择需要创建目录的位置,点击创建目录按钮即可创建新目录。
VC下FTP服务器实现
一、编写FTP服务器:二、连接协议:所有ftp协议没有2进制数字,全部用文本格式收发。
发送协议:协议号+描述+CRLF接收协议:协议键+描述+CRLF其中,协议号和协议键是关键字,不能随意变换。
#define CRLF “\r\n”CRLF作为校验使用,因此是必须出现在发送或者接收字串的结尾。
发送长度必须等于strlen或者string.length。
发送长度也是校验条件之一。
协议键不区分大小写给以处理。
例如:创建ftp端口21,使用IE浏览器执行登录。
收到Accept连接后立即返回Send1,之后使用Receive接收你将收到Recv2。
依次向下收发,得到的测试结果如下:Send1=220 127.0.0.1 FtpD for freeRecv2=USER testSend3=331 Password required for test .Recv4=PASS testSend5=230 User test logged in , proceedRecv6=opts utf8 onSend7=502 Command OPTS utf8 on not implementedRecv8=systSend9=215 WindowsRecv10=site helpSend11=502 Command SITE help not implementedRecv12=PWDSend13=257 "/" is current directoryRecv14=CWD /subing/Send15=250 "/subing/" is current directory.Recv16=TYPE ASend17=200 Type set to ASCII.Recv18=PASVSend19=425 Cannot open data connection (192.168.1.13 0 create failed)Recv20=TYPE ASend21=200 Type set to ASCII.Recv22=PORT 127,0,0,1,4,226Send23=200 Port command okay.Recv24=LISTSend25=150 Opening ASCII NO-PRINT mode data connection for ls -l.三、协议内容:每一个协议都是一个判断分支语句,得到是或否的结果再返回(发送)。
FTP命令基本使用方法
FTP命令基本使用方法FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。
通过FTP,可以将文件从一台计算机移动到另一台计算机,或者将文件从本地计算机上传到服务器。
1.连接到FTP服务器ftp [IP地址或域名]通过该命令连接到指定的FTP服务器。
2.登录用户名:ftp [用户名]密码:[输入密码]例如:ftp user1输入正确的用户名和密码,登录到FTP服务器。
如果没有设置用户名和密码,可以直接回车进行匿名登录。
3.列出目录内容ls例如:ls列出当前目录的文件和子目录。
4.切换目录cd [目录名]例如:cd uploads进入指定的目录。
5.切换到上级目录cd ..例如:cd ..返回上级目录。
get [文件名]例如:get file1.txt7.上传文件put [本地文件名]例如:put file2.txt将本地计算机上的文件上传到FTP服务器。
8.删除文件delete [文件名]例如:delete file3.txt删除FTP服务器上的指定文件。
9.创建目录mkdir [目录名]例如:mkdir newdir在当前目录中创建一个新的子目录。
10.删除目录rmdir [目录名]例如:rmdir olddir删除当前目录中的指定子目录。
11.退出FTP服务器bye例如:bye断开与FTP服务器的连接并退出。
以上是FTP命令的基本使用方法,通过这些命令,可以在FTP服务器和本地计算机之间进行文件传输和管理。
通过FTP客户端软件,也可以更直观地使用FTP功能,如FileZilla、CuteFTP等。
用标准C语言编写一个ftp协议上传文件的简单程序
sunkaidong 发表于 2008-1-11 12:57
是啊,很困难,但是只有困难才有意思啊.羡慕黑客,不如自己漫漫学习写程序,有一天你会觉得写程序很简单很好玩啊
VxWorks 发表于 2008-1-11 13:06
没有想象中的那么难。给个TCP协议传输数据的例子看看:
服务器端:[code]#include <stdio.h> #include <winsock2.h> #include <time.h> #pragma comment(lib,"ws2_32.lib ")
//构建本地地址信息 saServer.sin_family = AF_INET; saServer.sin_port = htons(SERVER_PORT); saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//绑定 ret = bind(sListen,(struct sockaddr *)&saServer,sizeof(saServer)); if( ret == SOCKET_ERROR) {
Sleep((DWORD)100); }
closesocket(sListen); WSACleanup();
puts("press Enter to exit!"); getchar(); return 0;
}[/code]客户端:[code]#include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib ")
WSACleanup(); printf("socket() failed \n"); return 3; }
ftp的使用方法
FTP(File Transfer Protocol)是一种用于在计算机之间传输文件的协议。
以下是FTP 的使用方法:
1. 安装FTP 客户端:首先,您需要在您的计算机上安装一个FTP 客户端,例如FileZilla、WinSCP 等。
2. 设置FTP 站点:打开FTP 客户端,并进行站点设置。
这包括输入FTP 服务器的IP 地址或域名,以及端口号(通常为21)。
3. 连接到FTP 服务器:在FTP 客户端中,点击“连接”或“打开”按钮,以建立与FTP 服务器的连接。
4. 浏览和下载文件:连接成功后,您可以在FTP 客户端中浏览服务器上的文件和目录。
选择所需的文件或目录,然后将其下载到本地计算机。
5. 上传文件:在FTP 客户端中,选择要上传的文件,然后点击“上传”按钮将文件上传到FTP 服务器。
6. 修改文件:在FTP 服务器上,您可以编辑、删除或重命名文件。
7. 断开连接:完成文件传输后,点击FTP 客户端中的“断开”或“退出”按钮,断开与FTP 服务器的连接。
此外,您还可以使用命令行方式(在DOS 或Linux 操作系统中)执行FTP 操作。
命令格式为:
```
ftp -s:主机名或IP 地址
```
然后,根据提示输入用户名和密码进行身份验证。
之后,您可以使用相应的命令进行文件上传和下载,如:
```
上传文件:put 本地文件路径远程目录路径
下载文件:get 远程文件路径本地目录路径
```。
c#实现ftp下载
c#实现ftp下载public string Download(string filePath, string fileName)////上面的代码实现了从ftp服务器下载文件的功能{try{String onlyFileName = Path.GetFileName(fileName);string newFileName = filePath + "\\" + onlyFileName;if (File.Exists(newFileName)){return "本地文件" + newFileName + "已存在,无法下载";}string url = "ftp://" + ftpServerIP + "/" + fileName;Connect(url);//连接reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);FtpWebResponse response =(FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();long cl = response.ContentLength;int bufferSize = 2048;int readCount;byte[] buffer = new byte[bufferSize];readCount = ftpStream.Read(buffer, 0, bufferSize);FileStream outputStream = new FileStream(newFileName, FileMode.Create);while (readCount > 0){outputStream.Write(buffer, 0, readCount);readCount = ftpStream.Read(buffer, 0, bufferSize);}ftpStream.Close();outputStream.Close();response.Close();return "";}catch (Exception ex){return "因"+ex.Message+",无法下载";}}C# codestring TempFolderPath = System.Configuration.ConfigurationManager.AppSettings["Tem pFolderPath"].T oString();//本地保存目录string FtpUserName = System.Configuration.ConfigurationManager.AppSettings["FtpU serName"].ToString();string FtpPassWord = System.Configuration.ConfigurationManager.AppSettings["FtpP assWord"].ToString();string LocalFileExistsOperation = System.Configuration.ConfigurationManager.AppSettings//是否允许写入["LocalFileExistsOperation"].T oString();Uri uri = new Uri("202.156.37.21");string FileName = Path.GetFullPath(TempFolderPath) + Path.DirectorySeparatorChar.ToString() + Path.GetFileName(uri.LocalPath);//创建一个文件流FileStream fs = null;Stream responseStream = null;try{//创建一个与FTP服务器联系的FtpWebRequest对象FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);//设置请求的方法是FTP文件下载request.Method = WebRequestMethods.Ftp.DownloadFile;//连接登录FTP服务器request.Credentials = new NetworkCredential(FtpUserName, FtpPassWord);//获取一个请求响应对象FtpWebResponse response = (FtpWebResponse)request.GetResponse();//获取请求的响应流responseStream = response.GetResponseStream();//判断本地文件是否存在,如果存在,则打开和重写本地文件if (File.Exists(FileName)){if (LocalFileExistsOperation == "write"){[color=#FF0000]fs = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite);[/color]}}//判断本地文件是否存在,如果不存在,则创建本地文件else{fs = File.Create(FileName);}if (fs != null){int buffer_count = 65536;byte[] buffer = new byte[buffer_count];int size = 0;while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0){fs.Write(buffer, 0, size);}fs.Flush();fs.Close();responseStream.Close();}}finally{if (fs != null)fs.Close();if (responseStream != null)responseStream.Close();}现在迷惑的是这句话:fs = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite);我感觉它只是从ftp下载文件到web服务器上指定的目录,而不是下载到每个浏览网站的客户的机器,请问是不是这样的呢?.net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等using System;using System.Collections.Generic;using System.Text;using /doc/441636113.html,;using System.IO;using System.Windows.Forms;namespace ConvertData{class FtpUpDown{string ftpServerIP;string ftpUserID;string ftpPassword;FtpWebRequest reqFTP;private void Connect(String path)//连接ftp{// 根据uri创建FtpWebRequest对象reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));// 指定数据传输类型/doc/441636113.html,eBinary = true;// ftp用户名和密码reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);}public FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword){this.ftpServerIP = ftpServerIP;this.ftpUserID = ftpUserID;this.ftpPassword = ftpPassword;}//都调用这个private string[] GetFileList(string path, string WRMethods)//上面的代码示例了如何从ftp服务器上获得文件列表{string[] downloadFiles;StringBuilder result = new StringBuilder();try{Connect(path);reqFTP.Method = WRMethods;WebResponse response = reqFTP.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream(),System.Text.Encoding.Default);//中文文件名string line = reader.ReadLine();while (line != null){result.Append(line);result.Append(" ");line = reader.ReadLine();}// to remove the trailing '' ''result.Remove(result.ToString().LastIndexOf('' ''), 1);reader.Close();response.Close();return result.ToString().Split('' '');}catch (Exception ex){System.Windows.Forms.MessageBox.Show(ex.Message);downloadFiles = null;return downloadFiles;}}public string[] GetFileList(string path)//上面的代码示例了如何从ftp服务器上获得文件列表{return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory);}public string[] GetFileList()//上面的代码示例了如何从ftp服务器上获得文件列表{return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory);}public void Upload(string filename) //上面的代码实现了从ftp 服务器上载文件的功能{FileInfo fileInf = new FileInfo(filename);string uri = "ftp://" + ftpServerIP + "/" + /doc/441636113.html,;Connect(uri);//连接// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.UploadFile;// 上传文件时通知服务器文件的大小reqFTP.ContentLength = fileInf.Length;// 缓冲大小设置为kbint buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;// 打开一个文件流(System.IO.FileStream) 去读上传的文件FileStream fs = fileInf.OpenRead();try{// 把上传的文件写入流Stream strm = reqFTP.GetRequestStream();// 每次读文件流的kbcontentLen = fs.Read(buff, 0, buffLength);// 流内容没有结束while (contentLen != 0){// 把内容从file stream 写入upload streamstrm.Write(buff, 0, contentLen);contentLen = fs.Read(buff, 0, buffLength);}// 关闭两个流strm.Close();fs.Close();}catch (Exception ex){MessageBox.Show(ex.Message, "Upload Error");}}public bool Download(string filePath, string fileName, out string errorinfo)/**/////上面的代码实现了从ftp服务器下载文件的功能{try{String onlyFileName = Path.GetFileName(fileName);string newFileName = filePath + "\" + onlyFileName;if (File.Exists(newFileName)){errorinfo = string.Format("本地文件{0}已存在,无法下载", newFileName);return false;}string url = "ftp://" + ftpServerIP + "/" + fileName;Connect(url);//连接reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();long cl = response.ContentLength;int bufferSize = 2048;int readCount;byte[] buffer = new byte[bufferSize];readCount = ftpStream.Read(buffer, 0, bufferSize);FileStream outputStream = new FileStream(newFileName, FileMode.Create);while (readCount > 0){outputStream.Write(buffer, 0, readCount);readCount = ftpStream.Read(buffer, 0, bufferSize);}ftpStream.Close();outputStream.Close();response.Close();errorinfo = "";return true;}catch (Exception ex){errorinfo = string.Format("因{0},无法下载", ex.Message);return false;}}//删除文件public void DeleteFileName(string fileName){try{FileInfo fileInf = new FileInfo(fileName);string uri = "ftp://" + ftpServerIP + "/" + /doc/441636113.html,;Connect(uri);//连接// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;FtpWebResponse response =(FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){MessageBox.Show(ex.Message, "删除错误");}}//创建目录public void MakeDir(string dirName){try{string uri = "ftp://" + ftpServerIP + "/" + dirName;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){MessageBox.Show(ex.Message);}}//删除目录public void delDir(string dirName){try{string uri = "ftp://" + ftpServerIP + "/" + dirName;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){MessageBox.Show(ex.Message);}}//获得文件大小public long GetFileSize(string filename){long fileSize = 0;try{FileInfo fileInf = new FileInfo(filename);string uri = "ftp://" + ftpServerIP + "/" + /doc/441636113.html,;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();fileSize = response.ContentLength;response.Close();}catch (Exception ex)MessageBox.Show(ex.Message);}return fileSize;}//文件改名public void Rename(string currentFilename, string newFilename){try{FileInfo fileInf = new FileInfo(currentFilename);string uri = "ftp://" + ftpServerIP + "/" + /doc/441636113.html,;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.Rename;reqFTP.RenameTo = newFilename;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();//Stream ftpStream = response.GetResponseStream();//ftpStream.Close();response.Close();}catch (Exception ex){MessageBox.Show(ex.Message);}}//获得文件明晰public string[] GetFilesDetailList()return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails);}//获得文件明晰public string[] GetFilesDetailList(string path){return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectoryDetails);}}}-----------------------测试//获得文件列表private void button1_Click(object sender, EventArgs e){FtpUpDown ftpUpDown = new FtpUpDown(ConvertData.Properties.Settings.Default.ftpServerIP, ConvertData.Properties.Settings.Default.ftpUserID,ConvertData.Properties.Settings.Default.ftpPassword);string[] str = ftpUpDown.GetFileList("2005");richT extBox1.Lines = str;}//下载private void button2_Click(object sender, EventArgs e){FtpUpDown ftpUpDown = new FtpUpDown(ConvertData.Properties.Settings.Default.ftpServerIP, ConvertData.Properties.Settings.Default.ftpUserID,ConvertData.Properties.Settings.Default.ftpPassword);ftpUpDown.Download("c:\", "2007/11/01/57070.pdf");}//上传private void button3_Click(object sender, EventArgs e){FtpUpDown ftpUpDown = new FtpUpDown(ConvertData.Properties.Settings.Default.ftpServerIP, ConvertData.Properties.Settings.Default.ftpUserID,ConvertData.Properties.Settings.Default.ftpPassword);ftpUpDown.Upload("c:\57070.pdf");}。
C#从基于FTPS的FTPserver下载数据(FtpWebRequest的使用)SSL加密
C#从基于FTPS的FTPserver下载数据(FtpWebRequest的使⽤)SSL加密FTPS,亦或是FTPES, 是FTP协议的⼀种扩展,⽤于对TLS和SSL协议的⽀持。
本⽂讲述了如何从⼀个基于FTPS的Server中下载数据的实例。
任何地⽅,如有纰漏,欢迎诸位道友指教。
话不多,上码。
1using System;2using ;3using System.IO;4using .Security;5using System.Security.Cryptography.X509Certificates;67namespace FtpWebrequestBlogCase8 {9class Program10 {11static void Main(string[] args)12 {13 DownLoadFile("ftp://xxx/xxx.zip");14 Console.ReadKey();15 }1617public static void DownLoadFile(string addr)18 {19var req = (FtpWebRequest)WebRequest.Create(addr);20 req.Method = WebRequestMethods.Ftp.DownloadFile;21 eBinary = true;22 ePassive = true;23const string userName = "xxxx";24const string password = "xxxx";25 req.Credentials = new NetworkCredential(userName, password);2627//如果要连接的 FTP 服务器要求凭据并⽀持安全套接字层 (SSL),则应将 EnableSsl 设置为 true。
FTP服务器源代码C语言
FTP服务器端源代码:// Mini FtpServer.cpp : Defines the entry point for the console application. #include "stdafx.h"#include <string.h>#include <ws2tcpip.h>#include <stdlib.h>#pragma comment(lib,”ws2_32.lib”);#define WSA_RECV 0#define WSA_SEND 1#define DATA_BUFSIZE 8192#define MAX_NAME_LEN 128#define MAX_PWD_LEN 128#define MAX_RESP_LEN 1024#define MAX_REQ_LEN 256#define MAX_ADDR_LEN 80#define FTP_PORT 21 // FTP 控制端口#define DATA_FTP_PORT 20 // FTP 数据端口#define USER_OK 331#define LOGGED_IN 230#define LOGIN_FAILED 530#define CMD_OK 200#define OPENING_AMODE 150#define TRANS_COMPLETE 226#define CANNOT_FIND 550#define FTP_QUIT 221#define CURR_DIR 257#define DIR_CHANGED 250#define OS_TYPE 215#define REPLY_MARKER 504#define PASSIVE_MODE 227#define FTP_USER "toldo"#define FTP_PASS "toldo"#define DEFAULT_HOME_DIR "C:\\TEMP"#define MAX_FILE_NUM 1024#define MODE_PORT 0#define MODE_PASV 1#define PORT_BIND 1821typedef struct {CHAR buffRecv[DATA_BUFSIZE];CHAR buffSend[DATA_BUFSIZE];WSABUF wsaBuf;SOCKET s;WSAOVERLAPPED o;DWORD dwBytesSend;DWORD dwBytesRecv;int nStatus;} SOCKET_INF, *LPSOCKET_INF;typedef struct {TCHAR szFileName[MAX_PATH];DWORD dwFileAttributes;FILETIME ftCreationTime;FILETIME ftLastAccessTime;FILETIME ftLastWriteTime;DWORD nFileSizeHigh;DWORD nFileSizeLow;} FILE_INF, *LPFILE_INF;DWORD WINAPI ProcessTreadIO( LPVOID lpParam ) ;BOOL WelcomeInfo( SOCKET s );int LoginIn( LPSOCKET_INF pSocketInfo );int SendRes( LPSOCKET_INF pSI );int RecvReq( LPSOCKET_INF pSI );int DealCommand( LPSOCKET_INF pSI );int GetFileList( LPFILE_INF pFI, UINT nArraySize, const char* szPath ); char* GetLocalAddress();char* HostToNet( char* szPath ) ;char* NetToHost( char* szPath ) ;char* RelativeDirectory( char* szDir );char* AbsoluteDirectory( char* szDir );DWORD g_dwEventTotal = 0;DWORD g_index;WSAEVENT g_events[WSA_MAXIMUM_WAIT_EVENTS]; LPSOCKET_INF g_sockets[WSA_MAXIMUM_WAIT_EVENTS]; CRITICAL_SECTION g_cs;char g_szLocalAddr[MAX_ADDR_LEN];BOOL g_bLoggedIn;// 主函数,控制台程序开始的地方void main(void){WSADATA wsaData;SOCKET sListen, sAccept;SOCKADDR_IN inetAddr;DWORD dwFlags;DWORD dwThreadId;DWORD dwRecvBytes;INT nRet;InitializeCriticalSection(&g_cs);if (( nRet = WSAStartup(0x0202,&wsaData)) != 0 ) {printf("错误:WSAStartup failed with error %d\n", nRet);return;}// 先取得本地地址sprintf( g_szLocalAddr,"%s",GetLocalAddress() );if ((sListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET){printf("错误:Failed to get a socket %d\n", WSAGetLastError());WSACleanup();return;}inetAddr.sin_family = AF_INET;inetAddr.sin_addr.s_addr = htonl(INADDR_ANY);inetAddr.sin_port = htons(FTP_PORT);if (bind(sListen, (PSOCKADDR) &inetAddr, sizeof(inetAddr)) == SOCKET_ERROR) {printf("错误:bind() failed with error %d\n", WSAGetLastError());return;}if (listen(sListen, SOMAXCONN)){printf("错误:listen() failed with error %d\n", WSAGetLastError());return;}printf("Mini Ftpserver已经启动\n");printf("Mini Ftpserver开始侦听\n");if ((sAccept = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET){printf("错误:Failed to get a socket %d\n", WSAGetLastError());return;}//创建第一个手动重置对象if ((g_events[0] = WSACreateEvent()) == WSA_INVALID_EVENT){printf("错误:WSACreateEvent failed with error %d\n", WSAGetLastError());return;}// 创建一个线程处理请求if (CreateThread(NULL, 0, ProcessTreadIO, NULL, 0, &dwThreadId) == NULL) {printf("错误:CreateThread failed with error %d\n", GetLastError());return;}g_dwEventTotal = 1;while(TRUE){//处理入站连接if ((sAccept = accept(sListen, NULL, NULL)) == INVALID_SOCKET){printf("错误:accept failed with error %d\n", WSAGetLastError());return;}//回传欢迎消息if( !WelcomeInfo( sAccept ) ) break;//设置ftp根目录if( !SetCurrentDirectory( DEFAULT_HOME_DIR ) ) break;//操作临界区,防止出错EnterCriticalSection(&g_cs);//创建一个新的SOCKET_INF结构处理接受的数据socket.if ((g_sockets[g_dwEventTotal] = (LPSOCKET_INF)GlobalAlloc(GPTR,sizeof(SOCKET_INF))) == NULL){printf("错误:GlobalAlloc() failed with error %d\n", GetLastError());return;}//初始化新的SOCKET_INF结构char buff[DATA_BUFSIZE]; memset( buff,0,DATA_BUFSIZE );g_sockets[g_dwEventTotal]->wsaBuf.buf = buff;g_sockets[g_dwEventTotal]->wsaBuf.len = DATA_BUFSIZE;g_sockets[g_dwEventTotal]->s = sAccept;memset(&(g_sockets[g_dwEventTotal]->o),0, sizeof(OVERLAPPED));g_sockets[g_dwEventTotal]->dwBytesSend = 0;g_sockets[g_dwEventTotal]->dwBytesRecv = 0;g_sockets[g_dwEventTotal]->nStatus = WSA_RECV; // 接收//创建事件if ((g_sockets[g_dwEventTotal]->o.hEvent = g_events[g_dwEventTotal] = WSACreateEvent()) == WSA_INVALID_EVENT){printf("WSACreateEvent() failed with error %d\n", WSAGetLastError());return;}//发出接受请求dwFlags = 0;if (WSARecv(g_sockets[g_dwEventTotal]->s,&(g_sockets[g_dwEventTotal]->wsaBuf), 1, &dwRecvBytes, &dwFlags,&(g_sockets[g_dwEventTotal]->o), NULL) == SOCKET_ERROR){if (WSAGetLastError() != ERROR_IO_PENDING){printf("错误:WSARecv() failed with error %d\n", WSAGetLastError());return;}}g_dwEventTotal++;//离开临界区LeaveCriticalSection(&g_cs);//使第一个事件有信号。
C#网络编程专题11:实现一个基于FTP协议的程序
[C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器(转载: /zhili/archive/2012/08/23/WebServer.html)引言:在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信大家追MM都有自己的经验的,我感觉大部分的过程肯定是——第一步:先通过工作关系或者朋友关系等认识MM(认识FTP协议,知道FTP协议的是什么);第二步:当然了解MM有兴趣爱好了(了解FTP协议有哪些命令和工作过程)第三步:如果对方是你的菜的话,那当然要采取追求的了(就好比用了解到的FTP协议来实现一个文件上传下载器)。
不过追MM好像对我来说还是比较难的了,所以还是言归正传了,还是好好的学习我的代码吧,回到本章的内容——FTP的协议。
(注:最近想好好改进下文章的幽默程度,所以文章中会尽量以有趣的生活中的例子来表述网络编程的知识,希望可以让大家在学习知识的同时也可以获得乐趣,如果有什么地方理解不准确的还望大家多多指出。
)一、FTP协议的自我介绍我们在上学的时候,同学们第一次开学的时候老师一般会组织大学到讲台上进行自我介绍,让同学都互相认识,同样,如果对于没有接触过FTP协议的朋友来说,FTP协议的自我介绍当然也是不可避免的了,这样我们才能进一步去了解FTP协议“这位同学”了,之后才能和他成为好朋友,或者是好基友了。
下面就开始FTP协议同学的自我介绍了,大家热烈欢迎。
FTP 协议同学:大家好,我的名字叫FTP,FTP是文件传输协议(File Transfer Protocol,FTP),我的工作就是负责将文件从一台计算机传输到另外一台计算机,并且我还可以保证传输的可靠性。
我的工作流程可以通过下面的一张图来表达:从图中大家应该可以明白我的工作过程了吧,我的工作过程是典型的C/S 模式——我的客户端(在本章实现的文件上传下载器属于客户端)首先发起与我的服务器连接连接,告诉我的服务器说“我现在想和你聊聊天”,然后我的服务器收到这个请求后给出回答——“聊天,当然可以了,我批准了”,客户端收到这个信息后,就可以服务器之间就建立一条马路或者是通道,然后我的客户端好还想进一步了解下我的服务器,在发出一个说“我想要下载你上面的东西或者是我想上传一些文件到你那里,想让你帮我保管下,这样我可以随处都可以从你那里得到我上传的资料的”,我的服务器收到请求后,如果允许客户端这么做的话就会回答说“可以啊”(就像我们追女生一样,建立好关系后,当然就要表白了,此时我们就说“我很喜欢你之类的话”,然后等待MM的回答,“可以啊”这个答案都是我们希望听到的答案的),我的客户端听到后非常开心,马上选择自己需要上传的文件或者想从服务器下载的文件找到,上传或者下载该文件的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
class FTP_Class{string ftpServerIP;string ftpUserID;string ftpPassword;FtpWebRequest reqFTP;public void Connecttest(string ftpServerIP, string ftpUserID, string ftpPassword){// 根据uri创建FtpWebRequest对象reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP));// 指定数据传输类型eBinary = true;// ftp用户名和密码reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);}#region 连接/// <summary>/// 连接/// </summary>/// <param name="path"></param>private void Connect(String path)//连接ftp{// 根据uri创建FtpWebRequest对象reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));// 指定数据传输类型eBinary = true;// ftp用户名和密码reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);}#endregion#region ftp登录信息/// <summary>/// ftp登录信息/// </summary>/// <param name="ftpServerIP">ftpServerIP</param>/// <param name="ftpUserID">ftpUserID</param>/// <param name="ftpPassword">ftpPassword</param>public void FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword){this.ftpServerIP = ftpServerIP;this.ftpUserID = ftpUserID;this.ftpPassword = ftpPassword;}#endregion#region 获取文件列表/// <summary>/// 获取文件列表/// </summary>/// <param name="path"></param>/// <param name="WRMethods"></param>/// <returns></returns>private string[] GetFileList(string path, string WRMethods)//上面的代码示例了如何从ftp服务器上获得文件列表{string[] downloadFiles;StringBuilder result = new StringBuilder();try{Connect(path);reqFTP.Method = WRMethods;WebResponse response = reqFTP.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);//中文文件名string line = reader.ReadLine();while (line != null){result.Append(line);result.Append("\n");line = reader.ReadLine();}// to remove the trailing '\n'result.Remove(result.ToString().LastIndexOf('\n'), 1);reader.Close();response.Close();return result.ToString().Split('\n');}catch (Exception ex){System.Windows.Forms.MessageBox.Show(ex.Message);downloadFiles = null;return downloadFiles;}}public string[] GetFileList(string path)//上面的代码示例了如何从ftp服务器上获得文件列表{return GetFileList("ftp://" + ftpServerIP + "/" + path, WebRequestMethods.Ftp.ListDirectory);}public string[] GetFileList()//上面的代码示例了如何从ftp服务器上获得文件列表{return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectory);}#endregion#region 上传文件/// <summary>/// 上传文件/// </summary>/// <param name="filename"></param>public bool Upload(string filename, string path, out string errorinfo) //上面的代码实现了从ftp服务器上载文件的功能{path = path.Replace("\\", "/");FileInfo fileInf = new FileInfo(filename);string uri = "ftp://" + path + "/" + ;Connect(uri);//连接// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.UploadFile;// 上传文件时通知服务器文件的大小reqFTP.ContentLength = fileInf.Length;// 缓冲大小设置为kbint buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;// 打开一个文件流(System.IO.FileStream) 去读上传的文件FileStream fs = fileInf.OpenRead();try{// 把上传的文件写入流Stream strm = reqFTP.GetRequestStream();// 每次读文件流的kbcontentLen = fs.Read(buff, 0, buffLength);// 流内容没有结束while (contentLen != 0){// 把内容从file stream 写入upload streamstrm.Write(buff, 0, contentLen);contentLen = fs.Read(buff, 0, buffLength);}// 关闭两个流strm.Close();fs.Close();errorinfo = "完成";return true;}catch (Exception ex){errorinfo = string.Format("因{0},无法完成上传", ex.Message);return false;}}#endregion#region 续传文件/// <summary>/// 续传文件/// </summary>/// <param name="filename"></param>public bool Upload(string filename, long size,string path, out string errorinfo) //上面的代码实现了从ftp服务器上载文件的功能{path = path.Replace("\\", "/");FileInfo fileInf = new FileInfo(filename);//string uri = "ftp://" + path + "/" + ;string uri = "ftp://" + path;Connect(uri);//连接// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.AppendFile;// 上传文件时通知服务器文件的大小reqFTP.ContentLength = fileInf.Length;// 缓冲大小设置为kbint buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;// 打开一个文件流(System.IO.FileStream) 去读上传的文件FileStream fs = fileInf.OpenRead();try{StreamReader dsad = new StreamReader(fs);fs.Seek(size, SeekOrigin.Begin);// 把上传的文件写入流Stream strm = reqFTP.GetRequestStream();// 每次读文件流的kbcontentLen = fs.Read(buff, 0, buffLength);// 流内容没有结束while (contentLen != 0){// 把内容从file stream 写入upload streamstrm.Write(buff, 0, contentLen);contentLen = fs.Read(buff, 0, buffLength);}// 关闭两个流strm.Close();fs.Close();errorinfo = "完成";return true;}catch (Exception ex){errorinfo = string.Format("因{0},无法完成上传", ex.Message);return false;}}#endregion#region 下载文件/// <summary>/// 下载文件/// </summary>/// <param name="filePath"></param>/// <param name="fileName"></param>/// <param name="errorinfo"></param>/// <returns></returns>public bool Download(string ftpfilepath, string filePath, string fileName, out string errorinfo)////上面的代码实现了从ftp服务器下载文件的功能{try{filePath = filePath.Replace("我的电脑\\", "");String onlyFileName = Path.GetFileName(fileName);string newFileName = filePath + onlyFileName;if (File.Exists(newFileName)){errorinfo = string.Format("本地文件{0}已存在,无法下载", newFileName);return false;}ftpfilepath = ftpfilepath.Replace("\\", "/");string url = "ftp://" + ftpfilepath;Connect(url);//连接reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();long cl = response.ContentLength;int bufferSize = 2048;int readCount;byte[] buffer = new byte[bufferSize];readCount = ftpStream.Read(buffer, 0, bufferSize);FileStream outputStream = new FileStream(newFileName, FileMode.Create);while (readCount > 0){outputStream.Write(buffer, 0, readCount);readCount = ftpStream.Read(buffer, 0, bufferSize);}ftpStream.Close();outputStream.Close();response.Close();errorinfo = "";return true;}catch (Exception ex){errorinfo = string.Format("因{0},无法下载", ex.Message);return false;}}#endregion#region 删除文件/// <summary>/// 删除文件/// </summary>/// <param name="fileName"></param>public void DeleteFileName(string fileName){try{FileInfo fileInf = new FileInfo(fileName);string uri = "ftp://" + ftpServerIP + "/" + ;Connect(uri);//连接// 默认为true,连接不会被关闭// 在一个命令之后被执行reqFTP.KeepAlive = false;// 指定执行什么命令reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){//MessageBox.Show(ex.Message, "删除错误");}}#endregion#region 在ftp上创建目录/// <summary>/// 在ftp上创建目录/// </summary>/// <param name="dirName"></param>public void MakeDir(string dirName){try{string uri = "ftp://" + ftpServerIP + "/" + dirName;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){// MessageBox.Show(ex.Message);}}#endregion#region 删除ftp上目录/// <summary>/// 删除ftp上目录/// </summary>/// <param name="dirName"></param>public void delDir(string dirName){try{string uri = "ftp://" + ftpServerIP + "/" + dirName;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();response.Close();}catch (Exception ex){// MessageBox.Show(ex.Message);}}#endregion#region 获得ftp上文件大小/// <summary>/// 获得ftp上文件大小/// </summary>/// <param name="filename"></param>/// <returns></returns>public long GetFileSize(string filename){long fileSize = 0;filename = filename.Replace("\\","/");try{// FileInfo fileInf = new FileInfo(filename);//string uri1 = "ftp://" + ftpServerIP + "/" + ;// string uri = filename;string uri = "ftp://" + filename;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();fileSize = response.ContentLength;response.Close();}catch (Exception ex){// MessageBox.Show(ex.Message);}return fileSize;}#endregion#region ftp上文件改名/// <summary>/// ftp上文件改名/// </summary>/// <param name="currentFilename"></param>/// <param name="newFilename"></param>public void Rename(string currentFilename, string newFilename){try{FileInfo fileInf = new FileInfo(currentFilename);string uri = "ftp://" + ftpServerIP + "/" + ;Connect(uri);//连接reqFTP.Method = WebRequestMethods.Ftp.Rename;reqFTP.RenameTo = newFilename;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); //Stream ftpStream = response.GetResponseStream();//ftpStream.Close();response.Close();}catch (Exception ex){// MessageBox.Show(ex.Message);}}#endregion#region 获得文件明晰/// <summary>/// 获得文件明晰/// </summary>/// <returns></returns>public string[] GetFilesDetailList(){return GetFileList("ftp://" + ftpServerIP + "/", WebRequestMethods.Ftp.ListDirectoryDetails);}/// <summary>/// 获得文件明晰/// </summary>/// <param name="path"></param>/// <returns></returns>public string[] GetFilesDetailList(string path){path = path.Replace("\\", "/");return GetFileList("ftp://" + path, WebRequestMethods.Ftp.ListDirectoryDetails);}#endregion}。