接着上一节我们讲到的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这个类,这个类中主要是提供了一些工具类的支持,呵呵。其中有一些真的是不错的,以后可以
拿来借鉴一下。

为了方便 大家理解我做了一张思维图,供大家分析。

 Install所用到的所有类

其中的SerialiazeTest()成员方法中用到了序列化的功能。在下一小节中再继续分析。

 

转自:http://www.cnblogs.com/chu888chu888/archive/2008/07/30/1256630.html

posted on 2009-12-28 10:20  钱途无梁  阅读(577)  评论(0编辑  收藏  举报