// 创建一个实例。 // 创建数据目录。创建或者修改 opac.xml文件 int CreateInstance(ListViewItem item, out string strError) { strError = ""; int nRet = 0; List <OpacAppInfo> all_infos = null; // IIS 中的全部虚拟目录 // 获得全部的虚拟目录信息,不光是 dp2OPAC 有关的 nRet = OpacAppInfo.GetAllVirtualInfoByAppCmd(out all_infos, out strError); if (nRet == -1) { return(-1); } List <OpacAppInfo> infos = null; // dp2OPAC 类型的全部虚拟目录 // 获得全部 dp2OPAC 有关的 nRet = OpacAppInfo.GetOpacInfoByAppCmd(out infos, out strError); if (nRet == -1) { return(-1); } LineInfo line_info = (LineInfo)item.Tag; string strDataDir = ListViewUtil.GetItemText(item, COLUMN_DATADIR); string strSite = ListViewUtil.GetItemText(item, COLUMN_SITE); string strVirtualDir = ListViewUtil.GetItemText(item, COLUMN_VIRTUALDIR); string strPhysicalPath = ListViewUtil.GetItemText(item, COLUMN_PHYSICALPATH); if (String.IsNullOrEmpty(strDataDir) == true) { strError = "数据目录尚未设置"; return(-1); } // 查找一个虚拟目录是否存在 // return: // -1 不存在 // 其他 数组元素的下标 nRet = OpacAppInfo.Find(infos, strSite, strVirtualDir); if (nRet == -1) { nRet = OpacAppInfo.Find(all_infos, strSite, strVirtualDir); if (nRet != -1) { // 这表明这是一个已经存在的虚拟目录,但不是 dp2OPAC 类型的 strError = "虚拟目录 '" + strSite + strVirtualDir + "' 名字和一个非 dp2OPAC 类型的已经存在的虚拟目录发生了冲突,创建或者修改操作失败"; return(-1); } #if NO string strAppDir = Path.Combine( Environment.ExpandEnvironmentVariables("%SystemDrive%\\inetpub\\wwwroot"), strVirtualDir.Replace("/", "")); // 注意去掉非法路径字符 #endif if (string.IsNullOrEmpty(strPhysicalPath) == true) { strPhysicalPath = GetAppPhysicalPath(strSite, strVirtualDir); PathUtil.TryCreateDir(strPhysicalPath); } // 创建程序目录,并复制进基本内容 nRet = CreateNewAppDir(strPhysicalPath, strDataDir, out strError); if (nRet == -1) { return(-1); } // 注册 Web App // 只能用于 IIS 7 以上版本 nRet = OpacAppInfo.RegisterWebApp( strSite, strVirtualDir, strPhysicalPath, out strError); if (nRet == -1) { strError = "创建新的虚拟目录(site=" + strSite + ";virtual_dir=" + strVirtualDir + ";physicalPath=" + strPhysicalPath + ")失败: " + strError; return(-1); } ListViewUtil.ChangeItemText(item, COLUMN_PHYSICALPATH, strPhysicalPath); // line_info.PhysicalPath = strAppDir; } else { // 数据目录有可能修改,因此需要修改程序目录中的 start.xml #if NO OpacAppInfo info = all_infos[nRet]; Debug.Assert(string.IsNullOrEmpty(info.PhysicalPath) == false, ""); #endif Debug.Assert(string.IsNullOrEmpty(strPhysicalPath) == false, ""); // 修改 start.xml nRet = CreateStartXml(Path.Combine(strPhysicalPath, "start.xml"), strDataDir, out strError); if (nRet == -1) { return(-1); } } // 探测数据目录,是否已经存在数据,是不是属于升级情形 // return: // -1 error // 0 数据目录不存在 // 1 数据目录存在,但是xml文件不存在 // 2 xml文件已经存在 nRet = DetectDataDir(strDataDir, out strError); if (nRet == -1) { return(-1); } if (nRet == 2) { // 进行升级检查 // TODO: 是否要为数据目录增配权限 } else { // 需要进行最新安装,创建数据目录 nRet = CreateNewDataDir(strDataDir, out strError); if (nRet == -1) { return(-1); } } // 兑现修改 if (line_info.Changed == true) { // 保存信息到 opac.xml文件中 // return: // -1 error // 0 succeed nRet = line_info.SaveToXml(strDataDir, out strError); if (nRet == -1) { return(-1); } line_info.Changed = false; } return(0); }
void SetDefaultVirtualDirValue() { string strError = ""; List <OpacAppInfo> infos = null; // 用 appcmd 方式获得 所有虚拟目录的信息 (不仅仅是 dp2OPAC 虚拟目录) int nRet = OpacAppInfo.GetAllVirtualInfoByAppCmd(out infos, out strError); if (nRet == -1) { goto ERROR1; } for (int i = 0; ; i++) { string strVirtualDir = "/dp2OPAC"; if (i > 0) { strVirtualDir = "/dp2OPAC" + (i + 1).ToString(); } // 已经存在的虚拟目录不能使用 // 查找一个虚拟目录是否存在 // return: // -1 不存在 // 其他 数组元素的下标 nRet = OpacAppInfo.Find(infos, this.comboBox_site.Text, strVirtualDir); if (nRet != -1) { continue; } // 注意检查,不能是别的instance的数据目录 if (this.VerifyDataDir != null) { VerifyEventArgs e1 = new VerifyEventArgs(); e1.Value = strVirtualDir; this.VerifyDataDir(this, e1); if (String.IsNullOrEmpty(e1.ErrorInfo) == false) { continue; } } if (this.VerifyInstanceName != null) { VerifyEventArgs e1 = new VerifyEventArgs(); e1.Value = this.comboBox_site.Text + strVirtualDir; this.VerifyInstanceName(this, e1); if (String.IsNullOrEmpty(e1.ErrorInfo) == false) { continue; } } this.textBox_instanceName.Text = strVirtualDir; return; } return; ERROR1: MessageBox.Show(this, strError); }