ファイルやディレクトリのパスをプログラムで組み立てる際、単なる文字列連結(+ 演算子など)を使用するのは危険です。OSによってパスの区切り文字が異なったり(Windowsは \、Linux/Macは /)、末尾の区切り文字の有無によるミスが発生しやすいためです。
System.IO.Path.Combine メソッドを使用すると、これらの差異を自動的に吸収し、実行環境に合わせて正しい形式でパスを結合してくれます。
目次
設定ファイルの保存パスを作成する実装例
以下のサンプルコードでは、ユーザーのアプリケーションデータフォルダ(AppData)の下に、アプリ専用のフォルダと設定ファイル名を結合して、フルパスを作成しています。
サンプルコード
using System;
using System.IO;
public class Program
{
public static void Main()
{
// 結合したいパスの構成要素
// 1. システムのApplicationDataフォルダ (例: C:\Users\User\AppData\Roaming)
string baseDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
// 2. アプリケーション名
string appName = "MyTextEditor";
// 3. ファイル名
string fileName = "settings.xml";
Console.WriteLine($"[1] ベース: {baseDir}");
Console.WriteLine($"[2] アプリ: {appName}");
Console.WriteLine($"[3] ファイル: {fileName}");
Console.WriteLine();
// ---------------------------------------------------------
// Path.Combine で安全に結合
// 引数は2つだけでなく、3つ以上でも可変長引数として渡せます
// ---------------------------------------------------------
string fullPath = Path.Combine(baseDir, appName, fileName);
Console.WriteLine("--- 結合結果 ---");
Console.WriteLine(fullPath);
}
}
実行結果(Windows環境の例)
[1] ベース: C:\Users\YourName\AppData\Roaming
[2] アプリ: MyTextEditor
[3] ファイル: settings.xml
--- 結合結果 ---
C:\Users\YourName\AppData\Roaming\MyTextEditor\settings.xml
解説と技術的なポイント
1. Path.Combine のメリット
文字列連結(baseDir + "\\" + appName)と比較して、以下のメリットがあります。
- 区切り文字の自動処理: 前のパスの末尾に区切り文字があってもなくても、適切に処理して結合します(二重スラッシュ
\\になったり、スラッシュ抜けが起きたりしません)。 - クロスプラットフォーム: Windowsではバックスラッシュ
\、LinuxやmacOSではスラッシュ/を自動的に選択して使用します。
2. 複数の引数
Path.Combine は、パスのパーツを2つだけでなく、3つ、4つと続けて渡すことができます(C# 4.0以降)。 配列を渡すことも可能です。
string[] parts = { "C:", "Windows", "System32", "drivers", "etc", "hosts" };
string path = Path.Combine(parts);
3. 絶対パスが含まれる場合の挙動(注意点)
結合する引数の途中に「絶対パス(例:C:\Logs や /var/log)」が含まれている場合、Path.Combine はそれ以前のパスを無視し、その絶対パスを起点として結合結果を返します。
C#
// "logs" は無視され、"C:\temp\file.txt" が返る
Path.Combine("logs", @"C:\temp", "file.txt");
