パス操作

「パス」というのはパソコン上にあるファイルやフォルダの場所を表す文字列です。
これ自体はただの文字列なので、通常の文字列操作メソッドでも加工できますが、C#ではこれらを簡便に扱うためのメソッドが用意されています。

パスの区切り文字の「\」記号は、環境によって円記号(¥)またはバックスラッシュ(\)で表示されます。
(上記はどちらも全角で表示しています)

パス文字列の加工

パス文字列を加工するにはPathクラスに用意されている各メソッドを使用します。
PathクラスはSystem.IO名前空間に存在するので、コード先頭のusingディレクティブに以下を追加してください。


using System;

//↓なければこれを追加
using System.IO;

数が多いですが難しいものではないので一気に説明します。
それぞれのメソッドの意味はコード中のコメントを参照してください。


void Print(string name, object val)
{
    Console.WriteLine("{0}\n{1}\n", name, val.ToString());
}

//元となるファイルパス           
const string path = @"C:\dir\sub\file.txt";
Console.WriteLine("元パス:\n{0}\n", path);

//ファイル名を取得
Print("GetFileName", Path.GetFileName(path));
//file.txt

//拡張子を取得
Print("GetExtension", Path.GetExtension(path));
//.txt

//拡張子を除いたファイル名を取得
Print("GetFileNameWithoutExtension", Path.GetFileNameWithoutExtension(path));
//file

//フォルダ名の取得
Print("GetDirectoryName", Path.GetDirectoryName(path));
//C:¥dir¥sub¥

//ルート(ドライブ名)の取得
Print("GetPathRoot", Path.GetPathRoot(path));
//C:¥

//絶対パスの取得
Print("GetFullPath", Path.GetFullPath(path));
//C:¥dir¥sub¥file.txt

//拡張子が含まれているか
Print("HasExtension", Path.HasExtension(path));
//True

//ルートが含まれているか
Print("IsPathRooted", Path.IsPathRooted(path));
//True

//親フォルダ名の取得
//これはPathクラスではなくDirectoryクラスを使用
Print("Directory.GetParent", Directory.GetParent(path));
//sub
元パス:
C:\dir\sub\file.txt

GetFileName
file.txt

GetExtension
.txt

GetFileNameWithoutExtension
file

GetDirectoryName
C:\dir\sub

GetPathRoot
C:\

GetFullPath
C:\dir\sub\file.txt

HasExtension
True

IsPathRooted
True

Directory.GetParent
C:\dir\sub

これらのメソッドは単純な文字列操作なので、元となるファイルパスにファイル(フォルダ)が存在しなくても構いません。

GetParentメソッドはPathクラスではなくDirectoryクラスのメソッドですが、Pathクラス単体では同等の機能は実現できないので合わせて掲載しています。

Path.GetFileNameメソッドは「FileName」という名称ですが、引数にフォルダパスを指定すればフォルダ名が得られます。
ただし「\」記号で終わるパス名を指定した場合は上手くいかないので、Path.GetDirectoryNameで末尾の\記号を除去してからPath.GetFileNameを適用します。
(文字列操作で末尾の\記号を除去しても良いですが、やや面倒です)


//末尾が¥記号のパス
string path = @"C:\dir\sub\";
Console.WriteLine("元パス:\n{0}\n", path);

string filename = Path.GetFileName(path);
Console.WriteLine("GetFileName:\n{0}\n", filename);
//出力されない

//末尾の¥記号を除去
path = Path.GetDirectoryName(path);

//フォルダ名を取得
filename = Path.GetFileName(path);
Console.WriteLine("GetFileName:\n{0}\n", filename);
元パス:
C:\dir\sub\

GetFileName:


GetFileName:
sub

拡張子の変更

ファイルの拡張子を変更するにはPath.ChangeExtensionメソッドを使用します。


string path = "file.txt";

//拡張子を「log」に変更する
string pathNew = Path.ChangeExtension(path, "log");

//変更の適用
File.Move(path, pathNew);

Path.ChangeExtensionメソッドはあくまでも文字列を加工するだけなので、実際のファイルの拡張子を変更するにはFile.Moveメソッドを使用します。

パスの結合

パス文字列を結合するには、単純に文字列を結合する方法が考えられます。


string path1 = @"C:\dir\";
string path2 = @"sub\";
string path3 = "file.txt";

string path4 = path1 + path2 + path3;
Console.WriteLine(path4);
C:\dir\sub\file.txt

これは特別なメソッドは使用しないのでわかりやすいです。
しかしただの文字列の結合ですから、パス文字列としての正しさは考慮されていません。
例えば以下の場合はそれぞれの文字列で区切り文字の扱い方が統一されていないので、そのまま結合するとパス文字列としては使用できません。


string path1 = @"C:\dir\";
string path2 = @"\sub";
string path3 = @"\file.txt";

string path4 = path1 + path2 + path3;
Console.WriteLine(path4);
C:\dir\\sub\file.txt

文字列操作メソッドで適宜加工してから結合する方法もありますが、Path.Combineメソッドを使用すると簡単にパス文字列を得られます。


string path1 = @"C:\dir\";
string path2 = @"\sub";
string path3 = @"\file.txt";

string path4 = Path.Combine(path1, path2, path3);
Console.WriteLine(path4);
C:¥dir¥sub¥file.txt

Path.Combineメソッドの引数は任意の数指定できます。