索引
【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭架構、做項目 目錄索引
簡述
程式檔案備份與資料備份
項目準備
我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5
希望大家對ASP.NET MVC有一個初步的了解,理論性的東西我們不做過多解釋,有些地方不了解也沒關系,會用就行了,用的多了,用的久了,自然就了解了。
項目開始
最近一段時間手頭項目比較多,是以更新緩慢,并不是不更新了,希望大家了解。
大多數情況下,程式檔案的備份,我們都是通過伺服器互備來解決的,資料庫呢,我們可以添加備份計劃,自行備份。我們做這個功能是對于特殊情況的需求,同時更多的是學習一下思路和方法,可能你會在其它功能中用到這裡面的部分功能。
一、程式的備份
我們首先在ComManage區域下面建立一個控制器BackupRestoreController 繼承 BaseController
1.1 Index視圖 我們列出所有的備份檔案(包含程式檔案和資料備份檔案)

1.2 我們添加這個視圖
1.3 擷取檔案清單的方法
1 /// <summary>
2 /// 擷取備份檔案資訊
3 /// </summary>
4 /// <returns></returns>
5 public ActionResult GetBackUpData()
6 {
7 string fileExt = Request.Form["fileExt"];
8 string path = "/App_Data/BackUp/";
9 var jsonM = new JsonHelper() { Status = "y", Msg = "success" };
10 try
11 {
12 if (!FileHelper.IsExistDirectory(Server.MapPath(path)))
13 {
14 jsonM.Status = "n";
15 jsonM.Msg = "目錄不存在!";
16 }
17 else if (FileHelper.IsEmptyDirectory(Server.MapPath(path)))
18 {
19 jsonM.Status = "empty";
20 }
21 else
22 {
23 if (fileExt == "*" || string.IsNullOrEmpty(fileExt))
24 {
25 jsonM.Data = Common.Utils.DataTableToList<FileModel>(FileHelper.GetAllFileTable(Server.MapPath(path))).OrderByDescending(p => p.time).ToList();
26 }
27 else
28 {
29 jsonM.Data = Common.Utils.DataTableToList<FileModel>(FileHelper.GetAllFileTable(Server.MapPath(path))).OrderByDescending(p => p.time).Where(p => p.ext == fileExt).ToList();
30 }
31
32 }
33
34 }
35 catch (Exception)
36 {
37 jsonM.Status = "err";
38 jsonM.Msg = "擷取檔案失敗!";
39 }
40 return Content(JsonConverter.Serialize(jsonM, true));
41 }
1.4 程式備份,我們把備份的程式檔案放到/App_Data/BackUp/ApplicationBackUp 目錄下
我們用zip壓縮和解壓,注意的一點就是 我們壓縮的檔案是存儲在App_Data目錄下,是以壓縮的時候要排除這個目錄,不然正在寫入這個目錄同時壓縮這個目錄會沖突。
壓縮方法 參考:
ICSharpCode.SharpZipLib 壓縮、解壓檔案 附源碼
1 /// <summary>
2 /// 備份程式檔案
3 /// </summary>
4 /// <returns></returns>
5 [UserAuthorizeAttribute(ModuleAlias = "Backup", OperaAction = "BackUpApplication")]
6 public ActionResult BackUpFiles()
7 {
8 var json = new JsonHelper() { Msg = "程式備份完成", Status = "n" };
9
10 try
11 {
12 //檢查上傳的實體路徑是否存在,不存在則建立
13 if (!Directory.Exists(Server.MapPath("/App_Data/BackUp/ApplicationBackUp/")))
14 {
15 Directory.CreateDirectory(Server.MapPath("/App_Data/BackUp/ApplicationBackUp/"));
16 }
17
18 ZipHelper.ZipDirectory(Server.MapPath("/"), Server.MapPath("/App_Data/BackUp/ApplicationBackUp/"), "App_" + this.CurrentUser.PinYin + "_" + DateTime.Now.ToString("yyyyMMddHHmmss"), true, new List<string>() { Server.MapPath("/App_Data/") });
19 WriteLog(Common.Enums.enumOperator.None, "程式備份:" + json.Msg, Common.Enums.enumLog4net.WARN);
20 json.Status = "y";
21 }
22 catch (Exception e)
23 {
24 json.Msg = "程式備份失敗!";
25 WriteLog(Common.Enums.enumOperator.None, "程式備份:", e);
26 }
27
28 return Json(json);
29 }
我們來測試一下:
1.5 資料備份,備份的bak檔案我們存在/App_Data/BackUp/DataBaseBackUp/目錄下
1 /// <summary>
2 /// 備份資料
3 /// </summary>
4 /// <returns></returns>
5 [UserAuthorizeAttribute(ModuleAlias = "Backup", OperaAction = "BackUpDataBase")]
6 public ActionResult BackUpData()
7 {
8 var json = new JsonHelper() { Msg = "資料備份完成", Status = "n" };
9
10 try
11 {
12 //檢查上傳的實體路徑是否存在,不存在則建立
13 if (!Directory.Exists(Server.MapPath("/App_Data/BackUp/DataBaseBackUp/")))
14 {
15 Directory.CreateDirectory(Server.MapPath("/App_Data/BackUp/DataBaseBackUp/"));
16 }
17 //備份資料庫
18 using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SqlConnectionString"].ConnectionString))
19 {
20 var bakPath = Server.MapPath("/App_Data/BackUp/DataBaseBackUp/");
21 using (SqlCommand cmd = new SqlCommand("backup database wkmvc_comnwes to disk='" + bakPath + "Data_" + this.CurrentUser.PinYin + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".bak'", conn))
22 {
23 try
24 {
25 conn.Open();
26 cmd.CommandTimeout = 0;
27 cmd.ExecuteNonQuery();
28 }
29 catch (Exception e)
30 {
31 throw e;
32 }
33 finally
34 {
35 conn.Close();
36 cmd.Dispose();
37 }
38 }
39 }
40
41 WriteLog(Common.Enums.enumOperator.None, "資料備份:" + json.Msg, Common.Enums.enumLog4net.WARN);
42 json.Status = "y";
43 }
44 catch (Exception e)
45 {
46 json.Msg = "資料備份失敗!";
47 WriteLog(Common.Enums.enumOperator.None, "資料備份:", e);
48 }
49
50 return Json(json);
51 }
1.6 資料還原 程式檔案的還原 就是解壓檔案 到指定目錄 關于解壓檔案 大家參考:
ICSharpCode.SharpZipLib 壓縮、解壓檔案 附源碼
資料庫備份檔案的還原
1 /// <summary>
2 /// 還原資料
3 /// </summary>
4 /// <returns></returns>
5 [UserAuthorizeAttribute(ModuleAlias = "Restore", OperaAction = "RestoreData")]
6 public ActionResult RestoreData()
7 {
8 var json = new JsonHelper() { Msg = "資料還原完成", Status = "n" };
9
10 var path = Request.Form["path"];
11
12 try
13 {
14 //檢查還原備份的實體路徑是否存在
15 if (!System.IO.File.Exists(Server.MapPath(path)))
16 {
17 json.Msg = "還原資料失敗,備份檔案不存在或已損壞!";
18 return Json(json);
19 }
20 //還原資料庫
21 using (SqlConnection Con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SqlConnectionString"].ConnectionString))
22 {
23
24 try
25 {
26 Con.Open();
27 SqlCommand Com = new SqlCommand("use master restore database wkmvc_comnwes from disk='" + Server.MapPath(path) + "'", Con);
28 Com.ExecuteNonQuery();
29 }
30 catch (Exception e)
31 {
32 throw e;
33 }
34 }
35
36 WriteLog(Common.Enums.enumOperator.None, "資料還原:" + json.Msg, Common.Enums.enumLog4net.WARN);
37 json.Status = "y";
38 }
39 catch (Exception e)
40 {
41 json.Msg = "資料還原失敗!";
42 WriteLog(Common.Enums.enumOperator.None, "資料還原:", e);
43 }
44
45 return Json(json);
46 }
5.2 Demo 下載下傳:百度網盤
原創文章 轉載請尊重勞動成果 http://yuangang.cnblogs.com
轉載于:https://www.cnblogs.com/yuangang/p/5665973.html