.NET でファイルのパスを操作する
.NET には、ファイル システムのパスを操作するためのメカニズムが組み込まれています。
前の演習では、解析するフォルダーが多くありませんでした。 ファイルとフォルダーが多いファイル システムがある場合は、手動でパスを作成するのが面倒になることがあります。 .NET には、ファイル パスをより簡単に処理できるように、いくつかの組み込み定数とユーティリティ関数が用意されています。
ここでは、プログラムをよりスマートで回復性のあるものにする、System.IO
名前空間のいくつかの定数とユーティリティ関数および System.Environment
型について学習します。
現在のディレクトリを特定する
場合によって、自分のプログラムが実行されるディレクトリまたはパスがわからないことがあります。 プログラムで現在のディレクトリを使用したいが、パスがわからないとしましょう。
.NET の Directory.GetCurrentDirectory
メソッドにより、現在のディレクトリへの完全なパスが公開されます。
Console.WriteLine(Directory.GetCurrentDirectory());
次の構造の 201 フォルダーから前述のコードを実行した場合、Directory.GetCurrentDirectory()
からは stores\201
が返されます。
📂 stores
📂 201
特別なディレクトリを操作する
.NET は、Windows、macOS、Linux、さらには iOS や Android のようなモバイル オペレーティング システムなど、あらゆる場所で実行できます。 各オペレーティング システムには、特殊なシステム フォルダー (ユーザー固有のファイル専用のホーム ディレクトリ、デスクトップ ディレクトリ、一時ファイルを格納するためのディレクトリなど) の概念がある場合とない場合があります。
これらの種類の特殊なディレクトリは、オペレーティング システムによって異なります。 各オペレーティング システムのディレクトリ構造を記憶し、現在の OS に基づいて切り替えてみるのは面倒です。
System.Environment.SpecialFolder
列挙型で、特別なシステム フォルダーへのパスを取得するための定数が指定されています。
次のコードを実行すると、Windows の [マイ ドキュメント] フォルダー、または (コードが Linux で実行される場合でも) Linux のユーザーの [ホーム] ディレクトリに相当する、オペレーティング システムのパスが返されます。
string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
パスを操作する
パスは非常に頻繁に登場する対象であるため、.NET にはそれらの操作専用の Path
というクラスが含まれます。
Path
クラスは、.NET の System.IO
名前空間にあるため、インストールする必要はありません。
パスの特殊な文字
異なるオペレーティング システムでは、ディレクトリのレベルを区切るために異なる文字が使用されます。
たとえば、Windows は円記号 (stores\201
) を使用し、macOS はスラッシュ (stores/201
) を使用します。
正しい文字を使用できるように、Path
クラスには DirectorySeparatorChar
フィールドが含まれています。
パスを手動で構築する必要がある場合は、.NET によって、そのフィールドがオペレーティング システムに適用できる区切り文字に自動的に解釈されます。
Console.WriteLine($"stores{Path.DirectorySeparatorChar}201");
// returns:
// stores\201 on Windows
//
// stores/201 on macOS
パスを結合する
Path
クラスはファイルとフォルダーのパスの概念で動作し、それは単なる文字列です。 Path
クラスを使用すると、特定のオペレーティング システムの正しいパスを自動的に構築できます。
たとえば、stores/201 フォルダーへのパスを取得する必要がある場合は、Path.Combine
関数を使用して行うことができます。
Console.WriteLine(Path.Combine("stores","201")); // outputs: stores/201
プログラムはさまざまなオペレーティング システムで実行される可能性があるため、文字列をハードコーディングするのではなく、Path.Combine
または Path.DirectorySeparatorChar
クラスを使用してください。 Path
クラスにより、それが実行されているオペレーティング システムに適した正しい形式のパスが常に作成されます。
ヒント
それが実際に存在するかどうかは、Path
クラスでは留意されません。 パスは、物理的ではなく概念的なもので、クラスは、自動的に文字列を構築して解析します。
ファイル名拡張子を特定する
Path
クラスを使用すると、ファイル名の拡張子を知ることもできます。 あるファイルがあり、それが JSON ファイルであるかどうかを知る必要がある場合は、Path.GetExtension
関数を使用できます。
Console.WriteLine(Path.GetExtension("sales.json")); // outputs: .json
ファイルまたはパスについて知っておく必要があるすべての情報を取得する
Path
クラスには、さまざまな処理を行う多くの異なるメソッドが含まれています。 ディレクトリまたはファイルに関するほとんどの情報は、それぞれ DirectoryInfo
または FileInfo
クラスを使用して取得できます。
string fileName = $"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales{Path.DirectorySeparatorChar}sales.json";
FileInfo info = new FileInfo(fileName);
Console.WriteLine($"Full Name: {info.FullName}{Environment.NewLine}Directory: {info.Directory}{Environment.NewLine}Extension: {info.Extension}{Environment.NewLine}Create Date: {info.CreationTime}"); // And many more
Path
、DirectoryInfo
、FileInfo
クラスには、便利なプロパティとユーティリティ メソッドが他にも多数ありますが、最も頻繁に使用する可能性がある主要な概念はこれらです。 次の演習では、パスを作成し、.json ファイルを識別します。