//──────────────────────────────────────── /// <summary> /// tool-saveファイルへの絶対パスを取得します。 /// 取得できなかった場合、空文字列を返します。 /// </summary> /// <returns></returns> public string GetFilepathabsolute( string sFpath, bool bRequired, Log_Reports pg_Logging ) { Log_Method pg_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); pg_Method.BeginMethod(Info_Toolwindow.Name_Library, this, "GetFilepathabsolute", pg_Logging); string sFpatha_xml; if (pg_Logging.Successful) { // 正常時 // ツールの設定のファイルパス Configurationtree_Node parent_Cf = new Configurationtree_NodeImpl("!ハードコーディング_Flow0010#GetFileAbsPath", null); Configurationtree_NodeFilepath cf_Fpath = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L09TcDlg_1", parent_Cf); cf_Fpath.InitPath( sFpath, pg_Logging ); if (!pg_Logging.Successful) { // 既エラー。 sFpatha_xml = ""; goto gt_EndMethod; } Expression_Node_Filepath ec_Fpath = new Expression_Node_FilepathImpl(cf_Fpath); sFpatha_xml = ec_Fpath.Execute4_OnExpressionString( EnumHitcount.Unconstraint, pg_Logging); if (!pg_Logging.Successful) { // 既エラー。 sFpatha_xml = ""; goto gt_EndMethod; } } else { // 既エラー。 sFpatha_xml = ""; goto gt_EndMethod; } goto gt_EndMethod; // // gt_EndMethod: pg_Method.EndMethod(pg_Logging); return sFpatha_xml; }
//──────────────────────────────────────── /// <summary> /// エディター設定ファイルの絶対パス /// </summary> /// <returns></returns> private string GetFilepathabsolute_Editor( MemoryAatoolxml_Editor moAatoolxml_SelectedEditorElm, Log_Reports pg_Logging ) { string sFpath_EditorXml = ""; moAatoolxml_SelectedEditorElm.Dictionary_Fsetvar_Configurationtree.List_Child.ForEach(delegate(Configurationtree_Node s_Fsetvar, ref bool bBreak) { string sNamevar1; s_Fsetvar.Dictionary_Attribute.TryGetValue(PmNames.S_NAME_VAR, out sNamevar1, true, pg_Logging); if (sNamevar1 == NamesVar.S_SP_EDITOR) { string sValue; s_Fsetvar.Dictionary_Attribute.TryGetValue(PmNames.S_VALUE, out sValue, true, pg_Logging); sFpath_EditorXml = sValue + System.IO.Path.DirectorySeparatorChar + NamesFile.S_AA_EDITOR_XML; } }); // エディター設定ファイル パスの有効/無効を調べます。 string sFpatha; Expression_Node_Filepath e_Fpath_prj; { Configurationtree_Node parent_Configurationtree_Node = new Configurationtree_NodeImpl("!ハードコーディング_" + this.GetType().Name + "#GetProjectAbsFilePath", null); Configurationtree_NodeFilepath cf_Fpath = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L09TcDlg_2", parent_Configurationtree_Node); cf_Fpath.InitPath( sFpath_EditorXml, pg_Logging ); if (!pg_Logging.Successful) { // 既エラー。 sFpatha = ""; goto gt_EndMethod; } e_Fpath_prj = new Expression_Node_FilepathImpl(cf_Fpath); } sFpatha = e_Fpath_prj.Execute4_OnExpressionString( EnumHitcount.Unconstraint, pg_Logging); if (!pg_Logging.Successful) { // 既エラー。 sFpatha = ""; goto gt_EndMethod; } //.WriteLine(this.GetType().Name + "#GetProjectAbsFilePath: absFilePath=[" + absFilePath + "]"); // // // // gt_EndMethod: return sFpatha; }
//──────────────────────────────────────── /// <summary> /// このアプリケーションが担当する「バックアップ日付フォルダー」が /// (指定)個以上あるとき、 /// 日付が新しいものを(指定)個残して /// このアプリケーションが担当する他の「バックアップ日付フォルダー」を破棄します。 /// </summary> private void DeleteOldBackup( string sFilepathabsolute_Backuphome, string sName_Sub, Log_Reports log_Reports ) { // バックアップ・フォルダー直下のフォルダーの絶対パス string[] sFpatha_FolderArray = Directory.GetDirectories(sFilepathabsolute_Backuphome); // 日付フォルダーの名前のリストを作成します。 List<string> sList_Name_MyDateFolder = new List<string>(); foreach (string sFpatha_Folder in sFpatha_FolderArray) { // 区切り文字の次。 char[] separatorChars = new char[] { '\\', '/' }; int nFolderNameIndex = sFpatha_Folder.LastIndexOfAny(separatorChars) + 1; // 絶対パスから、最下層の「フォルダー名」だけを切り抜き。 string sFolderName = sFpatha_Folder.Substring(nFolderNameIndex, sFpatha_Folder.Length - nFolderNameIndex); //allFolderNames.Add(folderName); try { // 次の2つは、担当する日付フォルダーとして扱います。 // ・ファイル名が8桁の数字 // ・ファイル名の先頭8桁が数字で、アンダースコアが続く。 // ・フォルダー・オーナー名が、このアプリケーションのものと一致する。 int nDammyDateNumber = 0; string sFolderOwnerName = ""; bool bDateFolder = DatebackupImpl.IsDateFolderName( sFolderName, ref nDammyDateNumber, ref sFolderOwnerName); // フォルダー名の書式と、オーナー判定 if (bDateFolder && sFolderOwnerName == sName_Sub) { sList_Name_MyDateFolder.Add(sFolderName); } } catch (Exception) { // 無視して続行 } } // 日付フォルダー名の日付の逆順(数字の降順)にソート。同値は順が不安定。 sList_Name_MyDateFolder.Sort( delegate(string sName_Folder1, string sName_Folder2) { int nDateNumber1 = 0; int nDateNumber2 = 0; string sDammyFolderOwnerName = ""; // 日付フォルダーでない場合は、dateNumberN に-1が入ります。 bool bDate1 = DatebackupImpl.IsDateFolderName(sName_Folder1, ref nDateNumber1, ref sDammyFolderOwnerName); bool bDate2 = DatebackupImpl.IsDateFolderName(sName_Folder2, ref nDateNumber2, ref sDammyFolderOwnerName); return nDateNumber2 - nDateNumber1; } ); // 日付の数字が大きい先頭から(指定数)件以外を、 // 削除するフォルダー名のリストに追加します。 List<string> sList_Name_DeleteeFolder = new List<string>(); int nCount = 0; foreach (string sName_DateFolder in sList_Name_MyDateFolder) { if (nCount < this.Keptbackups) { // (指定)件の間は無視。 } else { // (指定)件を超過した分は、削除リストに追加。 sList_Name_DeleteeFolder.Add(sName_DateFolder.ToString()); } nCount++; } sList_Name_MyDateFolder = null;//使用終了 foreach (string sName_DeleteeFolder in sList_Name_DeleteeFolder) { // 指定のフォルダーを削除 // 絶対パスの作成 Expression_Node_Filepath ec_Fpath; { Configurationtree_Node parent_Configurationtree_Node = new Configurationtree_NodeImpl("!ハードコーディング_DataBackup#DeleteOldBackup", null); Configurationtree_NodeFilepath cf_Fpath = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L03_6", parent_Configurationtree_Node); cf_Fpath.InitPath( sFilepathabsolute_Backuphome, sName_DeleteeFolder, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } ec_Fpath = new Expression_Node_FilepathImpl(cf_Fpath); } string sFopath_Deletee; if (log_Reports.Successful) { // 正常時 sFopath_Deletee = ec_Fpath.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } } else { sFopath_Deletee = ""; } if (log_Reports.Successful) { // 正常時 Directory.Delete(sFopath_Deletee, true); } } goto gt_EndMethod; // // gt_EndMethod: return; }
//──────────────────────────────────────── /// <summary> /// 実行します。 /// </summary> /// <param name="filePathList">保存するファイルの相対パスの一覧。「起動アプリケーション・ファイル(.exe)からの相対パス」として設定してあること。</param> /// <param name="oDateBackupBaseDirectory"></param> /// <param name="d_Thread"></param> public void Perform( Log_Reports log_Reports ) { Log_Method pg_Method = new Log_MethodImpl(); pg_Method.BeginMethod(Info_Operating.Name_Library, this, "Perform",log_Reports); // // // // Exception err_Excp; string err_SFpatha_Source; string err_SFpatha_Dst; if (null == this.Expression_Filepath_Backuphome) { // エラー goto gt_Error_BkFolder;//todo:バックアップを無視する。 } // // バックアップ・ディレクトリーの絶対パス // // 例:「editor-backup」 // string sFpatha_BkHome = this.Expression_Filepath_Backuphome.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } //.WriteLine(this.GetType().Name + "#Perform: バックアップディレクトリーの絶対パス=[" + backupAbsFilePath + "]" ); // 日付フォルダー名(FOlder Name) string sDateFon = DatebackupImpl.CreateDateFolderName(this.Name_Sub); Configurationtree_Node s_ParentNode = new Configurationtree_NodeImpl("!ハードコーディング_DataBackup#Perform", null); // バックアップ・フォルダー下の日付ファイル名 // 日付フォルダーパス(「…略…\20091201」など) string sFopatha_date; { Expression_Node_Filepath ec_Dir; { Configurationtree_NodeFilepath cf_dir = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L03_3", s_ParentNode); cf_dir.InitPath(sFpatha_BkHome, sDateFon, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } ec_Dir = new Expression_Node_FilepathImpl(cf_dir); } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } sFopatha_date = ec_Dir.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } } // temp日付フォルダーパス(「…略…\temp20091201」など) string sFopatha_dateTemp; { Expression_Node_Filepath ec_Dir; { Configurationtree_NodeFilepath s_dir = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L03_4", s_ParentNode); s_dir.InitPath(sFpatha_BkHome, "temp" + sDateFon, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } ec_Dir = new Expression_Node_FilepathImpl(s_dir); } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } sFopatha_dateTemp = ec_Dir.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } } //.WriteLine(this.GetType().Name + "#Perform: absDateDirTemp=[" + absDateDirTemp + "]"); if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } // 今日の日付のフォルダーの有無を確認します。 if (Directory.Exists(sFopatha_date)) { // ある場合 // バックアップは取りません。 // 注意書きを出力してみる。 //.WriteLine(this.GetType().Name + "#Perform: バックアップを取りません。バックアップ・フォルダーに、既に今日の日付フォルダーがあるので。[" + absDateDir + "]"); // スキップ goto gt_EndMethod; } // // まず、今日の日付のテンポラリーファイル(「temp20091201」など)が存在すれば、削除します。 // if (Directory.Exists(sFopatha_dateTemp)) { // ある場合 // 該当する「tempXXXXXXXX」フォルダーを削除します。 // フォルダーの中身も破棄します。 Directory.Delete(sFopatha_dateTemp, true); } // // 今日の日付のテンポラリー・ディレクトリーを作成します。 // // Directory.CreateDirectory(sFopatha_dateTemp); // 作っておかないと、自作のクラスの中で「存在しないファイルパス・エラー」という事前チェックが誤発動してしまいます。 // バックアップを取ります。 foreach (Expression_Node_Filepath ec_Fpath_WrittenPlace in list_Expression_Filepath_Request) { //.WriteLine(this.GetType().Name + "#Perform: バックアップを取りたいファイルのパス sourceFilePath.HumanInputText=[" + oWrittenPlaceFilePath.HumanInputText + "]"); // 保存先 Expression_Node_Filepath ec_Fpath_Dst; { Configurationtree_NodeFilepath cf_fpath_Destination = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L03_5", s_ParentNode); cf_fpath_Destination.InitPath( sFopatha_dateTemp, ec_Fpath_WrittenPlace.Humaninput, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } ec_Fpath_Dst = new Expression_Node_FilepathImpl(cf_fpath_Destination); } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } string sFpatha_Source = ec_Fpath_WrittenPlace.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } // 人間オペレーターが記述しているファイルパス。 // 「相対パス」か「絶対パス」のどちらか。 string sFpath_HumanInput = ec_Fpath_Dst.Humaninput; // // 絶対パスで指定されたファイルを、バックアップに保存する方法 // // 例: 例えば、「C:\」を「C@\」に置換し、日付フォルダーの下に保存します。 // // 注意:「C:」より長い文字列と置換すると、文字列の長さ制限に引っかかることがあります。 // // 「絶対パス」か、「相対パス」かを判断します。 bool bPathRooted = Utility_Configurationtree_Filepath.IsRooted_Path(sFpath_HumanInput, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } // 絶対パスへの対応。 if (bPathRooted) { // 絶対パスであれば、「C:\」といった文字列が先頭に来ることが予想されます。 // 文字「:」が 2文字目 だけに存在することを想定して、 // 「:」を「@」に置換します。 // // 「絶対パスのようなもの」を、バックアップ日付フォルダーの下に作る想定です。 // ファイル名が長くなりすぎるので、この後、ファイル名を縮める処理になることが多い。 // //.WriteLine(this.GetType().Name + "#Perform: バックアップを取りたいファイルのパス名 humanInputFilePathStr=[" + humanInputFilePathStr + "]"); string sNewRelHPath3 = sFpath_HumanInput.Replace(":", "@"); //.WriteLine(this.GetType().Name + "#Perform: コロン記号を置換した後のファイルパス名 newRelHPathStr3=[" + newRelHPathStr3 + "]"); // 絶対パスでバックアップ対象ファイルが指定されていた場合 // // 「C:\banana」は、「C@\banana」に置換 // // 設定のし直し。 // 出力ファイルの絶対パスが長すぎると真。 bool isTooLong_Path = Utility_Configurationtree_Filepath.IsTooLong_Path( sNewRelHPath3, log_Reports, s_ParentNode ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } if (isTooLong_Path) { // 強引に短縮。 sNewRelHPath3 = DatebackupImpl.ReplaceToJammingFilePath( sNewRelHPath3, this.NSubstitutionFileNumber, this.GetType().Name + "#Perform:" ); this.NSubstitutionFileNumber++; //.WriteLine(this.GetType().Name + "#Perform: 短くした保存先ファイルパス名 newRelHPathStr3=[" + newRelHPathStr3 + "]"); // それでも、出力ファイルの絶対パスが長すぎると、後ろのプログラムで例外を投げます。 } // (2010-02-24 ※修正) // 保存先ファイルパスをセット。 ec_Fpath_Dst.SetHumaninput( sNewRelHPath3, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } } // 絶対パスへの対応終了 if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } // もう一回、絶対パスの取得し直し string sFpatha_Dst = ec_Fpath_Dst.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } // ファイルのコピーで作成します。 //.WriteLine(this.GetType().Name + "#Perform: [" + sourceAbsFilePath + "]を"); //.WriteLine(this.GetType().Name + "#Perform: [" + absDstPathStr + "]にコピーします。"); try { string sDestinationParent = Path.GetDirectoryName(sFpatha_Dst); if (!Directory.Exists(sDestinationParent)) { // 指定のファイルの、ディレクトリーが存在しなかった場合。 // ディレクトリーを作成します。 Directory.CreateDirectory(sDestinationParent); } } catch (Exception e) { // エラー err_Excp = e; goto gt_Error_MissIo; } try { // todo: 同名のファイルがあれば、「aaa(1).txt」「aaa(2).txt」といった風に番号を付けていきたい。 // ファイルのコピー System.IO.File.Copy(sFpatha_Source, sFpatha_Dst, false); } catch (Exception e) { // エラー err_Excp = e; err_SFpatha_Source = sFpatha_Source; err_SFpatha_Dst = sFpatha_Dst; goto gt_Error_MissCopy; } } if (!log_Reports.Successful) { // 異常時はスキップ goto gt_EndMethod; } try { // テンポラリーフォルダーを、正規の名前にリネームします。 Directory.Move(sFopatha_dateTemp, sFopatha_date); } catch (Exception e) { // エラー err_Excp = e; goto gt_Error_MissMove; } // 「バックアップ日付フォルダー」が11個以上あるとき、 // 日付が新しいものを(指定)個残して 他の日付フォルダーを破棄します。 this.DeleteOldBackup( sFpatha_BkHome, sName_Sub, log_Reports ); // 異常時は、「temp20091202」といった、処理を中断したゴミ・ファイルが残ることがあります。 goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_BkFolder: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle( "▲エラー508!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("バックアップ・フォルダーが指定されていません。"); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_MissIo: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle( "▲エラー65507!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("エラー:"); // // ヒント s.Append(r.Message_SException(err_Excp)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_MissCopy: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle( "▲エラー65506!", pg_Method); StringBuilder t = new StringBuilder(); t.Append("ファイルのコピーに失敗。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("["); t.Append(err_SFpatha_Source); t.Append("]"); t.Append("を"); t.Append(Environment.NewLine); t.Append("["); t.Append(err_SFpatha_Dst); t.Append("]"); t.Append("へコピーしようとしたとき。"); t.Append(Environment.NewLine); // // ヒント t.Append(r.Message_SException(err_Excp)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_MissMove: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle( "▲エラー65508!", pg_Method); Log_TextIndentedImpl t = new Log_TextIndentedImpl(); t.Append("ファイルのリネーム(Move)に失敗。"); // // ヒント t.Append(r.Message_SException(err_Excp)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: pg_Method.EndMethod(log_Reports); }
public MemoryGloballistconfig Perform( string sFpath_Glcnf, Log_Reports log_Reports ) { Log_Method pg_Method = new Log_MethodImpl(0); pg_Method.BeginMethod(Info_Operating.Name_Library, this, "Perform",log_Reports); // グローバルリスト・コンフィグ設定ファイルの内容。 MemoryGloballistconfig moGlcnf = new MemoryGloballistconfigImpl(); Configurationtree_Node parent_Configurationtree_Node = new Configurationtree_NodeImpl("グローバルリスト設定",null); Configurationtree_NodeFilepath cf_Fpath = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L03_2", parent_Configurationtree_Node); cf_Fpath.InitPath(sFpath_Glcnf, log_Reports); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } Expression_Node_Filepath ec_Fpath = new Expression_Node_FilepathImpl(cf_Fpath); string sFpatha_Xml = ec_Fpath.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); if (log_Reports.Successful) { // 正常時 try { // ファイルの読込み doc.Load(sFpatha_Xml); } catch (System.ArgumentException ex) { if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー0800206!", pg_Method); StringBuilder t = new StringBuilder(); t.Append("『SRSグローバルリスト』設定ファイルを読込もうとしたら、エラーが発生しました。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("ファイル=["); t.Append(sFpath_Glcnf); t.Append("]"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("もしかすると:"); t.Append(Environment.NewLine); t.Append(" ・ファイルパスが間違っているか、未入力なのかも知れません。ファイルパスを指定してください。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("例外メッセージ:["); t.Append(ex.GetType().Name); t.Append("]:"); t.Append(ex.Message); r.Message = t.ToString(); log_Reports.EndCreateReport(); } } catch (System.Exception ex) { if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー0800205!", pg_Method); StringBuilder t = new StringBuilder(); t.Append("『SRSグローバルリスト』設定ファイルの読込中にエラーが発生しました。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("ファイル=["); t.Append(sFpath_Glcnf); t.Append("]"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("もしかすると:"); t.Append(Environment.NewLine); t.Append(" ・読込む設定ファイルを間違えている? それは『SRSグローバルリスト 設定ファイル』で合っていますか?"); t.Append(Environment.NewLine); t.Append(" ・読込んだ設定ファイルの内容に間違いがある?"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("例外メッセージ:["); t.Append(ex.GetType().Name); t.Append("]:"); t.Append(ex.Message); r.Message = t.ToString(); log_Reports.EndCreateReport(); } } } if (log_Reports.Successful) { // 正常時 try { // ルート要素を取得 System.Xml.XmlElement root = doc.DocumentElement; // type要素を列挙 System.Xml.XmlNodeList typeNL = root.GetElementsByTagName("type"); for (int nTypeIndex = 0; nTypeIndex < typeNL.Count; nTypeIndex++) { XmlNode x_TypeNode = typeNL.Item(nTypeIndex); if (log_Reports.Successful) { // 正常時 if (XmlNodeType.Element == x_TypeNode.NodeType) { // // type要素 // XmlElement x_TypeElm = (XmlElement)x_TypeNode; string sType = x_TypeElm.Attributes.GetNamedItem(SrsAttrName.S_NAME).Value; GloballistconfigTypesectionImpl typeSection = new GloballistconfigTypesectionImpl(); typeSection.Name_Type = sType; moGlcnf.TypesectionList.List_Item.Add(typeSection); } } } // human要素を列挙 System.Xml.XmlNodeList x_HumanNL = root.GetElementsByTagName("human"); for (int nHumanIndex = 0; nHumanIndex < x_HumanNL.Count; nHumanIndex++) { XmlNode x_HumanNode = x_HumanNL.Item(nHumanIndex); if (log_Reports.Successful) { // 正常時 if (XmlNodeType.Element == x_HumanNode.NodeType) { // // human要素 // XmlElement x_HumanElm = (XmlElement)x_HumanNode; GloballistconfigHuman human = new GloballistconfigHumanImpl(); human.Name = x_HumanElm.Attributes.GetNamedItem(SrsAttrName.S_NAME).Value; moGlcnf.Dictionary_Human.Add(human.Name, human); // variable要素を列挙 System.Xml.XmlNodeList x_VariableNL = x_HumanElm.GetElementsByTagName("variable"); for (int n_VariableIndex = 0; n_VariableIndex < x_VariableNL.Count; n_VariableIndex++) { XmlNode x_VariableNode = x_VariableNL.Item(n_VariableIndex); if (XmlNodeType.Element == x_VariableNode.NodeType) { // // variable要素 // XmlElement x_VariableElm = (XmlElement)x_VariableNode; GloballistconfigVariable variable = new GloballistconfigVariableImpl(); variable.Name_Type = x_VariableElm.Attributes.GetNamedItem("type").Value; // 変数の連想配列に、項目を追加 if (human.Dictionary_Variable.ContainsKey(variable.Name_Type)) { // エラー if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー1002!", pg_Method); r.Message = "指定された変数の型["+variable.Name_Type+"]が、重複されて記述されています。"; log_Reports.EndCreateReport(); } } else { human.Dictionary_Variable.Add(variable.Name_Type, variable); // number要素を列挙 System.Xml.XmlNodeList numberNL = x_VariableElm.GetElementsByTagName("number"); for (int numberIndex = 0; numberIndex < numberNL.Count; numberIndex++) { XmlNode numberNode = numberNL.Item(numberIndex); if (XmlNodeType.Element == numberNode.NodeType) { // // number要素 // XmlElement numberElm = (XmlElement)numberNode; GloballistconfigNumber numberObj = new GloballistconfigNumberImpl(); numberObj.Text_Range = numberElm.Attributes.GetNamedItem("range").Value; Int_HumaninputImpl oPriority = new Int_HumaninputImpl("!ハードコーディング_LoaderOfGlobalListConfigXml"); oPriority.Text = numberElm.Attributes.GetNamedItem("priority").Value; numberObj.Priority = oPriority; // 変数の連想配列に、変数番号オブジェクトを追加 variable.Dictionary_Number.Add(numberObj.Text_Range, numberObj); } } } } } } } } } catch (System.IO.IOException ex) { if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー080103!", pg_Method); r.Message = "『SRSグローバルリスト』設定ファイルが見つかりません。:" + ex.Message; log_Reports.EndCreateReport(); } } catch (System.Exception ex) { if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー0800204!", pg_Method); StringBuilder t = new StringBuilder(); t.Append("『SRSグローバルリスト』設定ファイルの読込中にエラーが発生しました。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("ファイル=["); t.Append(sFpath_Glcnf); t.Append("]"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("もしかすると:"); t.Append(Environment.NewLine); t.Append(" ・読込む設定ファイルを間違えている? それは『SRSグローバルリスト 設定ファイル』で合っていますか?"); t.Append(Environment.NewLine); t.Append(" ・読込んだ設定ファイルの内容に間違いがある?"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("例外メッセージ:["); t.Append(ex.GetType().Name); t.Append("]:"); t.Append(ex.Message); r.Message = t.ToString(); log_Reports.EndCreateReport(); } } } // // // // gt_EndMethod: pg_Method.EndMethod(log_Reports); return moGlcnf; }
//──────────────────────────────────────── /// <summary> /// エラーログを出力します。(エラーが発生したときに呼び出してください) /// </summary> /// <param oVariableName="output_d_Logging"></param> /// <param name="runningHintName">このメソッドが呼び出された場所が分かるようなヒント。</param> public void WriteErrorLog( MemoryApplication moApplication, Log_Reports log_ReportsBuffer_Output, string sRunningHintName ) { Log_Method log_Method = new Log_MethodImpl(0); // メタ。 Log_Reports log_Reports_Meta = new Log_ReportsImpl(log_Method); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "WriteErrorLog",log_Reports_Meta); // // // 書き出すテキスト // string sOutput; { sOutput = log_ReportsBuffer_Output.ToText(); } // // 書き出し先ファイルへのパス // Expression_Node_Filepath ec_Fpath; if (log_Reports_Meta.Successful) { XenonName o_Name_Variable = new XenonNameImpl(NamesVar.S_SP_LOGS, new Configurationtree_NodeImpl("!ハードコーディング_MoOpyopyoImpl#WriteLog", null)); // 変数名。 Expression_Leaf_StringImpl ec_Atom = new Expression_Leaf_StringImpl(null, o_Name_Variable.Cur_Configuration); ec_Atom.SetString( o_Name_Variable.SValue, log_Reports_Meta ); // ファイルパス。 log_Reports_Meta.Log_Callstack.Push(log_Method, "③"); ec_Fpath = moApplication.MemoryVariables.GetExpressionfilepathByVariablename( ec_Atom, true, log_Reports_Meta ); log_Reports_Meta.Log_Callstack.Pop(log_Method, "③"); } else { ec_Fpath = null; } // // ファイルの書き出し // string err_SFpatha; { string sFpatha; if (log_Reports_Meta.Successful) { // フォルダーへの絶対パス string sFopatha_Logs = ec_Fpath.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports_Meta); if (!log_Reports_Meta.Successful) { // 既エラー。 goto gt_EndMethod; } Expression_Node_Filepath ec_Fpath2; { Configurationtree_Node parent_Cf = new Configurationtree_NodeImpl("!ハードコーディング_MoOpyopyoImpl#WriteLog", null); Configurationtree_NodeFilepath cf_Fpath = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L09Mid_6", parent_Cf); cf_Fpath.InitPath( sFopatha_Logs, "error-log.txt", log_Reports_Meta ); if (!log_Reports_Meta.Successful) { // 既エラー。 goto gt_EndMethod; } ec_Fpath2 = new Expression_Node_FilepathImpl(cf_Fpath); } sFpatha = ec_Fpath2.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports_Meta); } else { sFpatha = "<エラー>"; } if (log_Reports_Meta.Successful) { try { System.IO.File.WriteAllText(sFpatha, sOutput, Global.ENCODING_LOG); //#正常な、エラー出力 StringBuilder s0 = new StringBuilder(); s0.Append("エラーが発生しました!"); s0.Append(Environment.NewLine); s0.Append(Environment.NewLine); s0.Append("アプリケーションは正常に動作していない可能性があります。"); s0.Append(Environment.NewLine); s0.Append(Environment.NewLine); s0.Append("エラーログを書き出しました。"); s0.Append(Environment.NewLine); s0.Append("["); s0.Append(sFpatha); s0.Append("]"); s0.Append(Environment.NewLine); s0.Append(Environment.NewLine); s0.Append("このアプリケーションの開発者にエラーログをお知らせください。"); MessageBox.Show( s0.ToString(), "▲エラーが発生しました! " + Info_MiddleImpl.Name_Library + ":" + this.GetType().Name + "#WriteErrorLog"); } catch (Exception) { err_SFpatha = sFpatha; goto gt_Error_CanNotWriteErrorLog; } } else { // メタのロガーが、エラーを検知。 goto gt_Error_MetaNotSuccessful; } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_CanNotWriteErrorLog: { StringBuilder s0 = new StringBuilder(); s0.Append("▲312!エラーが発生しましたが、エラーログを出力できませんでした。("); s0.Append(Info_MiddleImpl.Name_Library); s0.Append(") ファイルパス=["); s0.Append(err_SFpatha); s0.Append("]"); MessageBox.Show(sOutput, s0.ToString()); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_MetaNotSuccessful: { Log_TextIndented s0 = new Log_TextIndentedImpl(); s0.Append("エラーが発生しましたが、エラーログを出力できませんでした。"); s0.Newline(); s0.Newline(); s0.Append("もしかして?"); s0.Newline(); s0.Append(" ・設定ファイルの「エラーログの書出し先」を読み込む前に、エラーが出てしまった?"); s0.Newline(); s0.Append(" ・「ログファイル書き出し先」は指定されていますか?"); s0.Newline(); s0.Newline(); s0.Append("実行箇所ヒント:"); s0.Newline(); s0.Append(" ・"); s0.Append(sRunningHintName); s0.Newline(); s0.Newline(); MessageBox.Show( s0.ToString(), //sOutput, "▲エラー!【Er:101;】(" + log_Method.Fullname + ")"); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports_Meta); return; }
//──────────────────────────────────────── public string GetSFilepath_UsercontrolconfigAbsolute( Expression_Node_Filepath ec_Fpath_Fcnf, Expression_Node_Filepath ec_Fopath_Forms, Log_Reports log_Reports ) { string sFpatha_Fcnf; // // forms フォルダー // string sFopatha_Forms = ec_Fopath_Forms.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports); if (!log_Reports.Successful) { // 既エラー。 sFpatha_Fcnf = ""; goto gt_EndMethod; } // // Fcnf 絶対ファイルパス // if (log_Reports.Successful) { // 正常時 Configurationtree_Node parent_Cf = new Configurationtree_NodeImpl("formsフォルダーパス+コンポーネント設定ファイルパス", null); Configurationtree_NodeFilepath cf_Fpath = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L08_1", parent_Cf); cf_Fpath.InitPath( sFopatha_Forms, ec_Fpath_Fcnf.Humaninput, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 sFpatha_Fcnf = ""; goto gt_EndMethod; } Expression_Node_Filepath ec_Fpatha_Fcnf = new Expression_Node_FilepathImpl(cf_Fpath); sFpatha_Fcnf = ec_Fpatha_Fcnf.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports); if (!log_Reports.Successful) { // 既エラー。 sFpatha_Fcnf = ""; goto gt_EndMethod; } } else { // エラー sFpatha_Fcnf = ""; } goto gt_EndMethod; // // gt_EndMethod: return sFpatha_Fcnf; }