ランタイム・システム・プラットフォームの情報
ランタイムバージョン
Environment.Versionプロパティを参照することで、現在動作しているランタイム(.NET Framework、Mono等)のバージョンを取得することが出来ます。 バージョンは数値や文字列ではなくVersionクラスとして返されるため、メジャーバージョン番号・マイナーバージョン番号・ビルド番号等を個別に参照することも出来ます。
RuntimeEnvironment.GetSystemVersionメソッドを呼ぶことでもランタイムのバージョンを取得することが出来ます。 ただし、このメソッドの戻り値はVersionクラスではなく文字列となっています。 返されるバージョンは数字のみからなる形式でなくvから始まるものとなるようです(.NET Frameworkのディレクトリ名やバージョン表記で使われるものと同じ形式)。
現在動作しているランタイムがMonoかどうか調べる方法はTipsで解説しています。
OSバージョン
Environment.OSVersionプロパティを参照することで、現在動作しているOSのバージョンを取得することが出来ます。 このバージョンも数値や文字列ではなくOperatingSystemクラスとして返されるため、バージョンの他にも適用されているサービスパック名、プラットフォームIDなども参照することも出来ます。
PlatformIDは、OSがNT系Windowsか、9x系Windowsか、Unix系かといった大きな分類を表すものです。 より細かいOSのバージョン(XP, Vista, 7, etc.)やエディション(Professional, Ultimate, etc.)等を知るには、VersionStringを解析するか、バージョン番号を詳しく見ていく必要があります。 また、古いバージョンのランタイムではPlatformID.MacOSXやPlatformID.Xboxなどの値が定義されていない場合がある点にも注意が必要です。
現在動作しているOSがUnix系(Linux, Mac OS, BSD等)であるかどうかを調べる方法はTipsで解説しています。
プロセッサ数・プロセッサ情報
Environment.ProcessrCountプロパティを参照することで、現在動作している環境のCPU数(プロセッサコア数)を取得することができます。 ドキュメントによると、.NET Frameworkの実装では環境変数NUMBER_OF_PROCESSORSの値を参照しているようです。
なお、NT系WindowsではPROCESSOR_ARCHITECTURE等の環境変数の値を取得することでプロセッサ情報を取得することが出来ます。
CPUの使用率等の情報はパフォーマンスカウンタで取得できます。 一方、クロック周波数など環境変数では取得できないようなハードウェア情報を取得するにはWMI(Windows Management Instrumentation, System.Management名前空間)を使用したり、レジストリに格納されている情報や/proc/cpuinfoなどを参照する必要があります。
環境変数の取得については環境変数で詳しく解説しています。
32ビット環境・64ビット環境
Environment.Is64BitProcessプロパティおよびEnvironment.Is64BitOperatingSystemプロパティを参照することで、実行環境が32ビットか64ビットかを判断も出来ます。 Is64BitProcessプロパティは自プロセスが64ビットで動作しているかどうか、Is64BitOperatingSystemは実行しているOSが64ビットで動作しているかどうかを返します。 なお、このプロパティはいずれも.NET Framework 4で追加されたものです。 それより前のバージョンでは使用できない点に注意が必要です。
実行環境が64ビットかどうかを調べるためにIntPtr.Sizeプロパティを参照することも出来ます。 IntPtr.SizeプロパティはIntPtr(ポインタ)のバイト数を表す値を返し、プロセスが64ビットモードで動作している場合(64ビット版のランタイムが使われている場合)はSizeプロパティが8(バイト=64ビット)、32ビットの場合は4(バイト=32ビット)を返します。
以下の結果は、上記のコードを64ビット版Windows上でコンパイル、動作させたものです。 コンパイルオプション(/platform)によって32ビット版・64ビット版のどちらのランタイムで動作させるか指定しています。
エンディアン
BitConverter.IsLittleEndianプロパティを参照することで、現在実行している環境がリトルエンディアンであるかどうかを調べることができます。
この他、次の例のように、メモリ上に格納される値のレイアウトを見ることでエンディアンを調べることも出来ます。
バイトオーダーの変換にはIPAddress.NetworkToHostOrderメソッドおよびIPAddress.HostToNetworkOrderメソッドが使えます。 これらのメソッドについては基本型の型変換 §.基本型とバイト配列への/からの変換で解説しています。
改行文字
Environment.NewLineプロパティを参照することで、現在実行している環境での改行文字を取得することが出来ます。
Console.WriteLineメソッド、StreamWriter.WriteLineメソッドやStringBuilder.AppendLineメソッドでは、末尾に追加される改行文字にEnvironment.NewLineと同じものが使用されます。
なお、StreamWriterではNewLineプロパティに任意の文字列を設定することでEnvironment.NewLineとは異なる改行文字を使用することが出来ます。 StringBuilderにはそのようなプロパティは用意されていません。
Consoleの場合は、Console.Out.NewLineに値を指定することで改行文字を変更することが出来ます。 次の例ではNewLineに"↵\n"を指定することで改行文字を変更しています。
なお、現在実行している環境でのデフォルトの文字コードについては別途解説しています。
ファイル・ディレクトリの区切り文字・無効な文字
Path.DirectorySeparatorCharフィールドを参照することで、ファイル・ディレクトリの区切り文字を取得できます。
Windowsでは区切り文字に \ (バックスラッシュ)、MaxOSやUnix系OSなどでは / (スラッシュ)が使われますが、この区切り文字を取得できます。 ただ、Pathクラスのメソッドを使えば適切な区切り文字を使用した処理が行われるので、このフィールドの値を参照することはあまりありません。
例えばパスの連結にはCombineメソッド、パスからディレクトリ・ファイル名の取得にはGetDirectoryNameメソッドとGetFileNameメソッドを使うことが出来るため、わざわざ区切り文字を使って文字列の分割・結合をする必要はありません。 また、これらのメソッドでは区切り文字に \ と / が混在していても適切に動作します。
Pathクラスを使ったパスの操作についてはパスの操作を参照してください。
ファイル名に使えない文字、パスに使えない文字を取得するには、Path.GetInvalidFileNameCharsメソッドもしくはPath.GetInvalidPathCharsメソッドを呼び出します。 これらのメソッドは、使用不可能な文字をcharの配列で返します。 使用できない具体的な文字等、詳しくはパスの操作 §.パスやファイル名に使用できない文字の取得 (GetInvalidPathChars/GetInvalidFileNameChars)を参照してください。
特別なディレクトリ
ホームフォルダ・デスクトップ・システムディレクトリ等
Environment.GetFolderPathメソッドを使うことで、OSのバージョンやユーザ毎に異なるフォルダ・ディレクトリのパスを取得することが出来ます。 取得したいフォルダの種類はEnvironment.SpecialFolder列挙体で指定します。
また、Environment.SystemDirectoryプロパティを参照することでシステムディレクトリを取得することも出来ます。
これらのフォルダは環境によっては対応するものが無い場合もあります。 次の表は、Environment.SpecialFolder列挙体で指定できるフォルダの種類と、実際に取得されたパスの対応表です。 一つの参考としてご覧ください。 パス中に含まれるユーザ名の部分は username、該当するフォルダが無い場合(GetFolderPathが空の文字列を返す場合)は - と表記しています。 フォルダの具体的な意味や役割と得られるパスについてはEnvironment.SpecialFolder列挙体のドキュメントを参照してください。
Environment.SpecialFolder | Windows 7 (.NET Framework 4) | Ubuntu 11.10 (Mono 2.10.8) |
---|---|---|
AdminTools | C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools | - |
ApplicationData | C:\Users\username\AppData\Roaming | /home/username/.config |
CDBurning | C:\Users\username\AppData\Local\Microsoft\Windows\Burn\Burn1 | - |
CommonAdminTools | C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools | - |
CommonApplicationData | C:\ProgramData | /usr/share |
CommonDesktopDirectory | C:\Users\Public\Desktop | - |
CommonDocuments | C:\Users\Public\Documents | - |
CommonMusic | C:\Users\Public\Music | - |
CommonOemLinks | - | - |
CommonPictures | C:\Users\Public\Pictures | - |
CommonProgramFiles | C:\Program Files\Common Files | - |
CommonProgramFilesX86 | C:\Program Files (x86)\Common Files | - |
CommonPrograms | C:\ProgramData\Microsoft\Windows\Start Menu\Programs | - |
CommonStartMenu | C:\ProgramData\Microsoft\Windows\Start Menu | - |
CommonStartup | C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup | - |
CommonTemplates | C:\ProgramData\Microsoft\Windows\Templates | /usr/share/templates |
CommonVideos | C:\Users\Public\Videos | - |
Cookies | C:\Users\username\AppData\Roaming\Microsoft\Windows\Cookies | - |
Desktop | C:\Users\username\Desktop | /home/username/Desktop |
DesktopDirectory | C:\Users\username\Desktop | /home/username/Desktop |
Favorites | C:\Users\username\Favorites | - |
Fonts | C:\windows\Fonts | /home/username/.fonts |
History | C:\Users\username\AppData\Local\Microsoft\Windows\History | - |
InternetCache | C:\Users\username\AppData\Local\Microsoft\Windows\Temporary Internet Files | - |
LocalApplicationData | C:\Users\username\AppData\Local | /home/username/.local/share |
LocalizedResources | - | - |
MyComputer | - | - |
MyDocuments | C:\Users\username\Documents | /home/username |
MyMusic | C:\Users\username\Music | /home/username/Music |
MyPictures | C:\Users\username\Pictures | /home/username/Pictures |
MyVideos | C:\Users\username\Videos | /home/username/Videos |
NetworkShortcuts | C:\Users\username\AppData\Roaming\Microsoft\Windows\Network Shortcuts | - |
Personal | C:\Users\username\Documents | /home/username |
PrinterShortcuts | C:\Users\username\AppData\Roaming\Microsoft\Windows\Printer Shortcuts | - |
ProgramFiles | C:\Program Files | - |
ProgramFilesX86 | C:\Program Files (x86) | - |
Programs | C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs | - |
Recent | C:\Users\username\AppData\Roaming\Microsoft\Windows\Recent | - |
Resources | C:\windows\resources | - |
SendTo | C:\Users\username\AppData\Roaming\Microsoft\Windows\SendTo | - |
StartMenu | C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu | - |
Startup | C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup | - |
System | C:\windows\system32 | - |
SystemX86 | C:\windows\SysWOW64 | - |
Templates | C:\Users\username\AppData\Roaming\Microsoft\Windows\Templates | /home/username |
UserProfile | C:\Users\username | - |
Windows | C:\windows | - |
Environment.SpecialFolder | Windows 7 (.NET Framework 4) | Ubuntu 11.10 (Mono 2.10.8) |
ランタイムのディレクトリ
RuntimeEnvironment.GetRuntimeDirectoryメソッドを呼ぶことで現在動作しているランタイムが格納されているディレクトリを取得することが出来ます。
一時フォルダ
一時ディレクトリを取得する・一時ファイルを作成するで解説しています。
ファイルシステム
ファイルシステムの種類を調べる(Windows)で解説しています。
レジストリ情報
RegistryKeyクラスを使うことで、レジストリに保存されている情報を読み込むことが出来ます。 次の例では、HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0を開き、CPU名(ProcessorNameString)を読み込み、表示しています。
次の例では、HKEY_CURRENT_USERの下にある'MyApplication'というサブキーを開き、キー'foo'に設定されているデータを読み込んだ後、新しい値を上書きしています。
レジストリの読み取り・書き込みの実例についてはMIMEタイプの取得・判定や壁紙を変更するなどを参照してください。
時刻
現在日時
現在日時を取得するにはDateTime.Nowプロパティを参照します。 日付のみを取得したい場合は、DateTime.Todayプロパティが使えます。 DateTime.Todayは、日付の部分はDateTime.Nowと同じで、時刻は常に00:00:00となった値を返します。 Now, Todayともにローカルタイムゾーンでの値を返しますが、DateTime.UtcNowを使えばUTC(世界協定時)での現在時刻を取得できます。
また、DateTime型でなくDateTimeOffset型で取得したければ、DateTimeOffset.Now、DateTimeOffset.UtcNowを参照します。 だた、DateTimeOffset.Todayは用意されていないので、DateTimeOffset.Now.Dateとして現在時刻から日付のみを取得する必要があります。
DateTime・DateTimeOffsetについては日付・時刻の型と操作、タイムゾーンについては時刻の種類・UTCとの時差・タイムゾーン間の変換で解説しています。
稼働時間
Environment.TickCount
システムの稼働時間(uptime)を取得するには、Environment.TickCountプロパティを参照します。 このプロパティはシステムが起動してからの経過時間をミリ秒単位で返します。
TickCountは値がInt32.MaxValue(= 2147483647 = 約24.9日分)までカウントアップすると、次の値はInt32.MinValue(= -2147483648)に戻ってから再びカウントアップするという点に注意が必要です。 次の例では、TickCountの生の値と、生の値からTimeSpanに変換した値を表示しています。
TickCountが返す値の精度は500ミリ秒以上となる点にも注意が必要です。 TickCountと精度についてはSystem.Diagnostics.Stopwatchでも解説しています。
パフォーマンスカウンタ
Environment.TickCountとは別に、次の例のようにパフォーマンスカウンタを使って稼働時間を取得する方法もあります。 パフォーマンスカウンタを使った場合は、秒単位の値で取得できます。
パフォーマンスカウンタの使い方についてはパフォーマンス情報の計測を参照してください。
経過時間
経過時間を計測するには、二つの時点でのEnvironment.TickCountの差を取るなどの方法の他に、Stopwatchクラスを使う方法があります。 次のコードでは、Environment.TickCountとStopwatchを使ってある処理にかかる時間を計測する方法を例示しています。
Stopwatchの使い方や計測できる値の精度など、詳しくはSystem.Diagnostics.Stopwatchで解説しています。