这个导出网站功能指通过前台javascript触发进入ashx函数中,实现将服务器中某个文件夹(包含其子文件夹和文件)通通复制到服务器中另一处位置,当然该文件夹本身就是一个网站。
所以导出网站最重要的两个功能,除了javascript的触发,就是C#ashx文件复制文件夹的操作。
下面这段代码就是通过javascript的Request函数调用copy.ashx函数文件,实现将需要复制的文件夹的子路径和复制到所在位置的子路径的两个参数传进去后台函数
getWebList函数就是后台的一个函数,这个函数可以不用管他。
getBack函数就需要写上,可以通过这个函数获取结果。
当然Webside_load这个函数也是需要onclick触发过来的,这里就不全部列出来了。
1 //Webside_load导出网站 2 function Webside_load(sID, iWebTemplateID) { //alert(0); 3 //alert(sID); alert(iWebTemplateID); 4 //被赋值的目录:就是模板ID下的文件夹以及文件 5 sTartDir = "http://www.cnblogs.com/uploadfile/webTemplate/" + iWebTemplateID; 6 //目标目录:就是作品ID下 7 sEndDir = "http://www.cnblogs.com/uploadfile/showweb/" + sID + "/"; 8 //alert(sourceDir); alert(targetDir); 9 10 var variable = ["sTartDir", "sEndDir"];11 var value = [sTartDir, sEndDir]; //alert(value);12 Request("getWebList", variable, value, getBack, WebUrl + "http://www.cnblogs.com/copy.ashx", svrNamespace);13 14 }15 function getBack() {16 var xmlhttp = xmlHttpRequest;17 var Result = xmlhttp.responseText;18 alert(Result);19 }20
通过上面的javascript,可以获取来自后台函数的数据。
而获取后台函数的数据就需要下面关于遍历加copy的函数文件了。
这个函数我也百度了一下,了解了一写方法之后才写出,度娘还是很强大的,看到了很多人很多好的方法,但感觉下面这种方法比较可取。
1 <%@ WebHandler Language="C#" Class="copy" %> 2 3 using System; 4 using System.Web; 5 using System.IO; 6 7 public class copy : IHttpHandler 8 { 9 //采用递归的方式遍历,文件夹和子文件中的所有文件。10 public void ProcessRequest(HttpContext context)11 {12 HttpRequest Request = context.Request;13 HttpResponse Response = context.Response;14 HttpServerUtility Server = context.Server;15 //指定输出头和编码16 context.Response.ContentType = "text/html";17 Response.Charset = "utf-8";18 19 HttpFileCollection fs = HttpContext.Current.Request.Files;20 21 string sTartDir = Request.Form["sTartDir"];22 string sEndDir = Request.Form["sEndDir"];23 sTartDir = System.Web.HttpContext.Current.Server.MapPath(sTartDir);24 sEndDir = System.Web.HttpContext.Current.Server.MapPath(sEndDir);25 //Test26 //string sTartDir = System.Web.HttpContext.Current.Server.MapPath("../uploadfile/webTemplate/2");27 //string sEndDir = System.Web.HttpContext.Current.Server.MapPath("../uploadfile/showweb/2012082700000001/");28 MyDirectory_Copy(sTartDir, sEndDir);29 30 Response.Write("成功导出!");31 }32 33 static void MyDirectory_Copy(string sTartDir, string sEndDir)34 {35 //判断两个目录是否都是存在的36 if (!Directory.Exists(sTartDir))37 return;38 if (!Directory.Exists(sEndDir))39 return;40 41 //获取文件夹名字42 string sTarteFolderName = sTartDir.Replace(Directory.GetParent(sTartDir).ToString(), "").Replace(Path.DirectorySeparatorChar.ToString(), "");43 //判断是否该文件夹赋值成功44 if (sTartDir == sEndDir + sTarteFolderName)45 return;46 47 //要复制到的路径 48 string endPath = sEndDir + Path.DirectorySeparatorChar.ToString() + sTarteFolderName;49 if (Directory.Exists(endPath))50 {51 Directory.Delete(endPath, true);52 }53 54 Directory.CreateDirectory(endPath);55 56 //复制文件 57 string[] files = Directory.GetFiles(sTartDir);58 for (int i = 0; i < files.Length; i++)59 {60 File.Copy(files[i], endPath + Path.DirectorySeparatorChar.ToString() + Path.GetFileName(files[i]));61 }62 //复制目录 63 string[] dires = Directory.GetDirectories(sTartDir);64 for (int j = 0; j < dires.Length; j++)65 {66 MyDirectory_Copy(dires[j], endPath);67 }68 } 69 70 71 72 public bool IsReusable73 {74 get75 {76 return false;77 }78 } 79 }
从前台获得sTartDir源文件目录和 sTartDir目标目录,得到他们的绝对路径。
再执行DirectoryCopy函数,
获得源文件的文件夹名字,将目标文件的绝对路径加上文件夹名赋给新的目标文件目录
通过递归循环判断,执行复制过程。
这种方法类似于之前一随便种所提到的C#遍历文件夹,不过这里是内部便利复制,和在系统中遍历也不是完全一样。这个相对比较简单,不过一开始还是借助了度娘百度搜索了一下方法。