這個匯出網站功能指通過前台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#遍曆檔案夾,不過這裡是內部便利複製,和在系統中遍曆也不是完全一樣。這個相對比較簡單,不過一開始還是藉助了度娘百度搜尋了一下方法。