.NETのPathクラス(System.IO名前空間)には、ファイル名から拡張子を取得するGetExtensionメソッドと、ベース名を取得するGetFileNameWithoutExtensionメソッドが用意されている。C#およびVB.NETでの使い方を解説する。
一般的に、ファイル名はベース名と拡張子の2つの部分で構成されている。拡張子とは、ファイル名末尾のピリオド(.)で始まる部分(.cs、.jpgなど)であり、ベース名はファイル名から拡張子を除いた部分を指す。
Pathクラス(System.IO名前空間)には、ファイル名からこの2つを取得するための静的メソッドが用意されている。拡張子の取得はGetExtensionメソッド、ベース名の取得はGetFileNameWithoutExtensionメソッドである。
GetExtensionメソッドは、パラメータで渡された文字列に対して、最後尾から先頭方向に向かってピリオドを走査していき、ピリオド以降を拡張子として返す。パラメータはファイル名のみではなく、パス区切り文字(Windowsでは「\」)を含んだパス名でも問題ない。
ext1 = Path.GetExtension("dog.jpg"); // 文字列ext1は「.jpg」
ext2 = Path.GetExtension(@"c:\tmp\dog.jpg"); // 文字列ext2は「.jpg」
一方、GetFileNameWithoutExtensionメソッドは、パラメータで渡された文字列からファイル名部分を取り出し、その文字列から最後のピリオド以降を取り除いた文字列を返す。
base1 = Path.GetFileNameWithoutExtension("dog.jpg"); // 文字列base1は「dog」
base2 = Path.GetFileNameWithoutExtension(@"c:\tmp\dog.jpg"); // 文字列base2は「dog」
パス文字列からファイル名部分を取り出すメソッドとして、同じPathクラスにはGetFileNameメソッドが用意されているが、GetFileNameWithoutExtensionメソッドはこれを拡張したメソッドといえる。実際、GetFileNameWithoutExtensionメソッドは、その内部でGetFileNameメソッドを呼び出しているようである(GetExtensionメソッドは呼び出していない)。
以下に、GetFileNameメソッドとGetFileNameWithoutExtensionメソッドを使用したサンプル・プログラムを示す。
// extension.cs
using System;
using System.IO;
public class ExtensionSample {
static void Main() {
string file;
file = "dog.jpg";
Console.WriteLine(Path.GetExtension(file));
// 出力:.jpg
Console.WriteLine(Path.GetFileNameWithoutExtension(file));
// 出力:dog
// フルパスの場合でもOK
file = @"c:\tmp\dog.jpg";
Console.WriteLine(Path.GetExtension(file));
// 出力:.jpg
Console.WriteLine(Path.GetFileNameWithoutExtension(file));
// 出力:dog
// 拡張子は最後のピリオド以降となる
file = @"c:\tmp\dog.jpg.bak";
Console.WriteLine(Path.GetExtension(file));
// 出力:.bak
Console.WriteLine(Path.GetFileNameWithoutExtension(file));
// 出力:dog.jpg
// ベース名がない場合
file = @"c:\tmp\.emacs";
Console.WriteLine(Path.GetExtension(file));
// 出力:.emacs
Console.WriteLine(Path.GetFileNameWithoutExtension(file));
// 出力:(空の文字列)
// 拡張子がない場合
file = @"c:\tmp\noextension";
Console.WriteLine(Path.GetExtension(file));
// 出力:(空の文字列)
Console.WriteLine(Path.GetFileNameWithoutExtension(file));
// 出力:noextension
}
}
// コンパイル方法:csc extension.cs
' extension.vb
Imports System
Imports System.IO
Public Class ExtensionSample
Shared Sub Main
Dim file As String
file = "dog.jpg"
Console.WriteLine(Path.GetExtension(file))
' 出力:.jpg
Console.WriteLine(Path.GetFileNameWithoutExtension(file))
' 出力:dog
' フルパスの場合でもOK
file = "c:\tmp\dog.jpg"
Console.WriteLine(Path.GetExtension(file))
' 出力:.jpg
Console.WriteLine(Path.GetFileNameWithoutExtension(file))
' 出力:dog
' 拡張子は最後のピリオド以降となる
file = "c:\tmp\dog.jpg.bak"
Console.WriteLine(Path.GetExtension(file))
' 出力:.bak
Console.WriteLine(Path.GetFileNameWithoutExtension(file))
' 出力:dog.jpg
' ベース名がない場合
file = "c:\tmp\.emacs"
Console.WriteLine(Path.GetExtension(file))
' 出力:.emacs
Console.WriteLine(Path.GetFileNameWithoutExtension(file))
' 出力:(空の文字列)
' 拡張子がない場合
file = "c:\tmp\noextension"
Console.WriteLine(Path.GetExtension(file))
' 出力:(空の文字列)
Console.WriteLine(Path.GetFileNameWithoutExtension(file))
' 出力:noextension
End Sub
End Class
' コンパイル方法:vbc extension.vb
なお、パス文字列からファイル名を取り出すGetFileNameメソッドについては、「TIPS:パス文字列からファイル名部分を取り出すには?」で解説している。
カテゴリ:クラス・ライブラリ 処理対象:パス
使用ライブラリ:Pathクラス(System.IO名前空間)
関連TIPS:パス文字列からファイル名部分を取り出すには?
Copyright© Digital Advantage Corp. All Rights Reserved.