Exemple #1
0
        //────────────────────────────────────────
        /// <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;
        }
Exemple #3
0
        //────────────────────────────────────────
        /// <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;
        }
Exemple #4
0
        //────────────────────────────────────────
        /// <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;
        }