什么是FTP
FTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件.可以将 Internet 信息服务 (IIS) 配置为作为 FTP 服务器来运行。 这样,其他计算机便可以连接到服务器并将文件复制到服务器或者从服务器复制文件。 例如,如果您在自己的计算机上承载网站,并且希望允许远程用户连接到您的计算机并将他们的文件复制到服务器,则可以将 IIS 配置为充当 FTP 服务器。
主要实现方式
下面主要讲解一下,在Window的IIS中创建FTP的Site。
1、创建站点
public int createFtpSite(string ftpname,string path){int errorCode = ErrorCode.Succeed;if (ftpname == "" && path == ""){try{ServerManager iisManager = new ServerManager();Configuration cfg = iisManager.GetApplicationHostConfiguration();/*---- 停止21端口 ----*/try{/*---- sites ----*/foreach (var ftpsite in iisManager.Sites){/** 站点描述*/string sitename = ftpsite.Name;/** 站点绑定域名和端口*/foreach (Binding binding in ftpsite.Bindings){try{string currentServerBindings = binding.GetAttributeValue("BindingInformation").ToString();string port = currentServerBindings.Split(":".ToArray())[1];if (port == "21"){try{//stop siteftpsite.Stop();}catch{//doing nothing}break;}}catch{//doing nothing}}}//提交更改iisManager.CommitChanges();}catch{//do nothing}/** 创建FTP*/if (!System.IO.Directory.Exists(System.Configuration.ConfigurationManager.AppSettings.Get("defaultftpath")))//创建站点路径{System.IO.Directory.CreateDirectory(System.Configuration.ConfigurationManager.AppSettings.Get("defaultftpath"));}Site site = iisManager.Sites.Add(System.Configuration.ConfigurationManager.AppSettings.Get("defaultftp"), "ftp", string.Format("*:{0}:", "21"), System.Configuration.ConfigurationManager.AppSettings.Get("defaultftpath"));iisManager.CommitChanges();//设置FTP SSL权限SetFtpSSL();//设置FTP Everyone权限IISUtil.IISCore.AddSiteUtil addsiteUtil = new AddSiteUtil();try{string config_rootpath = System.Configuration.ConfigurationManager.AppSettings.Get("defaultftpath");//string rootpath = path.Substring(0, path.IndexOf(ftpname) - 1) + "\\ftproot";if (!System.IO.Directory.Exists(config_rootpath)){System.IO.Directory.CreateDirectory(config_rootpath);}addsiteUtil.icaclsSet("Everyone", System.Configuration.ConfigurationManager.AppSettings.Get("defaultftpath"));/*---- hide ----*/System.IO.File.SetAttributes(config_rootpath, System.IO.FileAttributes.Hidden);}catch{}}catch{errorCode = ErrorCode.ftpSiteFail;}}else{if (!getFtpState(ftpname))//判断ftp用户是否存在{/*---- FTP状态检查 ----*/FtpStateInit();try{using (ServerManager iisManager = new ServerManager()){Site site = iisManager.Sites.FirstOrDefault(o => ((string)o["name"]).Contains(System.Configuration.ConfigurationManager.AppSettings.Get("defaultftp")));var vird = site.Applications[0].VirtualDirectories["/" + ftpname];if (vird == null) { site.Applications[0].VirtualDirectories.Add("/" + ftpname, path); }else { errorCode = ErrorCode.ftpExists; }iisManager.CommitChanges();//添加FTP访问权限SetFtpAccess(ftpname);}}catch{errorCode = ErrorCode.ftpSiteFail;}}else{errorCode = ErrorCode.ftpExists;}}return errorCode;}
2、站点列表
/// <summary>/// iis6获取所有ftp站点信息/// </summary>/// <param name="newsitename"></param>/// <returns></returns>public static List<string> iGetFtpInfos(){List<string> ftpinfos = new List<string>();try{string ftproot = System.Configuration.ConfigurationManager.AppSettings.Get("defaultftp");string ftpname = "";//用户名string ftppass = "";//密码string ftppath = "";//物理路径string iisversion = "";//iis版本string majorversion = IISCore.IISInfoUtil.SGetIISMajorVersion();if (majorversion == ""){iisversion = "未知";}else{iisversion = majorversion.ToString();}/** 创建FTP 子站点*/var siteEntry = new DirectoryEntry("IIS://localhost/MSFTPSVC");//IIS6管理对象DirectoryEntry rootentry = new DirectoryEntry("IIS://localhost/W3SVC");//创建IIS管理对象foreach (DirectoryEntry sitechild in siteEntry.Children){if (!sitechild.SchemaClassName.EqualsEx("IIsFtpServer")) //IIsFtpServer代表FTPcontinue;string yftpname = sitechild.Properties["ServerComment"].Value.ToString();string defaultftpname = System.Configuration.ConfigurationManager.AppSettings.Get("defaultftp");if (yftpname == defaultftpname){try{//获取站点信息var root = sitechild.Children.Find("ROOT", "IIsFtpVirtualDir");DirectoryEntries ftps = root.Children;foreach (DirectoryEntry ftp in ftps){ftpname = ftp.Name;/** 获取密码*/try{/** 循环站点获取站点信息*/foreach (DirectoryEntry child in rootentry.Children){if (child.SchemaClassName == "IIsWebServer" && child.Properties["ServerComment"].Value.ToString() == ftpname){ftppass = child.Properties["AnonymousUserPass"].Value.ToString();/** 获取站点目录*/foreach (DirectoryEntry rootChild in child.Children){string name = rootChild.Name.ToString();if ((rootChild.SchemaClassName == "IIsWebVirtualDir") && (rootChild.Name.ToString().ToLower() == "root")){if (rootChild.Properties["Path"].Value == null){ftppath = "";}else{ftppath = rootChild.Properties["Path"].Value.ToString().Substring(0, rootChild.Properties["Path"].Value.ToString().LastIndexOf("\\"));}}}}}}catch{}/** 获取路径*/if(ftpname != "")ftpinfos.Add(ftproot + "-@-" + ftpname + "-@-" + ftppass + "-@-" + ftppath + "-@-" + iisversion);//添加到站点信息}}catch{}}}}catch{}return ftpinfos;//返回数据}
3、删除站点
public static bool DeleteQFtp(string ftpname){bool flag = false;try{/** 删除FTP 子站点*/var siteEntry = new DirectoryEntry("IIS://localhost/MSFTPSVC");//IIS6管理对象if (ftpname != ""){foreach (DirectoryEntry sitechild in siteEntry.Children){if (!sitechild.SchemaClassName.EqualsEx("IIsFtpServer")) //IIsFtpServer代表FTPcontinue;string yftpname = sitechild.Properties["ServerComment"].Value.ToString();if (yftpname.ToLower() == System.Configuration.ConfigurationManager.AppSettings.Get("defaultftp").ToLower()){try{DirectoryEntry root = sitechild.Children.Find("ROOT", "IIsFtpVirtualDir");var ftpchild = root.Children.Find(ftpname, "IIsFtpVirtualDir");if (ftpchild != null){//删除root.Children.Remove(ftpchild);root.CommitChanges();sitechild.CommitChanges();siteEntry.CommitChanges();flag = true;}}catch{flag = false;}}}}}catch{}return flag;}