2012-01-06T05:47:10の更新内容

programming/netfx/environment/0_platform/index.wiki.txt

current previous
1,1265 0,0
+
${smdncms:title,ランタイム・システム・プラットフォームの情報}
+
${smdncms:keywords,RuntimeEnvironment,ランタイム,システム,バージョン,OS,プロセッサ,エンディアン,固有,改行文字,区切り文字,稼働時間,uptime}
+
${smdncms:document_versions,codelang=cs,codelang=vb}
+

          
+
#navi(..)
+

          
+
#googleadunit(banner)
+

          
+
*ランタイム・システム・プラットフォームの情報 [#SystemAndPlatform]
+
**ランタイムバージョン [#SystemAndPlatform_RuntimeVersion]
+
&msdn(netfx,member,System.Environment.Version){Environment.Versionプロパティ};を参照することで、現在動作しているランタイム(.NET Framework、Mono等)のバージョンを取得することが出来ます。 バージョンは数値や文字列ではなく&msdn(netfx,type,System.Version){Versionクラス};として返されるため、メジャーバージョン番号・マイナーバージョン番号・ビルド番号等を個別に参照することも出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // ランタイムバージョンを取得・表示
+
    Console.WriteLine(Environment.Version);
+

          
+
    // ランタイムバージョンを取得
+
    Version v = Environment.Version;
+

          
+
    // メジャー・マイナー・ビルド・リビジョンの各バージョン番号を表示
+
    Console.WriteLine("{0}.{1}.{2}.{3}", v.Major, v.Minor, v.Build, v.Revision);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' ランタイムバージョンを取得・表示
+
    Console.WriteLine(Environment.Version)
+

          
+
    ' ランタイムバージョンを取得
+
    Dim v As Version = Environment.Version
+

          
+
    ' メジャー・マイナー・ビルド・リビジョンの各バージョン番号を表示
+
    Console.WriteLine("{0}.{1}.{2}.{3}", v.Major, v.Minor, v.Build, v.Revision)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(.NET Framework 4での実行結果){{
+
4.0.30319.239
+
4.0.30319.239
+
}}
+

          
+
#prompt(Mono 2.10.8での実行結果){{
+
4.0.30319.1
+
4.0.30319.1
+
}}
+

          
+
&msdn(netfx,member,System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion){RuntimeEnvironment.GetSystemVersionメソッド};を呼ぶことでもランタイムのバージョンを取得することが出来ます。 ただし、このメソッドの戻り値はVersionクラスではなく文字列となっています。 返されるバージョンは数字のみからなる形式でなくvから始まるものとなるようです(.NET Frameworkのディレクトリ名やバージョン表記で使われるものと同じ形式)。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Runtime.InteropServices;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // ランタイムバージョンを取得・表示
+
    Console.WriteLine(RuntimeEnvironment.GetSystemVersion());
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Runtime.InteropServices
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' ランタイムバージョンを取得・表示
+
    Console.WriteLine(RuntimeEnvironment.GetSystemVersion())
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(.NET Framework 4での実行結果){{
+
v4.0.30319
+
}}
+

          
+
#prompt(Mono 2.10.8での実行結果){{
+
v4.0.30319
+
}}
+

          
+
現在動作しているランタイムがMonoかどうか調べる方法は[[programming/mono/tips]]で解説しています。
+

          
+

          
+

          
+
**OSバージョン [#SystemAndPlatform_OSVersion]
+
&msdn(netfx,member,System.Environment.OSVersion){Environment.OSVersionプロパティ};を参照することで、現在動作しているOSのバージョンを取得することが出来ます。 このバージョンも数値や文字列ではなく&msdn(netfx,type,System.OperatingSystem){OperatingSystemクラス};として返されるため、バージョンの他にも適用されているサービスパック名、プラットフォームIDなども参照することも出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // OSバージョンを取得・表示
+
    Console.WriteLine(Environment.OSVersion);
+

          
+
    // OSバージョンを取得
+
    OperatingSystem os = Environment.OSVersion;
+

          
+
    Console.WriteLine(os.VersionString); // 文字列形式のバージョン名
+
    Console.WriteLine(os.Version);       // バージョン番号
+
    Console.WriteLine(os.ServicePack);   // サービスパック名
+
    Console.WriteLine(os.Platform);      // プラットフォームID
+

          
+
    if (os.Platform == PlatformID.Win32NT)
+
      Console.WriteLine("NT系OS");
+
    else if (os.Platform == PlatformID.Unix)
+
      Console.WriteLine("Unix系OS");
+
    else
+
      Console.WriteLine("その他のOS");
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' OSバージョンを取得・表示
+
    Console.WriteLine(Environment.OSVersion)
+

          
+
    ' OSバージョンを取得
+
    Dim os As OperatingSystem = Environment.OSVersion
+

          
+
    Console.WriteLine(os.VersionString) ' 文字列形式のバージョン名
+
    Console.WriteLine(os.Version)       ' バージョン番号
+
    Console.WriteLine(os.ServicePack)   ' サービスパック名
+
    Console.WriteLine(os.Platform)      ' プラットフォームID
+

          
+
    If os.Platform = PlatformID.Win32NT
+
      Console.WriteLine("NT系OS")
+
    Else If os.Platform = PlatformID.Unix
+
      Console.WriteLine("Unix系OS")
+
    Else
+
      Console.WriteLine("その他のOS")
+
    End If
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
Microsoft Windows NT 6.1.7601 Service Pack 1
+
Microsoft Windows NT 6.1.7601 Service Pack 1
+
6.1.7601.65536
+
Service Pack 1
+
Win32NT
+
NT系OS
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
Unix 3.0.0.14
+
Unix 3.0.0.14
+
3.0.0.14
+

          
+
Unix
+
Unix系OS
+
}}
+

          
+
&msdn(netfx,type,System.PlatformID){PlatformID};は、OSがNT系Windowsか、9x系Windowsか、Unix系かといった大きな分類を表すものです。 より細かいOSのバージョン(XP, Vista, 7, etc.)やエディション(Professional, Ultimate, etc.)等を知るには、VersionStringを解析するか、バージョン番号を詳しく見ていく必要があります。 また、古いバージョンのランタイムでは&msdn(netfx,member,System.PlatformID.MacOSX){PlatformID.MacOSX};や&msdn(netfx,member,System.PlatformID.Xbox){PlatformID.Xbox};などの値が定義されていない場合がある点にも注意が必要です。
+

          
+
なお、現在動作しているOSがUnix系(Linux, Mac OS, BSD等)であるかどうかを調べる方法は[[programming/mono/tips]]で解説しています。
+

          
+

          
+

          
+
**プロセッサ数・プロセッサ情報 [#SystemAndPlatform_Processors]
+
&msdn(netfx,member,System.Environment.ProcessorCount){Environment.ProcessrCountプロパティ};を参照することで、現在動作している環境のCPU数(プロセッサコア数)を取得することができます。 ドキュメントによると、.NET Frameworkの実装では環境変数NUMBER_OF_PROCESSORSの値を参照しているようです。
+

          
+
なお、NT系WindowsではPROCESSOR_ARCHITECTURE等の環境変数の値を取得することでプロセッサ情報を取得することが出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // プロセッサ数を取得・表示する
+
    Console.WriteLine("ProcessorCount: {0}", Environment.ProcessorCount);
+

          
+
    // 環境変数からプロセッサ情報を取得する
+
    Console.WriteLine("NUMBER_OF_PROCESSORS   = {0}", Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS"));
+
    Console.WriteLine("PROCESSOR_ARCHITECTURE = {0}", Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"));
+
    Console.WriteLine("PROCESSOR_IDENTIFIER   = {0}", Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER"));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' プロセッサ数を取得・表示する
+
    Console.WriteLine("ProcessorCount: {0}", Environment.ProcessorCount)
+

          
+
    ' 環境変数からプロセッサ情報を取得する
+
    Console.WriteLine("NUMBER_OF_PROCESSORS   = {0}", Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS"))
+
    Console.WriteLine("PROCESSOR_ARCHITECTURE = {0}", Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"))
+
    Console.WriteLine("PROCESSOR_IDENTIFIER   = {0}", Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER"))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果例){{
+
ProcessorCount: 2
+
NUMBER_OF_PROCESSORS   = 2
+
PROCESSOR_ARCHITECTURE = AMD64
+
PROCESSOR_IDENTIFIER   = AMD64 Family 15 Model 43 Stepping 1, AuthenticAMD
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果例){{
+
ProcessorCount: 2
+
NUMBER_OF_PROCESSORS   = 
+
PROCESSOR_ARCHITECTURE = 
+
PROCESSOR_IDENTIFIER   = 
+
}}
+

          
+
[[環境変数の取得について>programming/netfx/environment/1_process#ProcessAndAssembly_EnvironmentVariables]]は個別に詳しく解説しています。
+

          
+
CPUの使用率等の情報は[[パフォーマンスカウンタ>programming/netfx/performancecounter/0_counter]]で取得できます。 一方、クロック周波数など環境変数では取得できないようなハードウェア情報を取得するにはWMI(Windows Management Instrumentation, &msdn(netfx,ns,System.Management){System.Management名前空間};)を使用したり、[[レジストリに格納されている情報>#SystemAndPlatform_Win32Registry]]や/proc/cpuinfoなどを参照する必要があります。
+

          
+

          
+

          
+
**32ビット環境・64ビット環境 [#SystemAndPlatform_32Bit64Bit]
+
&msdn(netfx,member,System.Environment.Is64BitProcess){Environment.Is64BitProcessプロパティ};および&msdn(netfx,member,System.Environment.Is64BitOperatingSystem){Environment.Is64BitOperatingSystemプロパティ};を参照することで、実行環境が32ビットか64ビットかを判断も出来ます。 Is64BitProcessプロパティは自プロセスが64ビットで動作しているかどうか、Is64BitOperatingSystemは実行しているOSが64ビットで動作しているかどうかを返します。 なお、このプロパティはいずれも.NET Framework 4で追加されたものです。 それより前のバージョンでは使用できない点に注意が必要です。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在のプロセスが64ビットで動作しているかどうか
+
    if (Environment.Is64BitProcess)
+
      Console.WriteLine("64bit process");
+
    else
+
      Console.WriteLine("32bit process?");
+

          
+
    // 実行しているOSが64ビットかどうか
+
    if (Environment.Is64BitOperatingSystem)
+
      Console.WriteLine("64bit OS");
+
    else
+
      Console.WriteLine("32bit OS?");
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在のプロセスが64ビットで動作しているかどうか
+
    If Environment.Is64BitProcess Then
+
      Console.WriteLine("64bit process")
+
    Else
+
      Console.WriteLine("32bit process?")
+
    End If
+

          
+
    ' 実行しているOSが64ビットかどうか
+
    If Environment.Is64BitOperatingSystem
+
      Console.WriteLine("64bit OS")
+
    Else
+
      Console.WriteLine("32bit OS?")
+
    End If
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
実行環境が64ビットかどうかを調べるために&msdn(netfx,member,System.IntPtr.Size){IntPtr.Sizeプロパティ};を参照することも出来ます。 IntPtr.SizeプロパティはIntPtr(ポインタ)のバイト数を表す値を返し、プロセスが64ビットモードで動作している場合(64ビット版のランタイムが使われている場合)はSizeプロパティが8(バイト=64ビット)、32ビットの場合は4(バイト=32ビット)を返します。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // IntPtr.Sizeプロパティの値から動作しているプロセスが32ビットか64ビットかを調べる
+
    if (IntPtr.Size == 4)
+
      Console.WriteLine("32bit");
+
    else if (IntPtr.Size == 8)
+
      Console.WriteLine("64bit");
+
    else
+
      Console.WriteLine("?");
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' IntPtr.Sizeプロパティの値から動作しているプロセスが32ビットか64ビットかを調べる
+
    If IntPtr.Size = 4 Then
+
      Console.WriteLine("32bit")
+
    Else If IntPtr.Size = 8 Then
+
      Console.WriteLine("64bit")
+
    Else
+
      Console.WriteLine("?")
+
    End If
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
以下の結果は、上記のコードを64ビット版Windows上でコンパイル、動作させたものです。 コンパイルオプション(/platform)によって32ビット版・64ビット版のどちらのランタイムで動作させるか指定しています。
+

          
+
#prompt{{
+
E:\>csc /platform:x64 sample.cs && sample.exe
+
64bit
+

          
+
E:\>csc /platform:x86 sample.cs && sample.exe
+
32bit
+
}}
+

          
+

          
+

          
+
**エンディアン [#SystemAndPlatform_Endianness]
+
&msdn(netfx,member,System.BitConverter.IsLittleEndian){BitConverter.IsLittleEndianプロパティ};を参照することで、現在実行している環境がリトルエンディアンであるかどうかを調べることができます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // リトルエンディアンかどうかを調べる
+
    if (BitConverter.IsLittleEndian)
+
      Console.WriteLine("little endian");
+
    else
+
      Console.WriteLine("big endian?");
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' リトルエンディアンかどうかを調べる
+
    If BitConverter.IsLittleEndian Then
+
      Console.WriteLine("little endian")
+
    Else
+
      Console.WriteLine("big endian?")
+
    End If
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
この他、次の例のように、メモリ上に格納される値のレイアウトを見ることでエンディアンを調べることも出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // エンディアンを調べる
+
    unsafe {
+
      int i = 1;
+
      byte* b = (byte*)&i;
+

          
+
      if (b[0] == 1)
+
        Console.WriteLine("little endian");
+
      else if (b[3] == 1)
+
        Console.WriteLine("big endian");
+
      else
+
        Console.WriteLine("middle endian?");
+
    }
+
  }
+
}
+
}}
+

          
+
#code(cs,unsafeを使わない場合){{
+
using System;
+
using System.Runtime.InteropServices;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    IntPtr buffer = Marshal.AllocCoTaskMem(4);
+

          
+
    Marshal.WriteInt32(buffer, 0, 1);
+

          
+
    // エンディアンを調べる
+
    if (Marshal.ReadByte(buffer, 0) == 1)
+
      Console.WriteLine("little endian");
+
    else if (Marshal.ReadByte(buffer, 3) == 1)
+
      Console.WriteLine("big endian");
+
    else
+
      Console.WriteLine("middle endian?");
+

          
+
    Marshal.FreeCoTaskMem(buffer);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Runtime.InteropServices
+

          
+
Class Sample
+
  Shared Sub Main()
+
    Dim buffer As IntPtr = Marshal.AllocCoTaskMem(4)
+

          
+
    Marshal.WriteInt32(buffer, 0, 1)
+

          
+
    ' エンディアンを調べる
+
    If Marshal.ReadByte(buffer, 0) = 1
+
      Console.WriteLine("little endian")
+
    Else If Marshal.ReadByte(buffer, 3) = 1
+
      Console.WriteLine("big endian")
+
    Else
+
      Console.WriteLine("middle endian?")
+
    End If
+

          
+
    Marshal.FreeCoTaskMem(buffer)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
なお、バイトオーダーの変換には&msdn(netfx,member,System.Net.IPAddress.NetworkToHostOrder){IPAddress.NetworkToHostOrderメソッド};および&msdn(netfx,member,System.Net.IPAddress.HostToNetworkOrder){IPAddress.HostToNetworkOrderメソッド};が使えます。 詳しくは[[programming/netfx/conversion/0_basetype]]でも解説しています。
+

          
+

          
+

          
+
**改行文字 [#SystemAndPlatform_NewLine]
+
&msdn(netfx,member,System.Environment.NewLine){Environment.NewLineプロパティ};を参照することで、現在実行している環境での改行文字を取得することが出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 改行文字を取得
+
    string newline = Environment.NewLine;
+

          
+
    // 表示
+
    Console.WriteLine("Length = {0}", newline.Length);
+

          
+
    foreach (char c in newline) {
+
      Console.Write("{0:X2} ", (int)c);
+
    }
+
    Console.WriteLine();
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 改行文字を取得
+
    Dim newline As String = Environment.NewLine
+

          
+
    ' 表示
+
    Console.WriteLine("Length = {0}", newline.Length)
+

          
+
    For Each c As Char In newLine
+
      Console.Write("{0:X2} ", AscW(c))
+
    Next
+
    Console.WriteLine()
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
Length = 2
+
0D 0A 
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
Length = 1
+
0A 
+
}}
+

          
+
&msdn(netfx,member,System.Console.WriteLine){Console.WriteLineメソッド};、&msdn(netfx,member,System.IO.StreamWriter.WriteLine){StreamWriter.WriteLineメソッド};や&msdn(netfx,member,System.Text.StringBuilder.AppendLine){StringBuilder.AppendLineメソッド};では、末尾に追加される改行文字にEnvironment.NewLineと同じものが使用されます。
+

          
+
なお、&msdn(netfx,type,System.IO.StreamWriter){StreamWriter};では&msdn(netfx,member,System.IO.StreamWriter.NewLine){NewLineプロパティ};を設定することでEnvironment.NewLineとは異なる改行文字を使用することが出来ます。 &msdn(netfx,type,System.Text.StringBuilder){StringBuilder};にはそのようなプロパティは用意されていません。
+

          
+
&msdn(netfx,type,System.Console){Console};の場合は、Console.Out.NewLineに値を指定することで改行文字を変更することが出来ます。 次の例ではNewLineに"↵\n"を指定することで改行文字を変更しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 改行文字を変更
+
    Console.Out.NewLine = "↵\n";
+

          
+
    // 標準出力に文字列を表示
+
    Console.WriteLine("Hello, world!");
+
    Console.WriteLine("foo");
+
    Console.WriteLine("bar");
+
    Console.WriteLine("baz");
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 改行文字を変更
+
    Console.Out.NewLine = "↵" + vbLf
+

          
+
    ' 標準出力に文字列を表示
+
    Console.WriteLine("Hello, world!")
+
    Console.WriteLine("foo")
+
    Console.WriteLine("bar")
+
    Console.WriteLine("baz")
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
Hello, world!↵
+
foo↵
+
bar↵
+
baz↵
+
}}
+

          
+
なお、[[現在実行している環境でのデフォルトの文字コードについて>programming/netfx/environment/1_process#LocaleAndCulture_DefaultEncoding]]は別途解説しています。
+

          
+

          
+

          
+
**ファイル・ディレクトリの区切り文字・無効な文字 [#SystemAndPlatform_DirectorySeparatorChar]
+
&msdn(netfx,member,System.IO.Path.DirectorySeparatorChar){Path.DirectorySeparatorCharフィールド};を参照することで、ファイル・ディレクトリの区切り文字を取得できます。 Windowsでは区切り文字に ''\'' (バックスラッシュ)、MaxOSやUnix系OSなどでは ''/'' (スラッシュ)が使われますが、この区切り文字を取得できます。 ただ、&msdn(netfx,type,System.IO.Path){Pathクラス};のメソッドを使えば適切な区切り文字を使用した処理が行われるので、このフィールドの値を参照することはあまりありません。 例えばパスの連結には&msdn(netfx,member,System.IO.Path.Combine){Combineメソッド};、パスからディレクトリ・ファイル名の取得には&msdn(netfx,member,System.IO.Path.GetDirectoryName){GetDirectoryNameメソッド};と&msdn(netfx,member,System.IO.Path.GetFileName){GetFileNameメソッド};を使うことが出来るため、わざわざ区切り文字を使って文字列の分割・結合をする必要はありません。 また、これらのメソッドでは区切り文字に ''\'' と ''/'' が混在していても適切に動作します。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.IO;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // パス区切り文字を取得、表示
+
    Console.WriteLine(Path.DirectorySeparatorChar);
+

          
+
    string path1 = @"D:\test";
+
    string path2 = @"subdir/file.txt";
+

          
+
    // パスを連結
+
    string fullPath = Path.Combine(path1, path2);
+

          
+
    Console.WriteLine(fullPath);
+

          
+
    // 連結したパスから、ディレクトリ名・ファイル名・拡張子を取得して表示
+
    Console.WriteLine(Path.GetDirectoryName(fullPath));
+
    Console.WriteLine(Path.GetFileName(fullPath));
+
    Console.WriteLine(Path.GetExtension(fullPath));
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' パス区切り文字を取得、表示
+
    Console.WriteLine(Path.DirectorySeparatorChar)
+

          
+
    Dim path1 As String = "D:\test"
+
    Dim path2 As String = "subdir/file.txt"
+

          
+
    ' パスを連結
+
    Dim fullPath As String = Path.Combine(path1, path2)
+

          
+
    Console.WriteLine(fullPath)
+

          
+
    ' 連結したパスから、ディレクトリ名・ファイル名・拡張子を取得して表示
+
    Console.WriteLine(Path.GetDirectoryName(fullPath))
+
    Console.WriteLine(Path.GetFileName(fullPath))
+
    Console.WriteLine(Path.GetExtension(fullPath))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
\
+
D:\test\subdir/file.txt
+
D:\test\subdir
+
file.txt
+
.txt
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
/
+
D:\test/subdir/file.txt
+
D:\test/subdir
+
file.txt
+
.txt
+
}}
+

          
+
ファイル名に使えない文字、パスに使えない文字を取得するには、&msdn(netfx,member,System.IO.Path.GetInvalidFileNameChars){Path.GetInvalidFileNameCharsメソッド};もしくは&msdn(netfx,member,System.IO.Path.GetInvalidPathChars){Path.GetInvalidPathCharsメソッド};を呼び出します。 これらのメソッドは、使用不可能な文字をcharの配列で返します。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.IO;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // ファイル名に使えない文字を取得、表示
+
    Console.Write("InvalidFileNameChars: ");
+

          
+
    foreach (char c in Path.GetInvalidFileNameChars()) {
+
      if (char.IsControl(c)) // 制御文字かどうか
+
        Console.Write("'\\x{0:X2}', ", (int)c);
+
      else
+
        Console.Write("'{0}', ", c);
+
    }
+
    Console.WriteLine();
+

          
+
    // パス名に使えない文字を取得、表示
+
    Console.Write("InvalidPathChars: ");
+

          
+
    foreach (char c in Path.GetInvalidPathChars()) {
+
      if (char.IsControl(c))
+
        Console.Write("'\\x{0:X2}', ", (int)c);
+
      else
+
        Console.Write("'{0}' ", c);
+
    }
+
    Console.WriteLine();
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' ファイル名に使えない文字を取得、表示
+
    Console.Write("InvalidFileNameChars: ")
+

          
+
    For Each c As Char In Path.GetInvalidFileNameChars()
+
      If Char.IsControl(c) Then ' 制御文字かどうか
+
        Console.Write("'\x{0:X2}', ", AscW(c))
+
      Else
+
        Console.Write("'{0}', ", c)
+
      End If
+
    Next
+
    Console.WriteLine()
+

          
+
    ' パス名に使えない文字を取得、表示
+
    Console.Write("InvalidPathChars: ")
+

          
+
    For Each c As Char In Path.GetInvalidPathChars()
+
      If Char.IsControl(c) Then
+
        Console.Write("'\x{0:X2}', ", AscW(c))
+
      Else
+
        Console.Write("'{0}', ", c)
+
      End If
+
    Next
+
    Console.WriteLine()
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
InvalidFileNameChars: '"', '<', '>', '|', '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F', ':', '*', '?', '\', '/',
+
InvalidPathChars: '"' '<' '>' '|' '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F',
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
InvalidFileNameChars: '\x00', '/', 
+
InvalidPathChars: '\x00', 
+
}}
+

          
+

          
+

          
+
**特別なディレクトリ [#SystemAndPlatform_SpecialDirectory]
+
***ホームフォルダ・デスクトップ・システムディレクトリ等 [#SystemAndPlatform_SpecialDirectory_SpecialFolder]
+
&msdn(netfx,member,System.Environment.GetFolderPath){Environment.GetFolderPathメソッド};を使うことで、OSのバージョンやユーザ毎に異なるフォルダ・ディレクトリのパスを取得することが出来ます。 取得したいフォルダの種類は&msdn(netfx,member,System.Environment.SpecialFolder){Environment.SpecialFolder列挙体};で指定します。
+

          
+
また、&msdn(netfx,member,System.Environment.SystemDirectory){Environment.SystemDirectoryプロパティ};を参照することでシステムディレクトリを取得することも出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // ユーザの個人用フォルダ (マイ ドキュメント)
+
    Console.WriteLine("Personal:              {0}", Environment.GetFolderPath(Environment.SpecialFolder.Personal));
+
    // デスクトップ
+
    Console.WriteLine("Desktop:               {0}", Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
+
    // ユーザの個人用アプリケーションデータ
+
    Console.WriteLine("ApplicationData:       {0}", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
+
    // 全ユーザ共通のアプリケーションデータ
+
    Console.WriteLine("CommonApplicationData: {0}", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
+

          
+
    // システムディレクトリ
+
    Console.WriteLine("SystemDirectory:       {0}", Environment.SystemDirectory);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' ユーザの個人用フォルダ (マイ ドキュメント)
+
    Console.WriteLine("Personal:              {0}", Environment.GetFolderPath(Environment.SpecialFolder.Personal))
+
    ' デスクトップ
+
    Console.WriteLine("Desktop:               {0}", Environment.GetFolderPath(Environment.SpecialFolder.Desktop))
+
    ' ユーザの個人用アプリケーションデータ
+
    Console.WriteLine("ApplicationData:       {0}", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))
+
    ' 全ユーザ共通のアプリケーションデータ
+
    Console.WriteLine("CommonApplicationData: {0}", Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData))
+

          
+
    ' システムディレクトリ
+
    Console.WriteLine("SystemDirectory:       {0}", Environment.SystemDirectory)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果例){{
+
Personal:              C:\Users\smdn\Documents
+
Desktop:               C:\Users\smdn\Desktop
+
ApplicationData:       C:\Users\smdn\AppData\Roaming
+
CommonApplicationData: C:\ProgramData
+
SystemDirectory:       C:\windows\system32
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果例){{
+
Personal:              /home/smdn
+
Desktop:               /home/smdn/Desktop
+
ApplicationData:       /home/smdn/.config
+
CommonApplicationData: /usr/share
+
SystemDirectory: 
+
}}
+

          
+
これらのフォルダは環境によっては対応するものが無い場合もあります。 次の表は、Environment.SpecialFolder列挙体で指定できるフォルダの種類と、実際に取得されたパスの対応表です。 一つの参考としてご覧ください。 パス中に含まれるユーザ名の部分は ''&var{username};''、該当するフォルダが無い場合(GetFolderPathが空の文字列を返す場合)は ''-'' と表記しています。 フォルダの具体的な意味や役割と得られるパスについては&msdn(netfx,member,System.Environment.SpecialFolder){Environment.SpecialFolder列挙体のドキュメント};を参照してください。
+

          
+
|*Environment.SpecialFolderの値と対応するフォルダのパス
+
|~Environment.SpecialFolder|~Windows 7 (.NET Framework 4)|~Ubuntu 11.10 (Mono 2.10.8)|h
+
|AdminTools                    |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools|-|
+
|ApplicationData               |C:\Users\&var{username};\AppData\Roaming|/home/&var{username};/.config|
+
|CDBurning                     |C:\Users\&var{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\&var{username};\AppData\Roaming\Microsoft\Windows\Cookies|-|
+
|Desktop                       |C:\Users\&var{username};\Desktop|/home/&var{username};/Desktop|
+
|DesktopDirectory              |C:\Users\&var{username};\Desktop|/home/&var{username};/Desktop|
+
|Favorites                     |C:\Users\&var{username};\Favorites|-|
+
|Fonts                         |C:\windows\Fonts|/home/&var{username};/.fonts|
+
|History                       |C:\Users\&var{username};\AppData\Local\Microsoft\Windows\History|-|
+
|InternetCache                 |C:\Users\&var{username};\AppData\Local\Microsoft\Windows\Temporary Internet Files|-|
+
|LocalApplicationData          |C:\Users\&var{username};\AppData\Local|/home/&var{username};/.local/share|
+
|LocalizedResources            |-|-|
+
|MyComputer                    |-|-|
+
|MyDocuments                   |C:\Users\&var{username};\Documents|/home/&var{username};|
+
|MyMusic                       |C:\Users\&var{username};\Music|/home/&var{username};/Music|
+
|MyPictures                    |C:\Users\&var{username};\Pictures|/home/&var{username};/Pictures|
+
|MyVideos                      |C:\Users\&var{username};\Videos|/home/&var{username};/Videos|
+
|NetworkShortcuts              |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\Network Shortcuts|-|
+
|Personal                      |C:\Users\&var{username};\Documents|/home/&var{username};|
+
|PrinterShortcuts              |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\Printer Shortcuts|-|
+
|ProgramFiles                  |C:\Program Files|-|
+
|ProgramFilesX86               |C:\Program Files (x86)|-|
+
|Programs                      |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\Start Menu\Programs|-|
+
|Recent                        |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\Recent|-|
+
|Resources                     |C:\windows\resources|-|
+
|SendTo                        |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\SendTo|-|
+
|StartMenu                     |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\Start Menu|-|
+
|Startup                       |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup|-|
+
|System                        |C:\windows\system32|-|
+
|SystemX86                     |C:\windows\SysWOW64|-|
+
|Templates                     |C:\Users\&var{username};\AppData\Roaming\Microsoft\Windows\Templates|/home/&var{username};|
+
|UserProfile                   |C:\Users\&var{username};|-|
+
|Windows                       |C:\windows|-|
+
|~Environment.SpecialFolder|~Windows 7 (.NET Framework 4)|~Ubuntu 11.10 (Mono 2.10.8)|f
+

          
+
#code(cs,取得に使ったコード){{
+
using System;
+
using System.Linq;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    var typeOfSF = typeof(Environment.SpecialFolder);
+

          
+
    foreach (var name in Enum.GetNames(typeOfSF).OrderBy(n => n)) {
+
      var sf = (Environment.SpecialFolder)Enum.Parse(typeOfSF, name);
+
      var path = Environment.GetFolderPath(sf);
+

          
+
      Console.WriteLine("|{0,-30}|{1}|", name, path.Length == 0 ? "-" : path);
+
    }
+
  }
+
}
+
}}
+

          
+
***ランタイムのディレクトリ [#SystemAndPlatform_SpecialDirectory_Runtime]
+
&msdn(netfx,member,System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory){RuntimeEnvironment.GetRuntimeDirectoryメソッド};を呼ぶことで現在動作しているランタイムが格納されているディレクトリを取得することが出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Runtime.InteropServices;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // ランタイムが格納されているディレクトリを取得・表示
+
    Console.WriteLine(RuntimeEnvironment.GetRuntimeDirectory());
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Runtime.InteropServices
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' ランタイムが格納されているディレクトリを取得・表示
+
    Console.WriteLine(RuntimeEnvironment.GetRuntimeDirectory())
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.5での実行結果){{
+
/usr/lib/mono/4.0
+
}}
+

          
+

          
+

          
+
***一時フォルダ [#SystemAndPlatform_SpecialDirectory_Temporary]
+
[[programming/tips/create_temporary_file]]で解説しています。
+

          
+

          
+

          
+
**ファイルシステム [#SystemAndPlatform_FileSystem]
+
[[programming/tips/getfilesystem]]で解説しています。
+

          
+

          
+

          
+
**レジストリ情報 [#SystemAndPlatform_Win32Registry]
+
&msdn(netfx,type,Microsoft.Win32.RegistryKey){RegistryKeyクラス};を使うことで、レジストリに保存されている情報を読み込むことが出来ます。 次の例では、HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0を開き、CPU名(ProcessorNameString)を読み込み、表示しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using Microsoft.Win32;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0を開く
+
    using (RegistryKey cpu = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0")) {
+
      // キー'ProcessorNameString'に設定されている値を読み込み、表示する
+
      Console.WriteLine(cpu.GetValue("ProcessorNameString"));
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports Microsoft.Win32
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0を開く
+
    Using cpu As RegistryKey = Registry.LocalMachine.OpenSubKey("HARDWARE\DESCRIPTION\System\CentralProcessor\0", True)
+
      ' キー'ProcessorNameString'に設定されている値を読み込み、表示する
+
      Console.WriteLine(cpu.GetValue("ProcessorNameString"))
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果例){{
+
AMD Athlon(tm) 64 X2 Dual Core Processor 4200+
+
}}
+

          
+
次の例では、HKEY_CURRENT_USERの下にある'MyApplication'というサブキーを開き、キー'foo'に設定されているデータを読み込んだ後、新しい値を上書きしています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using Microsoft.Win32;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // HKEY_CURRENT_USER\MyApplicationを書き込み可能な状態で開く
+
    using (RegistryKey myapp = Registry.CurrentUser.OpenSubKey("MyApplication", true)) {
+
      // キー'foo'に設定されている値を読み込み、表示する
+
      Console.WriteLine(myapp.GetValue("foo"));
+

          
+
      // キー'foo'に値"bar"を設定する
+
      myapp.SetValue("foo", "bar");
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports Microsoft.Win32
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' HKEY_CURRENT_USER\MyApplicationを書き込み可能な状態で開く
+
    Using myapp As RegistryKey = Registry.CurrentUser.OpenSubKey("MyApplication", True)
+
      ' キー'foo'に設定されている値を読み込み、表示する
+
      Console.WriteLine(myapp.GetValue("foo"))
+

          
+
      ' キー'foo'に値"bar"を設定する
+
      myapp.SetValue("foo", "bar")
+
    End Using
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
レジストリの読み取り・書き込みの実例については[[programming/tips/findmimetype]]や[[programming/tips/setdeskwallpaper]]などを参照してください。
+

          
+

          
+

          
+
*時刻 [#SystemTime]
+
**現在日時 [#SystemTime_DateAndTime]
+
現在日時を取得するには&msdn(netfx,member,System.DateTime.Now){DateTime.Nowプロパティ};を参照します。 日付のみを取得したい場合は、&msdn(netfx,member,System.DateTime.Today){DateTime.Todayプロパティ};が使えます。 DateTime.Todayは、日付の部分はDateTime.Nowと同じで、時刻は常に00:00:00となった値を返します。 Now, Todayともにローカルタイムゾーンでの値を返しますが、&msdn(netfx,member,System.DateTime.UtcNow){DateTime.UtcNow};を使えばUTC(世界協定時)での現在時刻を取得できます。
+

          
+
また、DateTime型でなくDateTimeOffset型で取得したければ、&msdn(netfx,member,System.DateTimeOffset.Now){DateTimeOffset.Now};、&msdn(netfx,member,System.DateTimeOffset.UtcNow){DateTimeOffset.UtcNow};を参照します。 だた、DateTimeOffset.Todayは用意されていないので、DateTimeOffset.Now.Dateとして現在時刻から日付のみを取得する必要があります。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在時刻 (DateTime)
+
    Console.WriteLine("DateTime.Now = {0}", DateTime.Now); // 現在の日時
+
    Console.WriteLine("DateTime.Now = {0}-{1}-{2}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); // 現在の年・月・日
+
    Console.WriteLine("DateTime.Today = {0}", DateTime.Today); // 現在の日付
+
    Console.WriteLine("DateTime.UtcNow = {0}", DateTime.UtcNow); // UTCでの現在の日時
+
    Console.WriteLine();
+

          
+
    // 現在時刻 (DateTimeOffset)
+
    Console.WriteLine("DateTimeOffset.Now = {0}", DateTimeOffset.Now); // 現在の日時
+
    Console.WriteLine("DateTimeOffset.Now = {0}-{1}-{2}", DateTimeOffset.Now.Year, DateTimeOffset.Now.Month, DateTimeOffset.Now.Day); // 現在の年・月・日
+
    Console.WriteLine("DateTimeOffset.Now.Date = {0}", DateTimeOffset.Now.Date); // 現在の日付
+
    Console.WriteLine("DateTimeOffset.UtcNow = {0}", DateTimeOffset.UtcNow); // UTCでの現在の日時
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在時刻 (DateTime)
+
    Console.WriteLine("DateTime.Now = {0}", DateTime.Now) ' 現在の日時
+
    Console.WriteLine("DateTime.Now = {0}-{1}-{2}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day) ' 現在の年・月・日
+
    Console.WriteLine("DateTime.Today = {0}", DateTime.Today) ' 現在の日付
+
    Console.WriteLine("DateTime.UtcNow = {0}", DateTime.UtcNow) ' UTCでの現在の日時
+
    Console.WriteLine()
+

          
+
    ' 現在時刻 (DateTimeOffset)
+
    Console.WriteLine("DateTimeOffset.Now = {0}", DateTimeOffset.Now) ' 現在の日時
+
    Console.WriteLine("DateTimeOffset.Now = {0}-{1}-{2}", DateTimeOffset.Now.Year, DateTimeOffset.Now.Month, DateTimeOffset.Now.Day) ' 現在の年・月・日
+
    Console.WriteLine("DateTimeOffset.Now.Date = {0}", DateTimeOffset.Now.Date) ' 現在の日付
+
    Console.WriteLine("DateTimeOffset.UtcNow = {0}", DateTimeOffset.UtcNow) ' UTCでの現在の日時
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果例){{
+
DateTime.Now = 2012/01/06 4:49:01
+
DateTime.Now = 2012-1-6
+
DateTime.Today = 2012/01/06 0:00:00
+
DateTime.UtcNow = 2012/01/05 19:49:01
+

          
+
DateTimeOffset.Now = 2012/01/06 4:49:01 +09:00
+
DateTimeOffset.Now = 2012-1-6
+
DateTimeOffset.Now.Date = 2012/01/06 0:00:00
+
DateTimeOffset.UtcNow = 2012/01/05 19:49:01 +00:00
+
}}
+

          
+
**稼働時間 [#SystemTime_Uptime]
+
***Environment.TickCount [#SystemTime_Uptime_EnvironmentTickCount]
+
システムの稼働時間(uptime)を取得するには、&msdn(netfx,member,System.Environment.TickCount){Environment.TickCount};プロパティを参照します。 このプロパティはシステムが起動してからの経過時間をミリ秒単位で返します。
+

          
+
TickCountは値がInt32.MaxValue(= 2147483647 = 約24.9日分)までカウントアップすると、次の値はInt32.MinValue(= -2147483648)に戻ってから再びカウントアップするという点に注意が必要です。 次の例では、TickCountの生の値と、生の値からTimeSpanに変換した値を表示しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 稼働時間を取得・表示する
+
    Console.WriteLine(Environment.TickCount);
+

          
+
    // 稼働時間を取得し、TimeSpanに変換する
+
    int tick = Environment.TickCount;
+
    TimeSpan uptime;
+

          
+
    if (0 <= tick)
+
      // TickCountが0~Int32.MaxValueまでの場合
+
      uptime = TimeSpan.FromMilliseconds((double)tick);
+
    else
+
      // TickCountがInt32.MinValue~-1までの場合
+
      uptime = TimeSpan.FromMilliseconds((double)(int.MinValue + tick) + (double)int.MaxValue);
+

          
+
    Console.WriteLine("{0} days, {1}:{2}:{3}", uptime.Days, uptime.Hours, uptime.Minutes, uptime.Seconds);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 稼働時間を取得・表示する
+
    Console.WriteLine(Environment.TickCount)
+

          
+
    ' 稼働時間を取得し、TimeSpanに変換する
+
    Dim tick As Integer = Environment.TickCount
+
    Dim uptime As TimeSpan
+

          
+
    If 0 <= tick Then
+
      ' TickCountが0~Int32.MaxValueまでの場合
+
      uptime = TimeSpan.FromMilliseconds(CDbl(tick))
+
    Else
+
      ' TickCountがInt32.MinValue~-1までの場合
+
      uptime = TimeSpan.FromMilliseconds(CDbl(Integer.MinValue + tick) + CDbl(Integer.MaxValue))
+
    End If
+

          
+
    Console.WriteLine("{0} days, {1}:{2}:{3}", uptime.Days, uptime.Hours, uptime.Minutes, uptime.Seconds)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果例){{
+
708073440
+
8 days, 4:41:13
+
}}
+

          
+
なお、TickCountが返す値の精度は500ミリ秒以上となる点にも注意が必要です。 TickCountと精度については[[programming/netfx/fcl/System.Diagnostics.Stopwatch]]でも解説しています。
+

          
+
***パフォーマンスカウンタ [#SystemTime_Uptime_PerformanceCounter]
+
Environment.TickCountとは別に、次の例のように[[パフォーマンスカウンタ>programming/netfx/performancecounter]]を使って稼働時間を取得する方法もあります。 パフォーマンスカウンタを使った場合は、秒単位の値で取得できます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Diagnostics;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // System/System Up Timeを計測するパフォーマンスカウンタを作成
+
    PerformanceCounter pc = new PerformanceCounter("System", "System Up Time");
+

          
+
    pc.NextValue(); // 最初の呼び出しでは常に0が返されるので値を破棄
+

          
+
    // 稼働時間(秒単位)を取得
+
    float tick = pc.NextValue();
+

          
+
    Console.WriteLine(tick);
+

          
+
    // 取得した稼働時間をTimeSpanに変換
+
    TimeSpan uptime = TimeSpan.FromSeconds(tick);
+

          
+
    Console.WriteLine("{0} days, {1}:{2}:{3}", uptime.Days, uptime.Hours, uptime.Minutes, uptime.Seconds);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Diagnostics
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' System/System Up Timeを計測するパフォーマンスカウンタを作成
+
    Dim pc As New PerformanceCounter("System", "System Up Time")
+

          
+
    pc.NextValue() ' 最初の呼び出しでは常に0が返されるので値を破棄
+

          
+
    ' 稼働時間(秒単位)を取得
+
    Dim tick As Single = pc.NextValue()
+

          
+
    Console.WriteLine(tick)
+

          
+
    ' 取得した稼働時間をTimeSpanに変換
+
    Dim uptime As TimeSpan = TimeSpan.FromSeconds(tick)
+

          
+
    Console.WriteLine("{0} days, {1}:{2}:{3}", uptime.Days, uptime.Hours, uptime.Minutes, uptime.Seconds)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果例){{
+
1425.846
+
0 days, 0:23:45
+
}}
+

          
+
パフォーマンスカウンタの使い方については[[programming/netfx/performancecounter/0_counter]]を参照してください。
+

          
+
**経過時間 [#SystemTime_ElapsedTime]
+
経過時間を計測するには、二つの時点でのEnvironment.TickCountの差を取るなどの方法の他に、&msdn(netfx,type,System.Diagnostics.Stopwatch){Stopwatchクラス};を使う方法があります。 次のコードでは、Environment.TickCountとStopwatchを使ってある処理にかかる時間を計測する方法を例示しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Diagnostics;
+
using System.Threading;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 開始時点のタイマ刻みを保持
+
    int tickStart = Environment.TickCount;
+

          
+
    // 経過時間を計測したい処理を実行 (ここでは時間がかかる処理の代わりとしてThread.Sleepを使う)
+
    Thread.Sleep(1000);
+

          
+
    // 終了時点のタイマ刻みを保持
+
    int tickEnd = Environment.TickCount;
+

          
+
    // 計測した経過時間を表示
+
    Console.WriteLine("TickCount : {0}", TimeSpan.FromMilliseconds(tickEnd - tickStart));
+

          
+

          
+

          
+
    // Stopwatchを作成すると同時に、経過時間の計測を開始
+
    Stopwatch sw = Stopwatch.StartNew();
+

          
+
    // 経過時間を計測したい処理を実行 (同上)
+
    Thread.Sleep(1000);
+

          
+
    // 経過時間の計測を止める
+
    sw.Stop();
+

          
+
    // 計測した経過時間を表示
+
    Console.WriteLine("Stopwatch : {0}", sw.Elapsed);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Diagnostics
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 開始時点のタイマ刻みを保持
+
    Dim tickStart As Integer = Environment.TickCount
+

          
+
    ' 経過時間を計測したい処理を実行 (ここでは時間がかかる処理の代わりとしてThread.Sleepを使う)
+
    Thread.Sleep(1000)
+

          
+
    ' 終了時点のタイマ刻みを保持
+
    Dim tickEnd As Integer = Environment.TickCount
+

          
+
    ' 計測した経過時間を表示
+
    Console.WriteLine("TickCount : {0}", TimeSpan.FromMilliseconds(tickEnd - tickStart))
+

          
+

          
+

          
+
    ' Stopwatchを作成すると同時に、経過時間の計測を開始
+
    Dim sw As Stopwatch = Stopwatch.StartNew()
+

          
+
    ' 経過時間を計測したい処理を実行 (同上)
+
    Thread.Sleep(1000)
+

          
+
    ' 経過時間の計測を止める
+
    sw.Stop()
+

          
+
    ' 計測した経過時間を表示
+
    Console.WriteLine("Stopwatch : {0}", sw.Elapsed)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果例){{
+
TickCount : 00:00:01
+
Stopwatch : 00:00:01.0002382
+
}}
+

          
+
Stopwatchの使い方や計測できる値の精度など、詳しくは[[programming/netfx/fcl/System.Diagnostics.Stopwatch]]で解説しています。
+

          
+

          
+

          
+
#navi(..)
+

          

programming/netfx/environment/index.wiki.txt

current previous
1,13 0,0
+
${smdncms:title,環境情報の取得}
+
${smdncms:header_title,環境情報の取得 (System.Environment)}
+
${smdncms:keywords,System.Environment,実行環境,プラットフォーム}
+

          
+
ここでは実行時に実行環境やランタイム・システム・自プロセスの情報などを取得する方法について、&msdn(netfx,type,System.Environment){System.Environmentクラス};を中心に解説していきます。 アプリケーションを様々なプラットフォームで動作させる場合に必要となってくるような部分に主軸を置いています。 一部MonoやWindows以外のOSについても触れていますが、結果の違いに特筆すべき点がなければ結果を明記していない箇所もあります。
+

          
+
#googleadunit(banner)
+

          
+
-ページ一覧
+
#ls2_1(noroot,pathsort)
+

          
+

          
+

          

programming/netfx/environment/1_process/index.wiki.txt

current previous
1,970 0,0
+
${smdncms:title,プロセス・アセンブリの情報}
+
${smdncms:keywords,プロセス,自プロセス,アセンブリ,環境変数,コマンドライン引数}
+
${smdncms:document_versions,codelang=cs,codelang=vb}
+

          
+
#navi(..)
+

          
+
#googleadunit(banner)
+

          
+
*自プロセス・アセンブリの情報 [#ProcessAndAssembly]
+
**カレントディレクトリ [#ProcessAndAssembly_CurrentDirectory]
+
プロセスの現在のカレントディレクトリ(作業フォルダ)を取得するには、&msdn(netfx,member,System.Environment.CurrentDirectory){Environment.CurrentDirectoryプロパティ};を参照するか&msdn(netfx,member,System.IO.Directory.GetCurrentDirectory){Directory.GetCurrentDirectoryメソッド};を呼び出します。 両者の違いはプロパティかメソッドかという点のみで、取得できる結果は同じです。
+

          
+
また、カレントディレクトリを設定するには、&msdn(netfx,member,System.Environment.CurrentDirectory){Environment.CurrentDirectoryプロパティ};に新しい値を設定するか、&msdn(netfx,member,System.IO.Directory.GetCurrentDirectory){Directory.SetCurrentDirectoryメソッド};を使って設定します。 なお、存在しないディレクトリをカレントディレクトリにしようとした場合、&msdn(netfx,type,System.IO.DirectoryNotFoundException){DirectoryNotFoundException};がスローされる点に注意が必要です。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.IO;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // カレントディレクトリを取得・表示
+
    Console.WriteLine(Environment.CurrentDirectory);
+
    Console.WriteLine(Directory.GetCurrentDirectory());
+
    Console.WriteLine();
+

          
+

          
+

          
+
    // 新しいカレントディレクトリのパスを作成
+
    string currdir = Environment.CurrentDirectory;
+
    string workdir = Path.Combine(currdir, "workdir");
+

          
+
    // ディレクトリを作成
+
    Directory.CreateDirectory(workdir);
+

          
+
    // カレントディレクトリを作成したディレクトリに変更
+
    Environment.CurrentDirectory = workdir;
+

          
+
    // 変更後のカレントディレクトリを取得・表示
+
    Console.WriteLine(Directory.GetCurrentDirectory());
+

          
+
    // カレントディレクトリを元に戻す
+
    Directory.SetCurrentDirectory(currdir);
+

          
+
    // 作成したディレクトリを削除
+
    Directory.Delete(workdir);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' カレントディレクトリを取得・表示
+
    Console.WriteLine(Environment.CurrentDirectory)
+
    Console.WriteLine(Directory.GetCurrentDirectory())
+
    Console.WriteLine()
+

          
+

          
+

          
+
    ' 新しいカレントディレクトリのパスを作成
+
    Dim currdir As String = Environment.CurrentDirectory
+
    Dim workdir As String = Path.Combine(currdir, "workdir")
+

          
+
    ' ディレクトリを作成
+
    Directory.CreateDirectory(workdir)
+

          
+
    ' カレントディレクトリを作成したディレクトリに変更
+
    Environment.CurrentDirectory = workdir
+

          
+
    ' 変更後のカレントディレクトリを取得・表示
+
    Console.WriteLine(Directory.GetCurrentDirectory())
+

          
+
    ' カレントディレクトリを元に戻す
+
    Directory.SetCurrentDirectory(currdir)
+

          
+
    ' 作成したディレクトリを削除
+
    Directory.Delete(workdir)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
E:\
+
E:\
+

          
+
E:\workdir
+
}}
+

          
+

          
+

          
+
**環境変数 [#ProcessAndAssembly_EnvironmentVariables]
+
&msdn(netfx,member,System.Environment.GetEnvironmentVariable){Environment.GetEnvironmentVariableメソッド};を使うことで現在のプロセスの環境変数を取得することができます。 このメソッドは、指定された名前の環境変数が設定されていればその値を、設定されていない場合はnull/Nothingを返します。 このメソッドに指定する環境変数の名前は、大文字小文字の違いが無視されます。
+

          
+
また、&msdn(netfx,member,System.Environment.GetEnvironmentVariables){Environment.GetEnvironmentVariablesメソッド};を使うと、現在のプロセスの環境変数すべてを取得できます。 このメソッドは環境変数の名前をエントリのキー、環境変数の値をエントリの値とするペアの[[IDictionary (ディクショナリ)>programming/netfx/collections/0_abstract]]を返します。 なお、GetEnvironmentVariablesメソッドが返すIDictionaryは大文字小文字の違いをチェックするため、大文字小文字を正しく指定しないと環境変数を取得できません。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Collections;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 環境変数 'PATH' を取得・表示
+
    Console.WriteLine("PATH={0}", Environment.GetEnvironmentVariable("PATH"));
+
    Console.WriteLine();
+

          
+
    // すべての環境変数を取得
+
    IDictionary envvars = Environment.GetEnvironmentVariables();
+

          
+
    // 環境変数 'PATH' を取得・表示
+
    Console.WriteLine("Path={0}", envvars["Path"]);
+
    Console.WriteLine("PATH={0}", envvars["PATH"]);
+
    Console.WriteLine();
+

          
+
    // すべての環境変数を列挙して表示
+
    foreach (DictionaryEntry entry in envvars) {
+
      Console.WriteLine("{0}=>{1}", entry.Key, entry.Value);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Collections
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 環境変数 'PATH' を取得・表示
+
    Console.WriteLine("PATH={0}", Environment.GetEnvironmentVariable("PATH"))
+
    Console.WriteLine()
+

          
+
    ' すべての環境変数を取得
+
    Dim envvars As IDictionary = Environment.GetEnvironmentVariables()
+

          
+
    ' 環境変数 'PATH' を取得・表示
+
    Console.WriteLine("Path={0}", envvars("Path"))
+
    Console.WriteLine("PATH={0}", envvars["PATH"])
+
    Console.WriteLine()
+

          
+
    ' すべての環境変数を列挙して表示
+
    For Each entry As DictionaryEntry In envvars
+
      Console.WriteLine("{0}=>{1}", entry.Key, entry.Value)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+

          
+
PATH=C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
+

          
+
Path=C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
+
PATH=
+

          
+
COMPUTERNAME=>LUNAR
+
HOMEPATH=>\Users\smdn
+
LOCALAPPDATA=>C:\Users\smdn\AppData\Local
+
  :
+
  :
+
(以下略)
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
PATH=/opt/mono/2.10/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+

          
+
Path=
+
PATH=/opt/mono/2.10/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+

          
+
XDG_SESSION_PATH=>/org/freedesktop/DisplayManager/Session9
+
GPG_AGENT_INFO=>/tmp/keyring-Y7jsf5/gpg:0:1
+
XDG_DATA_DIRS=>/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
+
  :
+
  :
+
(以下略)
+
}}
+

          
+
Environment.GetEnvironmentVariablesメソッドの結果を使いつつ環境変数名の大文字小文字の違いを無視するようにするには、次の例のようにStringComparer.OrdinalIgnoreCaseを使ってキーの大文字小文字を無視するようなDictionaryと作成し、そこにコピーしてから環境変数を参照する方法が挙げられます。 StringComparerについて詳しくは[[programming/netfx/string/2_2_compareoptions]]で解説しています。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Collections;
+
using System.Collections.Generic;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 大文字小文字の違いを無視するDictionaryを作成
+
    Dictionary<string, string> envvars = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+

          
+
    // 環境変数を取得してDictionaryにコピー
+
    foreach (DictionaryEntry entry in Environment.GetEnvironmentVariables()) {
+
      envvars.Add((string)entry.Key, (string)entry.Value);
+
    }
+

          
+
    // 環境変数をコピーしたDictionaryを使って参照
+
    Console.WriteLine("Path={0}", envvars["Path"]);
+
    Console.WriteLine("PATH={0}", envvars["PATH"]);
+
    Console.WriteLine("path={0}", envvars["path"]);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Collections
+
Imports System.Collections.Generic
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 大文字小文字の違いを無視するDictionaryを作成
+
    Dim envvars As New Dictionary(Of String, String)(StringComparer.OrdinalIgnoreCase)
+

          
+
    ' 環境変数を取得してDictionaryにコピー
+
    For Each entry As DictionaryEntry In Environment.GetEnvironmentVariables()
+
      envvars.Add(DirectCast(entry.Key, String), DirectCast(entry.Value, String))
+
    Next
+

          
+
    ' 環境変数をコピーしたDictionaryを使って参照
+
    Console.WriteLine("Path={0}", envvars("Path"))
+
    Console.WriteLine("PATH={0}", envvars("PATH"))
+
    Console.WriteLine("path={0}", envvars("path"))
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
Path=C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
+
PATH=C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
+
path=C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
Path=/opt/mono/2.10/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+
PATH=/opt/mono/2.10/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+
path=/opt/mono/2.10/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+
}}
+

          
+
環境変数PATHには複数のパスが含まれる場合がほとんどで、またその区切り文字も環境によって異なりますが、&msdn(netfx,member,System.IO.Path.PathSeparator){Path.PathSeparatorフィールド};を参照することで区切り文字を取得でき、これを用いてパスを分割することができます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.IO;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 環境変数 'PATH' を取得
+
    string paths = Environment.GetEnvironmentVariable("PATH");
+

          
+
    Console.WriteLine(paths);
+
    Console.WriteLine("Path.PathSeparator = '{0}'", Path.PathSeparator);
+
    Console.WriteLine();
+

          
+
    // 分割して表示
+
    foreach (string path in paths.Split(Path.PathSeparator)) {
+
      Console.WriteLine(path);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 環境変数 'PATH' を取得
+
    Dim paths As String = Environment.GetEnvironmentVariable("PATH")
+

          
+
    Console.WriteLine(paths)
+
    Console.WriteLine("Path.PathSeparator = '{0}'", Path.PathSeparator)
+
    Console.WriteLine()
+

          
+
    ' 分割して表示
+
    For Each path As String In paths.Split(Path.PathSeparator)
+
      Console.WriteLine(path)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
+
Path.PathSeparator = ';'
+

          
+
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
+
C:\windows\system32
+
C:\windows
+
C:\windows\System32\Wbem
+
C:\windows\System32\WindowsPowerShell\v1.0\
+
C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\
+
C:\Program Files\TortoiseSVN\bin
+
C:\Program Files (x86)\GtkSharp\2.12\bin
+
C:\Program Files (x86)\QuickTime\QTSystem\
+
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
/opt/mono/2.10/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+
Path.PathSeparator = ':'
+

          
+
/opt/mono/2.10/bin
+
/usr/lib/lightdm/lightdm
+
/usr/local/sbin
+
/usr/local/bin
+
/usr/sbin
+
/usr/bin
+
/sbin
+
/bin
+
/usr/games
+
}}
+

          
+
なお、環境変数の変更・追加・削除には&msdn(netfx,member,System.Environment.SetEnvironmentVariable){Environment.SetEnvironmentVariableメソッド};を使うことが出来ます。
+

          
+

          
+

          
+
**現在実行中のアセンブリ [#ProcessAndAssembly_ExecutingAssembly]
+
&msdn(netfx,member,System.Reflection.Assembly.GetExecutingAssembly){Assembly.GetExecutingAssemblyメソッド};を使うことで現在実行しているコードのあるアセンブリを取得することが出来ます。 ここからさらに、アセンブリの情報について調べることが出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Reflection;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在実行しているアセンブリを取得する
+
    Assembly assm = Assembly.GetExecutingAssembly();
+

          
+
    Console.WriteLine(assm.FullName); // アセンブリの表示名
+
    Console.WriteLine(assm.CodeBase); // アセンブリの場所(パス)
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Reflection
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在実行しているアセンブリを取得する
+
    Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()
+

          
+
    Console.WriteLine(assm.FullName) ' アセンブリの表示名
+
    Console.WriteLine(assm.CodeBase) ' アセンブリの場所(パス)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(.NET Frameworkでの実行結果){{
+
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+
file:///E:/sample.exe
+
}}
+

          
+
#prompt(Monoでの実行結果){{
+
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+
file:///home/smdn/sample.exe
+
}}
+

          
+
この他にも、&msdn(netfx,member,System.Reflection.Assembly.GetEntryAssembly){Assembly.GetEntryAssemblyメソッド};でエントリーポイント(Mainメソッド)を含むアセンブリ、&msdn(netfx,member,System.Reflection.Assembly.GetCallingAssembly){Assembly.GetCallingAssemblyメソッド};で現在実行中のメソッドを呼び出したアセンブリを取得することが出来ます。
+

          
+

          
+

          
+
**ターゲットのランタイムバージョン [#ProcessAndAssembly_ImageRuntimeVersion]
+
アセンブリをビルドしたときのランタイムバージョンを取得するには、&msdn(netfx,member,System.Reflection.Assembly.ImageRuntimeVersion){Assembly.ImageRuntimeVersionプロパティ};を参照します。 このプロパティで取得できるバージョンは文字列で、形式は[[RuntimeEnvironment.GetSystemVersionメソッドの戻り値>programming/netfx/environment/0_platform#SystemAndPlatform_RuntimeVersion]]と同様です。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Reflection;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在実行しているアセンブリを取得する
+
    Assembly assm = Assembly.GetExecutingAssembly();
+

          
+
    // アセンブリのターゲットとなるランタイムバージョンを取得・表示する
+
    Console.WriteLine(assm.ImageRuntimeVersion);
+

          
+
    // 現在動作しているランタイムのバージョンを取得・表示する
+
    Console.WriteLine(Environment.Version);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Reflection
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在実行しているアセンブリを取得する
+
    Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()
+

          
+
    ' アセンブリのターゲットとなるランタイムバージョンを取得・表示する
+
    Console.WriteLine(assm.ImageRuntimeVersion)
+

          
+
    ' 現在動作しているランタイムのバージョンを取得・表示する
+
    Console.WriteLine(Environment.Version)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
v4.0.30319
+
4.0.30319.1
+
}}
+

          
+

          
+

          
+
**参照アセンブリ [#ProcessAndAssembly_ReferencedAssemblies]
+
あるアセンブリが参照しているアセンブリを取得するには&msdn(netfx,member,System.Reflection.Assembly.GetReferencedAssemblies){Assembly.GetReferencedAssembliesメソッド};を使うことができます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Reflection;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在実行しているアセンブリを取得する
+
    Assembly assm = Assembly.GetExecutingAssembly();
+

          
+
    Console.WriteLine(assm.FullName);
+

          
+
    // 参照しているすべてのアセンブリを取得し、表示する
+
    foreach (AssemblyName refassm in assm.GetReferencedAssemblies()) {
+
      Console.WriteLine("  {0}", refassm.FullName);
+
    }
+
  }
+
}
+

          
+
// 他のアセンブリを参照するコードを含むクラス
+
class Foo {
+
  void Bar()
+
  {
+
    // System.dllを必要とするコード
+
    new System.Collections.Generic.Queue<int>();
+
  }
+

          
+
  void Baz()
+
  {
+
    // System.Core.dllを必要とするコード
+
    System.Linq.Enumerable.Range(0, 1);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Reflection
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在実行しているアセンブリを取得する
+
    Dim assm As [Assembly] = [Assembly].GetExecutingAssembly()
+

          
+
    Console.WriteLine(assm.FullName)
+

          
+
    ' 参照しているすべてのアセンブリを取得し、表示する
+
    For Each refassm As AssemblyName In assm.GetReferencedAssemblies()
+
      Console.WriteLine("  {0}", refassm.FullName)
+
    Next
+
  End Sub
+
End Class
+

          
+
' 他のアセンブリを参照するコードを含むクラス
+
Class Foo
+
  Sub Bar()
+
    ' System.dllを必要とするコード
+
    Dim q As New System.Collections.Generic.Queue(Of Integer)()
+
  End Sub
+

          
+
  Sub Baz()
+
    ' System.Core.dllを必要とするコード
+
    System.Linq.Enumerable.Range(0, 1)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(実行結果){{
+
sample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+
  mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
  System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
  System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
}}
+

          
+

          
+

          
+
**コマンドライン引数 [#ProcessAndAssembly_CommandLineArgs]
+
現在のプロセスを起動したときのコマンドライン引数を取得するには、Mainメソッドでコマンドライン引数を受け取る文字列配列指定します。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  // Mainメソッドにコマンドライン引数を格納するための引数を用意する
+
  static void Main(string[] args)
+
  {
+
    // プロセス起動時に指定されたコマンドライン引数を表示する
+
    foreach (string arg in args) {
+
      Console.WriteLine(arg);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  ' Mainメソッドにコマンドライン引数を格納するための引数を用意する
+
  Shared Sub Main(ByVal args As String())
+
    ' プロセス起動時に指定されたコマンドライン引数を表示する
+
    For Each arg As String In args
+
      Console.WriteLine(arg)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
E:\>csc sample.cs
+
E:\>sample.exe /foo /bar=baz "hoge moge"
+
/foo
+
/bar=baz
+
hoge moge
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
$ dmcs sample.cs
+
$ mono sample.exe /foo /bar=baz "hoge moge"
+
/foo
+
/bar=baz
+
hoge moge
+
}}
+

          
+
これとは別に&msdn(netfx,member,System.Environment.GetCommandLineArgs){Environment.GetCommandlineArgsメソッド};を使うことも出来ます。 Mainメソッドで引数を用意する場合と異なる点は、このメソッドを使うことで任意の箇所でコマンドライン引数を参照できることと、このメソッドで取得できるコマンドライン引数の先頭には実行可能ファイルの名前が格納されることの2点です。
+

          
+
また、&msdn(netfx,member,System.Environment.CommandLine){Environment.CommandLineプロパティ};を参照すると、配列に分割される前のコマンドライン文字列を取得することが出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // プロセス起動時に指定されたコマンドラインを取得・表示する
+
    Console.WriteLine(Environment.CommandLine);
+

          
+
    // プロセス起動時に指定されたコマンドライン引数を表示する
+
    foreach (string arg in Environment.GetCommandLineArgs()) {
+
      Console.WriteLine(arg);
+
    }
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' プロセス起動時に指定されたコマンドラインを取得・表示する
+
    Console.WriteLine(Environment.CommandLine)
+

          
+
    ' プロセス起動時に指定されたコマンドライン引数を表示する
+
    For Each arg As String In Environment.GetCommandLineArgs()
+
      Console.WriteLine(arg)
+
    Next
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
E:\>csc sample.cs
+
E:\>sample.exe /foo /bar=baz "hoge moge"
+
sample.exe  /foo /bar=baz "hoge moge"
+
sample.exe
+
/foo
+
/bar=baz
+
hoge moge
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
$ dmcs sample.cs
+
$ mono sample.exe /foo /bar=baz "hoge moge"
+
/home/smdn/sample.exe /foo /bar=baz "hoge moge"
+
/home/smdn/sample.exe
+
/foo
+
/bar=baz
+
hoge moge
+
}}
+

          
+
**自プロセスのパス [#ProcessAndAssembly_ProcessFilePath]
+
自分自身のプロセス(現在実行している実行可能ファイル)のパスを取得するには、&msdn(netfx,member,System.Reflection.Assembly.GetEntryAssembly){Assembly.GetEntryAssemblyメソッド};で実行可能ファイルのアセンブリを取得し、そこから&msdn(netfx,member,System.Reflection.Assembly.CodeBase){Assembly.CodeBaseプロパティ};を参照することで取得できます。 CodeBaseプロパティはURIの形式でパスを返すので、ファイルパスを取得するにはいったん&msdn(netfx,type,System.Uri){Uriクラス};に変換したのちに&msdn(netfx,member,System.Uri.LocalPath){LocalPathプロパティ};を参照するなどします。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Reflection;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在実行している実行可能ファイルのアセンブリを取得する
+
    Assembly assm = Assembly.GetEntryAssembly();
+

          
+
    // アセンブリ(実行可能ファイル)のURIを表示
+
    Console.WriteLine(assm.CodeBase);
+

          
+
    // いったんUriに変換して、LocalPathのみを取得する
+
    Uri codeBase = new Uri(assm.CodeBase);
+

          
+
    // アセンブリ(実行可能ファイル)へのパスを表示
+
    Console.WriteLine(codeBase.LocalPath);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Reflection
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在実行している実行可能ファイルのアセンブリを取得する
+
    Dim assm As [Assembly] = [Assembly].GetEntryAssembly()
+

          
+
    ' アセンブリ(実行可能ファイル)のURIを表示
+
    Console.WriteLine(assm.CodeBase)
+

          
+
    ' いったんUriに変換して、LocalPathのみを取得する
+
    Dim codeBase As New Uri(assm.CodeBase)
+

          
+
    ' アセンブリ(実行可能ファイル)へのパスを表示
+
    Console.WriteLine(codeBase.LocalPath)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(.NET Frameworkでの実行結果){{
+
file:///E:/sample.exe
+
E:\sample.exe
+
}}
+

          
+
#prompt(Monoでの実行結果){{
+
file:///home/smdn/sample.exe
+
/home/smdn/sample.exe
+
}}
+

          
+
これとは別に、コマンドライン引数を参照する方法もあります。 Mainメソッドに渡されるコマンドライン引数には実行可能ファイルのパスは含まれませんが、[[先に解説したとおり>#ProcessAndAssembly_CommandLineArgs]]Environment.GetCommandlineArgsメソッドで取得できるコマンドライン引数の先頭には実行可能ファイルの名前が格納されるので、ここから自プロセスのパスを取得することも出来ます。 ただし、NT系Windowsでは格納されるのはファイル名のみとなる点に注意が必要です。  &msdn(netfx,member,System.IO.Path.GetFullPath){Path.GetFullPathメソッド};を使えばフルパスを取得できますが、カレントディレクトリが変更されている場合などは正しいパスを取得できるとは限りません。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.IO;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // コマンドライン引数の先頭の要素を取得
+
    string file = Environment.GetCommandLineArgs()[0];
+

          
+
    Console.WriteLine(file);
+
    Console.WriteLine(Path.GetFullPath(file)); // フルパスに変換
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.IO
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' コマンドライン引数の先頭の要素を取得
+
    Dim file As String = Environment.GetCommandLineArgs()(0)
+

          
+
    Console.WriteLine(file)
+
    Console.WriteLine(Path.GetFullPath(file)) ' フルパスに変換
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(.NET Frameworkでの実行結果){{
+
sample.exe
+
E:\sample.exe
+
}}
+

          
+
#prompt(Monoでの実行結果){{
+
/home/smdn/sample.exe
+
/home/smdn/sample.exe
+
}}
+

          
+
このほか&msdn(netfx,member,System.Windows.Forms.dll,System.Windows.Forms.Application.ExecutablePath){Application.ExecutablePathプロパティ};からも自プロセスのパスを取得できます。
+

          
+

          
+

          
+
**自プロセスの情報 [#ProcessAndAssembly_ProcessItself]
+
&msdn(netfx,member,System.Diagnostics.Process.GetCurrentProcess){Process.GetCurrentProcessメソッド};を使うと自プロセスを取得出来ます。 このメソッドが返すインスタンスから自プロセスに関する様々な情報を取得することが出来ます。 取得出来る情報や可能な操作についての詳細は&msdn(netfx,type,System.Diagnostics.Process){Processクラス};のドキュメントを参照してください。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Diagnostics;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 自プロセスのProcessインスタンスを取得
+
    Process p = Process.GetCurrentProcess();
+

          
+
    Console.WriteLine("Id = {0}", p.Id);                                  // プロセスのID
+
    Console.WriteLine("Handle = {0}", p.Handle);                          // プロセスのネイティブハンドル
+
    Console.WriteLine("StartTime = {0}", p.StartTime);                    // プロセスの起動時刻
+
    Console.WriteLine("TotalProcessorTime = {0}", p.TotalProcessorTime);  // プロセスの合計プロセッサ時間
+
    Console.WriteLine("WorkingSet64 = {0}", p.WorkingSet64);              // プロセスの物理メモリ使用量
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Diagnostics
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 自プロセスのProcessインスタンスを取得
+
    Dim p As Process = Process.GetCurrentProcess()
+

          
+
    Console.WriteLine("Id = {0}", p.Id)                                 ' プロセスのID
+
    Console.WriteLine("Handle = {0}", p.Handle)                         ' プロセスのネイティブハンドル
+
    Console.WriteLine("StartTime = {0}", p.StartTime)                   ' プロセスの起動時刻
+
    Console.WriteLine("TotalProcessorTime = {0}", p.TotalProcessorTime) ' プロセスの合計プロセッサ時間
+
    Console.WriteLine("WorkingSet64 = {0}", p.WorkingSet64)             ' プロセスの物理メモリ使用量
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(.NET Frameworkでの実行結果例){{
+
Id = 2280
+
Handle = 472
+
StartTime = 2012/01/06 5:06:40
+
TotalProcessorTime = 00:00:00.0468750
+
WorkingSet64 = 11964416
+
}}
+

          
+
#prompt(Monoでの実行結果例){{
+
Id = 10163
+
Handle = 1026
+
StartTime = 2012/01/06 5:09:05
+
TotalProcessorTime = 00:00:00.0560020
+
WorkingSet64 = 6373376
+
}}
+

          
+

          
+
**自ファイルのバージョン [#ProcessAndAssembly_ProcessFileVersion]
+
[[programming/tips/get_assembly_version_info]]で解説しています。
+

          
+

          
+
*ロケール・カルチャ [#LocaleAndCulture]
+
**スレッドのカルチャ [#LocaleAndCulture_ThreadCulture]
+
.NET Frameworkではスレッド毎にカルチャ(ロケール)が関連付けられます。 現在実行中のスレッドのカルチャを取得するには、&msdn(netfx,member,System.Threading.Thread.CurrentThread){Thread.CurrentThread};.&msdn(netfx,member,System.Threading.Thread.CurrentCulture){CurrentCultureプロパティ};を参照します。 &msdn(netfx,member,System.Globalization.CultureInfo.CurrentCulture){CultureInfo.CurrentCultureプロパティ};でも同じ値を取得できます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Threading;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // 現在のスレッドのカルチャを取得・表示する
+
    Console.WriteLine(Thread.CurrentThread.CurrentCulture);
+
    Console.WriteLine(CultureInfo.CurrentCulture);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' 現在のスレッドのカルチャを取得・表示する
+
    Console.WriteLine(Thread.CurrentThread.CurrentCulture)
+
    Console.WriteLine(CultureInfo.CurrentCulture)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(現在のカルチャが'ja-JP'の場合の実行結果例){{
+
ja-JP
+
ja-JP
+
}}
+

          
+
カルチャ・ロケールについて、CultureInfoで取得できるカルチャ固有の情報などについては[[programming/netfx/locale]]で詳しく解説しています。
+

          
+
**デフォルトエンコーディング [#LocaleAndCulture_DefaultEncoding]
+
システムで使われるデフォルトの文字コード(エンコーディング)を取得するには、&msdn(netfx,member,System.Text.Encoding.Default){Encoding.Defaultプロパティ};を参照します。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Text;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // デフォルトエンコーディングを取得・表示する
+
    Console.WriteLine(Encoding.Default);
+
    Console.WriteLine(Encoding.Default.WebName);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Text
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' デフォルトエンコーディングを取得・表示する
+
    Console.WriteLine(Encoding.Default)
+
    Console.WriteLine(Encoding.Default.WebName)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4の実行結果){{
+
System.Text.DBCSCodePageEncoding
+
shift_jis
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8、環境変数LANGが'ja_JP.UTF-8'の場合の実行結果){{
+
System.Text.UTF8Encoding
+
utf-8
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8、環境変数LANGが'ja_JP.SHIFT_JIS'の場合の実行結果){{
+
System.Text.ASCIIEncoding
+
us-ascii
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8、環境変数LANGが'C'の場合の実行結果){{
+
System.Text.ASCIIEncoding
+
us-ascii
+
}}
+

          
+

          
+
**カルチャのエンコーディング [#LocaleAndCulture_CultureEncoding]
+
&msdn(netfx,member,System.Text.Encoding.Default){Encoding.Defaultプロパティ};からはシステムで使われているエンコーディングを取得できますが、特定のカルチャで使用されるエンコーディングを取得するには&msdn(netfx,member,System.Globalization.TextInfo.ANSICodePage){TextInfo.ANSICodePageプロパティ};を参照します。 システムのカルチャとは異なるカルチャでアプリケーションを動作させている場合に、その環境に応じたエンコーディングを取得したい場合などはこのプロパティを使うことが出来ます。
+

          
+
#tabpage(C#)
+
#code(cs){{
+
using System;
+
using System.Globalization;
+
using System.Text;
+
using System.Threading;
+

          
+
class Sample {
+
  static void Main()
+
  {
+
    // システムのデフォルトエンコーディングを取得・表示する
+
    Console.WriteLine(Encoding.Default);
+
    Console.WriteLine(Encoding.Default.WebName);
+
    Console.WriteLine();
+

          
+
    // カルチャを'zh-TW'(中国語-台湾)に変更
+
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("zh-TW");
+

          
+
    CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
+

          
+
    // カルチャで使われるエンコーディングを取得・表示する
+
    Encoding enc = Encoding.GetEncoding(currentCulture.TextInfo.ANSICodePage);
+

          
+
    Console.WriteLine(currentCulture);
+
    Console.WriteLine(enc);
+
    Console.WriteLine(enc.WebName);
+
  }
+
}
+
}}
+
#tabpage(VB)
+
#code(vb){{
+
Imports System
+
Imports System.Globalization
+
Imports System.Text
+
Imports System.Threading
+

          
+
Class Sample
+
  Shared Sub Main()
+
    ' システムのデフォルトエンコーディングを取得・表示する
+
    Console.WriteLine(Encoding.Default)
+
    Console.WriteLine(Encoding.Default.WebName)
+
    Console.WriteLine()
+

          
+
    ' カルチャを'zh-TW'(中国語-台湾)に変更
+
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("zh-TW")
+

          
+
    Dim currentCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
+

          
+
    ' カルチャで使われるエンコーディングを取得・表示する
+
    Dim enc As Encoding = Encoding.GetEncoding(currentCulture.TextInfo.ANSICodePage)
+

          
+
    Console.WriteLine(currentCulture)
+
    Console.WriteLine(enc)
+
    Console.WriteLine(enc.WebName)
+
  End Sub
+
End Class
+
}}
+
#tabpage-end
+

          
+
#prompt(Windows 7 + .NET Framework 4での実行結果){{
+
System.Text.DBCSCodePageEncoding
+
shift_jis
+

          
+
zh-TW
+
System.Text.DBCSCodePageEncoding
+
big5
+
}}
+

          
+
#prompt(Ubuntu 11.10 + Mono 2.10.8での実行結果){{
+
System.Text.UTF8Encoding
+
utf-8
+

          
+
zh-TW
+
I18N.CJK.CP950
+
big5
+
}}
+

          
+
なお、TextInfoクラスについては[[programming/netfx/locale/1_infoes]]で詳しく解説しています。
+

          
+

          
+
#navi(..)
+

          
+