拡張子を置換するChangeExtensionメソッドが用意されている一方で、(少なくとも.NET 5時点までの)Pathクラスには拡張子を除くファイル名部分だけを置き換えるメソッド・ChangeFileNameのようなメソッドは用意されていません。 そのため、GetDirectoryNameメソッド・GetExtensionメソッドなどを組み合わせて独自に実装する必要があります。
以下はパスのうち、拡張子を除くファイル名部分を置き換えるメソッドを実装した例です。
Pathクラスのメソッドを組み合わせてパスのファイル名部分だけを置換する
Imports System
Imports System.IO
Class Sample
' パスの拡張子を除いたファイル名部分だけを置き換えるメソッド
Shared Function ChangeFileName(ByVal p As String, ByVal newFileName As String) As String
Dim dir As String = Path.GetDirectoryName(p) ' ディレクトリ部分を抽出
Dim ext As String = Path.GetExtension(p) ' 拡張子部分を抽出
' ディレクトリ、新しいファイル名、拡張子を連結して返す
Return Path.Combine(dir, newFileName + ext)
End Function
Shared Sub Main()
For Each p As String In New String() {
"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}", p)
Console.WriteLine(" => {0}", ChangeFileName(p, "text")) ' 拡張子を維持してパスのファイル名をtextに変える
Console.WriteLine()
Next
End Sub
End Class
実行結果
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)を参照してください。