接着上一节我们讲到的Install,我们接着来看第二步的实现。
在这个页面中检测的功能,主要是通过以下这段代码来实现检测功能,呵呵,还是用的字符串拼接输出,呵呵,晕没有办法,Discuz的程序员就是这样写的。》
1: <%2: bool err = false;
3: string result = SetupPage.InitialSystemValidCheck(ref err);
4: Response.Write("<font color=red>"+result+"</font>");
5: %>
具体的实现代码如下:
1: public static string InitialSystemValidCheck(ref bool error)
2: {3: error = false;
4: StringBuilder sb = new StringBuilder();
5: sb.Append("<table cellSpacing='0' cellPadding='0' width='90%' align='center' border='0'
6: bgcolor='#666666' style='font-size:12px'>"); 7: 8: HttpContext context = HttpContext.Current; 9: 10: string filename = null;
11: if (context != null)
12: filename = context.Server.MapPath("/DNT.config");
13: else
14: filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DNT.config");
15: 16: //系统BIN目录检查
17: sb.Append(IISSystemBINCheck(ref error));
18: 19: 20: // GetRootDntconfigPath();
21: //检查Dnt.config文件的有效性
22: if (!GetRootDntconfigPath())
23: {24: sb.Append("<tr style=\"height:15px\"><td bgcolor='#ffffff' width='5%'><img src='images/error.gif'
25: width='16' height='16'></td><td bgcolor='#ffffff' width='95%'> DNT.config 26: 不可写或没有放置正确, 相关问题详见安装文档!</td></tr>");27: error = true;
28: }29: else
30: {31: sb.Append("<tr style=\"height:15px\"><td bgcolor='#ffffff' width='5%'><img src='images/ok.gif'
32: width='16' height='16'></td><td bgcolor='#ffffff' width='95%'>对 DNT.config 验证通过!</td> 33: </tr>"); 34: } 35: 36: 37: //检查系统目录的有效性
38: string folderstr = "admin,aspx,avatars,cache,config,editor,images,templates,upload";
39: foreach (string foldler in folderstr.Split(','))
40: {41: if (!SystemFolderCheck(foldler))
42: {43: sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
44: </td><td bgcolor='#ffffff' width='95%'>对 " + foldler + " 目录没有写入和删除权限!</td>
45: </tr>");46: error = true;
47: }48: else
49: {50: sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/ok.gif' width='16' height='16'>
51: </td><td bgcolor='#ffffff' width='95%'>对 " + foldler + " 目录权限验证通过!</td></tr>");
52: } 53: }54: string filestr = "admin\\xml\\navmenu.config,javascript\\mymenu.js,install\\systemfile.aspx,upgrade
55: \\systemfile.aspx";56: foreach (string file in filestr.Split(','))
57: {58: if (!SystemFileCheck(file))
59: {60: sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
61: </td><td bgcolor='#ffffff' width='95%'>对 " + file.Substring(0,file.LastIndexOf('\\')) +
62: " 目录没有写入和删除权限!</td></tr>"); 63: error = true; 64: } 65: else 66: {67: sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/ok.gif' width='16' height='16'>
68: </td><td bgcolor='#ffffff' width='95%'>对 " + file.Substring(0, file.LastIndexOf('\\')) +
69: " 目录权限验证通过!</td></tr>"); 70: } 71: } 72: 73: if(!TempTest()) 74: {75: sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
76: </td><td bgcolor='#ffffff' width='95%'>您没有对 " + Path.GetTempPath() +
77: " 文件夹访问权限,详情参见安装文档.</td></tr>"); 78: error = true; 79: } 80: else 81: { 82: if (!SerialiazeTest()) 83: {84: sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
85: </td><td bgcolor='#ffffff' width='95%'>对config文件反序列化失败,详情参见安装文档.</td>
86: </tr>"); 87: error = true; 88: } 89: else 90: {91: sb.Append("<tr><td bgcolor='#ffffff' width='5%'><img src='images/ok.gif' width='16' height='16'>
92: </td><td bgcolor='#ffffff' width='95%'>反序列化验证通过!</td></tr>");
93: } 94: } 95: sb.Append("</table>"); 96: 97: return sb.ToString();
98: }在以上程序中,它首先会去检测DNT.Config文件的有效性
1: string filename = null;
2: if (context != null)
3: filename = context.Server.MapPath("/DNT.config");
4: else
5: filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DNT.config");
接着再去检测IIS目录中的DLL是否存在的有效性:
1: public static string IISSystemBINCheck(ref bool error)
2: {3: string binfolderpath = HttpRuntime.BinDirectory;
4: 5: string result = "";
6: try
7: {8: string[] assemblylist = new string[] { "Discuz.Aggregation.dll", "Discuz.Cache.dll",
9: "Discuz.Common.dll", "Discuz.Config.dll",
10: "Discuz.Control.dll", "Discuz.Data.dll", "Discuz.Data.SqlServer.dll","Discuz.Entity.dll",
11: "Discuz.Event.dll", "Discuz.Forum.dll",
12: "Discuz.Install.dll", "Discuz.Plugin.dll","Discuz.Plugin.Preview.Jpg.dll",
13: "Discuz.Plugin.Spread.dll", "Discuz.Web.Admin.dll",
14: "Discuz.Web.dll", "Discuz.Web.Services.dll","Interop.SQLDMO.dll","Newtonsoft.Json.dll" };
15: bool isAssemblyInexistence = false;
16: ArrayList inexistenceAssemblyList = new ArrayList();
17: foreach (string assembly in assemblylist)
18: {19: if (!File.Exists(binfolderpath + assembly))
20: {21: isAssemblyInexistence = true;
22: error = true;
23: inexistenceAssemblyList.Add(assembly); 24: } 25: }26: if (isAssemblyInexistence)
27: {28: foreach (string assembly in inexistenceAssemblyList)
29: {30: result += "<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif'
31: width='16' height='16'></td><td bgcolor='#ffffff' width='95%'>" + assembly + 32: " 文件放置不正确<br/>请将所有的dll文件复制到目录 " + binfolderpath +
33: " 中.</td></tr>";
34: } 35: } 36: }37: catch
38: {39: result += "<tr><td bgcolor='#ffffff' width='5%'><img src='images/error.gif' width='16' height='16'>
40: </td><td bgcolor='#ffffff' width='95%'>请将所有的dll文件复制到目录 " + binfolderpath 41: + " 中.</td></tr>";
42: error = true;
43: } 44: 45: return result;
46: }在以上代码中用到了一些不常用的类,比如HttpRuntime类,我们过HttpRuntime这个类中的BinDirectory这个属性找到WEB程序所用到的bin目录,
之后用IO中的File.Exist来检测这个文件是否存在,不过我再一次的问一下,难道Discuz的程序员不知道@号的存在???,再一个就是对StringBuilder
在程序中的性能问题表示怀疑。
再接下来是检测Dnt.config文件的有效性:
1: public static bool GetRootDntconfigPath()
2: {3: try
4: { 5: 6: HttpContext context = HttpContext.Current;7: string webconfigfile = "";
8: if (!Utils.FileExists(webconfigfile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DNT.config"))
9: && (!Utils.FileExists(webconfigfile = Path.Combine(context.Request.PhysicalApplicationPath, "dnt.config")))
10: && (!Utils.FileExists(webconfigfile = Utils.GetMapPath("../dnt.config")))
11: && (!Utils.FileExists(webconfigfile = Utils.GetMapPath("http://www.cnblogs.com/dnt.config")))
12: && (!Utils.FileExists(webconfigfile = Utils.GetMapPath("http://www.cnblogs.com/../dnt.config"))))
13: {14: return false;
15: }16: else
17: {18: StreamReader sr = new StreamReader(webconfigfile);
19: string content = sr.ReadToEnd();
20: sr.Close();21: content += " ";
22: StreamWriter sw = new StreamWriter(webconfigfile, false);
23: sw.Write(content); 24: sw.Close();25: return true;
26: } 27: }28: catch
29: {30: return false;
31: } 32: }在这个检测的过程中用到了Discuz.Common中的Utils.cs这个类,这个类中主要是提供了一些工具类的支持,呵呵。其中有一些真的是不错的,以后可以
拿来借鉴一下。
为了方便 大家理解我做了一张思维图,供大家分析。
其中的SerialiazeTest()成员方法中用到了序列化的功能。在下一小节中再继续分析。
转自:http://www.cnblogs.com/chu888chu888/archive/2008/07/30/1256630.html
浙公网安备 33010602011771号