拡張子を置換するChangeExtensionメソッドが用意されている一方で、(少なくとも.NET 5時点までの)Pathクラスには拡張子を除くファイル名部分だけを置き換えるメソッド・ChangeFileNameのようなメソッドは用意されていません。 そのため、GetDirectoryNameメソッド・GetExtensionメソッドなどを組み合わせて独自に実装する必要があります。
以下はパスのうち、拡張子を除くファイル名部分を置き換えるメソッドを実装した例です。
Pathクラスのメソッドを組み合わせてパスのファイル名部分だけを置換する
using System;
using System.IO;
class Sample {
// パスの拡張子を除いたファイル名部分だけを置き換えるメソッド
static string ChangeFileName(string path, string newFileName)
{
var dir = Path.GetDirectoryName(path); // ディレクトリ部分を抽出
var ext = Path.GetExtension(path); // 拡張子部分を抽出
// ディレクトリ、新しいファイル名、拡張子を連結して返す
return Path.Combine(dir, newFileName + ext);
}
static void Main()
{
foreach (var path in new[] {
@"E:\dir\subdir\file.txt", // 絶対パス (Windows形式)
@"/dir/subdir/file.txt", // 絶対パス (UNIX形式)
@".\dir\subdir\file.txt", // 相対パス (Windows形式)
@"./dir/subdir/file.txt", // 相対パス (UNIX形式)
@"file.txt", // ファイル名のみのパス
@"file", // 拡張子のないファイル名
@"file.txt.bak", // ピリオドを二つ以上含むファイル名
@"file.", // ピリオドで終わるファイル名
}) {
Console.WriteLine("path = {0}", path);
Console.WriteLine(" => {0}", ChangeFileName(path, "text")); // 拡張子を維持してパスのファイル名をtextに変える
Console.WriteLine();
}
}
}
実行結果
path = E:\dir\subdir\file.txt => E:\dir\subdir\text.txt path = /dir/subdir/file.txt => \dir\subdir\text.txt path = .\dir\subdir\file.txt => .\dir\subdir\text.txt path = ./dir/subdir/file.txt => .\dir\subdir\text.txt path = file.txt => text.txt path = file => text path = file.txt.bak => text.bak path = file. => text
実行結果
path = E:\dir\subdir\file.txt => text.txt path = /dir/subdir/file.txt => /dir/subdir/text.txt path = .\dir\subdir\file.txt => text.txt path = ./dir/subdir/file.txt => ./dir/subdir/text.txt path = file.txt => text.txt path = file => text path = file.txt.bak => text.bak path = file. => text
この例で使用しているPath.Combineメソッドについては§.パスの結合 (Combine)を参照してください。