【C#】パスの区切り文字を気にせず安全にファイルパスを結合する (Path.Combine)

ファイルやディレクトリのパスをプログラムで組み立てる際、単なる文字列連結(+ 演算子など)を使用するのは危険です。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"); 
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次