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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

2563閲覧

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

ShinyaKojima

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/04/17 04:09

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

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>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

xml

1<!-- App.config --> 2<?xml version="1.0" encoding="utf-8"?> 3<configuration> 4 <startup> 5 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> 6 </startup> 7 8 <appSettings> 9 <add key="key1" value="value1" /> 10 <add key="key2" value="value2" /> 11 <add key="key3" value="value3" /> 12 </appSettings> 13</configuration>

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

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

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

投稿2019/04/17 06:38

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShinyaKojima

2019/04/17 06:53

修正ありがとうございます。 key1の値以前の問題でエラーは出なくとも全く動かないという状態でした(;^_^A そして先の回答でも教えていただいた設定の仕方もまだ理解できておりません。 ググってそれっぽいのを貼りつけてが多いので正しい知識や文法もまだまだ 未熟です。paizaラーニングで基本から勉強しながらですが業務は、なかなか基本だけではこなせていないのでこのような形になってしまいます。職場でも詳しい方がいないのでネットだけが頼りな状態です・・・
dodox86

2019/04/17 07: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 です。 難しかったら、コマンドラインオプションから指定する方が簡単かもしれません。お好きな、今できるものをどうぞ。
ShinyaKojima

2019/04/17 07:15

dobon.net さんはググってよく目にするサイトですね。 詳しい説明と参考になるサイトまで教えていただきありがとうございました。参考にしながら進めていきたいと思います。
guest

0

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

投稿2019/04/17 04:58

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShinyaKojima

2019/04/17 05:39

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

2019/04/17 07:56

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

2019/04/18 00:16

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

2019/04/18 00:52

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

0

CPU使用率やメモリ使用量、現在時刻などを1分間隔でテキストに書き出す

自分のPCで絶対パスでフォルダを指定してテキストファイルを作成、書込みしていたのですが、テキストを出力するフォルダが固定で記載されていてこれだと、別のサーバで動かしたい場合
自由にフォルダを変更できない

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

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

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

ざっくり言ってしまえば以下の手順ぐらいでしょう。
0. NuGetから落とす
0. configファイルにログの書き込み方法を指定する
0. プログラムにLoggerのインスタンスを生成してログを書き込む。

投稿2019/04/17 04:20

編集2019/04/17 05:04
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問