いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-004 (System.Environment)


System.Environmentクラスは、名前の通りシステムの環境周りの情報などを
取得できたりします。

実用性があるところで、改行コードの取得やカレントディレクトリの取得、システムディレクトリ
へのパス、環境変数の取得、OSのバージョン情報などを取得できたりします。


また、javajava.lang.System場合と同じくプロセスを終了させるExitメソッドも定義されています。


このクラスのメソッドは全てstaticとなっていますのでインスタンスを作成せずに利用できます。


以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;
using System.Collections;

using Gsf.Research.ClassLibrary;

namespace Gsf.Research.ClassLibrary.System{

    /// <summary>
    /// System.Environmentクラスのサンプルです。
    /// </summary>
    /// <remarks>
    /// System.Environmentクラスは、システムの環境情報やシステムディレクトリの情報
    /// などを返すクラスです。
    /// FailFastメソッドは、実行するとアプリケーションを強制終了(即死)させます。
    /// この場合、通常実行されるはずのfinallyブロックも通らなくなります。
    /// </remarks>
    public class EnvironmentResearch00 : IExecutable{

        /// <summary>
        /// 処理を実行します。
        /// </summary>
        public void Execute(){
            //
            // Environmentクラスのメソッドは、全てstaticメソッドです。
            //

            //
            // CommandLine, GetCommandLineArgs()
            //
            // これらのメソッドは、起動時にコマンドラインに与えられた
            // 文字列を返します.
            // このメソッドは、Mainメソッドにて、Main()と宣言されている
            // 場合でも、引数を受け取れます.
            //
            // CommandLineプロパティは、一つの文字列として、GetCommandLineArgs()は
            // 配列として受け取れます.
            // (プログラム名も含まれることに注意.)
            //
            Console.WriteLine(Environment.CommandLine);
            foreach(string element in Environment.GetCommandLineArgs()){
                Console.WriteLine(element);
            }

            //
            // CurrentDirectory.
            //
            // そのままですが、カレントディレクトリを表します。
            // get;set;が用意されていますので、取得および設定が可能です。
            //
            // 取得できるパスは、絶対パスとなっています。
            //
            // ルートドライブを指定した場合は,後ろに\(円記号)がつきます。
            // しかし、サブディレクトリを指定した場合は、後ろに円記号は
            // 付かないので注意です。
            //
            //
            string tmpCurrentDirectory = Environment.CurrentDirectory;
            Console.WriteLine(Environment.CurrentDirectory);

            Environment.CurrentDirectory = "/";
            Console.WriteLine(Environment.CurrentDirectory);
            Environment.CurrentDirectory = "/usr/local/tmp";
            Console.WriteLine(Environment.CurrentDirectory);

            Environment.CurrentDirectory = tmpCurrentDirectory;

            //
            // HasShutdownStarted.
            //
            // CLRが終了処理中か、現在のアプリケーションドメインがアンロード中かどうかが
            // 取得できます.
            //
            Console.WriteLine(Environment.HasShutdownStarted);

            //
            // NewLine.
            //
            // 現在実行しているシステムでの改行コードを取得します.
            // javaでいうと、System.getProperty("line.separator")と同じです。
            //
            Console.WriteLine("line1.{0}line2.", Environment.NewLine);

            //
            // OSVersion.
            //
            // 現在稼動中のOSの情報を取得します.
            // Environment.OSVersionから取得できるのは
            // System.OperatingSystemオブジェクトです。
            //
            Console.WriteLine(Environment.OSVersion.VersionString);

            //
            // StackTrace.
            //
            // 現在の処理でのスタックとレースを取得します.
            //
            Console.WriteLine(Environment.StackTrace);

            //
            // ExpandEnvironmentVariablesメソッド.
            //
            // 環境変数を含んだ文字列を渡すと、それを展開して返してくれます.
            // 環境変数は、%で囲んで記述する必要があります。
            // 存在しない環境変数を書いている場合は、置換されずにそのままになります。
            //
            Console.WriteLine(Environment.ExpandEnvironmentVariables("%windir%;;;;;;;;;%path%;;;%home%"));

            //
            // GetEnvironmentVariableメソッド
            //
            // 指定した環境変数の値を文字列として取得できます。
            //
            // こちらは、上記のExpandEnvironmentVariablesと違い環境変数名を
            // %で囲む必要はありません。
            // その代わり指定できる環境変数は一つだけです。
            // 存在しない環境変数を指定した場合は、nullが返却されます。
            //
            Console.WriteLine(Environment.GetEnvironmentVariable("path"));

            //
            // GetEnvironmentVariablesメソッド
            //
            // 環境変数の値を全て返します。
            //
            // 帰ってくる値は、IDictionaryオブジェクトです。
            // キーに環境変数名、値にはその環境変数の値が格納されています。
            // 環境変数が一つも存在しない場合は、空のディクショナリが返却されます。
            //
            foreach(DictionaryEntry entry in Environment.GetEnvironmentVariables()){
                Console.WriteLine("key={0}, value={1}", entry.Key, entry.Value);
            }

            //
            // SetEnvironmentVariableメソッド.
            //
            // GetEnvironmentVariableメソッドの逆です。
            // 環境変数を作成・更新・削除します。
            //
            // ・存在しない環境変数の場合は、作成。
            // ・存在している環境変数にnull以外の値をセットすると更新。
            // ・存在している環境変数にnullをセットすると削除。
            // になります。
            //
            string name = "MY_ENV";

            // 作成
            Environment.SetEnvironmentVariable(name, "hoge");
            Console.WriteLine(Environment.GetEnvironmentVariable(name));

            // 更新
            Environment.SetEnvironmentVariable(name, "hehe");
            Console.WriteLine(Environment.GetEnvironmentVariable(name));

            // 削除
            Environment.SetEnvironmentVariable(name, null);
            Console.WriteLine(Environment.GetEnvironmentVariable(name) ?? "該当する環境変数は存在しません。");

            //
            // GetFolderPathメソッド.
            //
            // システムディレクトリへのパスを取得できます。
            // 引数に指定するのは、Environment.SpecialFolder列挙体の値です。
            //
            // プログラムファイルフォルダへのパスや、ユーザごとのアプリケーションフォルダへの
            // パスなどが定義されています。
            //
            Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
            Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.Programs));
            Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles));
            Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
            Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
            Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));

            //
            // GetLogicalDrivesメソッド.
            //
            // 論理ドライブ名の配列を取得します。
            //
            foreach(string drive in Environment.GetLogicalDrives()){
                Console.WriteLine(drive);
            }

            //
            // Exitメソッド.
            //
            // プロセスを終了し、指定した終了コードをOS側に返します.
            // javaでいう, System.exit()と同じです。
            //
            // 終了コード 0 でプロセスを終了させる
            //Environment.Exit(0);

            //
            // FailFastメソッド
            //
            // Exitメソッドと同じくプロセスを終了させますが、
            // こちらは、強制終了という形になります。
            // このメソッドを使用してプロセスを終了させた場合は、
            // 通常必ず通るはずのfinallyブロックも通らずにプロセスが
            // 終了します。
            // 使う場合は、要注意です。
            //
            // 引数に指定したメッセージとプログラムのダンプが、イベントログに書き込まれます。
            //
            /*
            try{
                Environment.FailFast("プロセスが強制終了しました。");
            }finally{
                Console.WriteLine("ここは表示されません。");
            }
            */

        }
    }
}


================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。