質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

C# app.configを使って可変定義について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,521

ShinyaKojima

score 18

いつもお世話になっております。

CPU使用率やメモリ使用量、現在時刻などを1分間隔でテキストに書き出すプログラムを24時間動かし続けてテキストのファイル名を当日の日付にしてデータを残そうとしています。
以前の質問では「パフォーマンスモニター」を使っての設定だったのですが、こちらも完成させておきたいと思い、皆様のお知恵をお借りに来ました。
現状では自分のPCで絶対パスでフォルダを指定してテキストファイルを作成、書込みしていたのですが、テキストを出力するフォルダが固定で記載されていてこれだと、別のサーバで動かしたい場合
自由にフォルダを変更できないので運用上、都合が悪い。可変にすべきということで
ネットで検索して「app.config」で出来るのではないかと思い手探りで書いてみたら
エラーはありませんが、警告が1件あり「要素‘startup’には無効な子要素‘appSetttings’が含まれています。必要とされる要素は‘Runtime,requiredRuntime’supportedRuntime,requiredRuntime´です」という表示が出ています。
使い方を理解できていないまま書いたので当然だとは思いますが
正しい使い方やこういう風にすれば便利だというようなことがあれば
ご教授をお願い致します。

Program.cs

using System;
using System.Threading;
using System.Diagnostics;
using System.IO;
using System.Configuration;

namespace CodeRecipe_Timer_CS
{
    class Program
    {
        static void Main(string[] args)
        {

            using (PerformanceCounter pc = new PerformanceCounter("Processor", "% Processor Time", "_Total", true))
            {
                AutoResetEvent autoEvent = new AutoResetEvent(false);
                TimerCallback tDelegate = new TimerCallback(GetCpuUsage);
                using (Timer oTimer = new Timer(tDelegate, pc, 0, 60000))
                {
                    autoEvent.WaitOne(-1, false);
                  //Thread.Sleep(86400000);
                }
            }
            //Console.WriteLine("Timer を停止しました。終了するには何かキーを押してください。");
            Console.Read();
        }
        static void GetCpuUsage(object state)
        {
            string today = DateTime.Now.ToString("yyyyMMdd");

            PerformanceCounter pc = state as PerformanceCounter;
            DateTime dtNow = DateTime.Now;
            System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess();
            p.Refresh();

            if (pc != null)
            {
                //Console.WriteLine(String.Format("現在のCPU使用率は {0:f}% です。" + dtNow.ToString(), pc.NextValue()));
                //Console.WriteLine("物理メモリ使用量: {0}", p.WorkingSet64);
                //Console.WriteLine("仮想メモリ使用量: {0}", p.VirtualMemorySize64);
                File.AppendAllText(ConfigurationManager.AppSettings["key1"] + today + ".txt", String.Format(dtNow.ToString() + "  "));
                File.AppendAllText(ConfigurationManager.AppSettings["key1"] + today +".txt", String.Format("現在のCPU使用率は {0:f}% です。", pc.NextValue()));
                File.AppendAllText(ConfigurationManager.AppSettings["key1"] + today + ".txt", String.Format(" 物理メモリ使用量: {0}", p.WorkingSet64));
                File.AppendAllText(ConfigurationManager.AppSettings["key1"] + today + ".txt", String.Format(" 仮想メモリ使用量: {0}", p.VirtualMemorySize64) + Environment.NewLine);
            }

        }
    }
}
App1.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <appSettings>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
      <add key="key1" value="value1" />
      <add key="key2" value="value2" />
      <add key="key3" value="value3" />
    </appSettings>
  </startup>
</configuration>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

(質問中にご提示の App.config ですが、key1 の値は正しく取れていましたか? 位置が間違っているので、取れていないと思うのですが まぁ、それは置いておくとして)

要素‘startup’には無効な子要素‘appSetttings’が含まれています。必要とされる要素は‘Runtime,requiredRuntime’supportedRuntime,requiredRuntime´です

まんま説明の通りなのですが、要素の配置位置(許される親子関係)が違います。正しくは以下のようになります。

<!-- App.config -->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>

  <appSettings>
    <add key="key1" value="value1" />
    <add key="key2" value="value2" />
    <add key="key3" value="value3" />
  </appSettings>
</configuration>

リファレンスとしては以下になります。
Microsoft Docs - ... 構成ファイルを使用してアプリを構成する方法 / 構成ファイル ... configuration element

先の回答にもありましたが、プロジェクトのプロパティからセットした方が簡単です。が、その場合はファイルの内容(要素名や階層)が変わるので注意してください。

以下、老婆心から:
ググって記事のコードを参考にすること自体は良いと思うのですが、初心である場合は理解しないまま寄せ集めたような結果となりがちです。そこで終わらず、知らないクラスやメソッド、APIがあったらリファレンスをあたって確認したほうが良いと思います。(とは言え、リファレンス自体に間違いや不適切な内容があったりする場合もあるので、ハマらない程度に適当なところで切り上げる判断も大事ですw)また、最初はまずかろうコードでも、あれこれ手を出さずに要望どおりに動くことを優先し、動かないことで自分自身のモチベーションが下がらないよう気をつけましょう>この辺は賛否あるでしょうけど)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/17 15:53

    修正ありがとうございます。
    key1の値以前の問題でエラーは出なくとも全く動かないという状態でした(;^_^A
    そして先の回答でも教えていただいた設定の仕方もまだ理解できておりません。

    ググってそれっぽいのを貼りつけてが多いので正しい知識や文法もまだまだ
    未熟です。paizaラーニングで基本から勉強しながらですが業務は、なかなか基本だけではこなせていないのでこのような形になってしまいます。職場でも詳しい方がいないのでネットだけが頼りな状態です・・・

    キャンセル

  • 2019/04/17 16:03

    あー、職場にエンジニア/プログラマーの先輩がいないのですか。それはつらいですね。

    ご存知かもしれませんが、公式以外の.NET 系のプログラミング情報サイトとしてはdobon.net さんが定番かと思います。http://dobon.net/ アプリケーション構成ファイルについては https://dobon.net/vb/dotnet/programing/appconfigfile.html
    Visual Studio のプロジェクトのプロパティからセットする方法はhttps://dobon.net/vb/dotnet/programing/mysettings.html#section1 です。
    難しかったら、コマンドラインオプションから指定する方が簡単かもしれません。お好きな、今できるものをどうぞ。

    キャンセル

  • 2019/04/17 16:15

    dobon.net さんはググってよく目にするサイトですね。

    詳しい説明と参考になるサイトまで教えていただきありがとうございました。参考にしながら進めていきたいと思います。

    キャンセル

+1

CPU使用率やメモリ使用量、現在時刻などを1分間隔でテキストに書き出す
自分のPCで絶対パスでフォルダを指定してテキストファイルを作成、書込みしていたのですが、テキストを出力するフォルダが固定で記載されていてこれだと、別のサーバで動かしたい場合
自由にフォルダを変更できない

自分ならNLogやLog4Netなどのログを吐いてくれるライブラリを使ってログにCPU使用率やメモリ使用量、現在時刻の状態を記録します。これらのライブラリはNuGetから落として簡単に導入できます。

これなら吐くフォルダも相対パスで指定できますし、他にも特定期間毎に吐くファイルを変更することや非同期書き込みをさせることも出来ます。

導入方法は適当に探せばあります。
NLogでログを記録する
Log4Net を利用してログを記録する

ざっくり言ってしまえば以下の手順ぐらいでしょう。

  1. NuGetから落とす
  2. configファイルにログの書き込み方法を指定する
  3. プログラムにLoggerのインスタンスを生成してログを書き込む。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

BluOxyさんに賛成。
とはいえ、ご要望のことは、プロジェクトのプロパティから設定」で設定してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/17 14:39

    プロジェクトのプロパティから設定 ということですが
    プロパティの設定→参照パス→フォルダの指定
    ということで良いでしょうか?
    使い方がまだよく分かっていないので手探り状態です・・・
    もしよろしければもう少し詳しくお願い致します。

    キャンセル

  • 2019/04/17 16:56

    VSのメニューバーの「プロジェクト」
    1番下(のはず)の「プロジェクトのプロパティ」
    アプリケーション、ビルド、など並んだ中の「設定」
    初めての場合は「このプロジェクトには規定の設定ファイルが含まれていません。ファイルを作成するには、ここをクリックして下さい。」と表示されるので、クリック。DataGridのようなグリッドが表示されます。
    名前と型を指定して、スコープを「アプリケーション」にすると、実行ファイルと同じディレクトリの.configファイルに出力されます。
    ただし、プログラム中で変更するのには向いていません。

    キャンセル

  • 2019/04/18 09:16

    ありがとうございます。
    見つかりました。
    この名前、種類、スコープ、値と4つあるのですが、
    今回の件では、
    CPU使用率やメモリの使用量、現在時刻などをテキストファイルに書き出したファイルの置き場所(フォルダのフルパス)を設定ということなのですが、名前部分がファイルを保存したいフォルダ名、種類は文字列を扱うからstring、スコープはユーザー?値は書き込みたい内容(CPU使用率など)
    ということですか?自分の理解が浅くて的外れなことを聞いてるかもしれませんがお願いします。

    キャンセル

  • 2019/04/18 09:52

    アプリケーション設定の名前、種類、スコープ、値などは、触らず
    実行してみました。テキストファイルは
    C:\Users\source\repos\ConsoleApp9\ConsoleApp9\bin\Debugの中のexeやconfigと一緒のフォルダにありました。
    テキストファイル内も書き込まれている内容に問題はありません。あとはこのファイルを書き込むフォルダの場所を設定するということなのですが、この設定の名前や値を変更したらよいのでしょうか?また名前や種類スコープ、値の行が増やせるみたいなのですが、この操作を理解出来ればと思うのですが

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る