パスまたはファイル名から拡張子を抽出するにはGetExtensionメソッドを使います。 GetExtensionメソッドでは、パスにファイル名がない場合でも例外にはならず、単に拡張子はないものとして空の文字列が返されます。 このメソッドでは、ピリオド.も含めて拡張子として扱われます。 (ファイル名がfile.txtなら拡張子は.txtとなる)

ファイル名が拡張子を持たない場合、拡張子がピリオドのみの場合は空の文字列が返されます。 ピリオドが複数あるファイル名の場合は、一番最後のピリオド以降を拡張子として返します。 (ファイル名がfile.txt.bakなら拡張子は.bakとなる)

GetExtensionメソッドでは、UNIX系OSで隠しファイルとして扱われるドットファイル(dot file)のようなピリオドで始まるファイル名に対して特別な考慮はされません。 そのため、ピリオドが一つだけ含まれるドットファイルは、ファイル名全体が拡張子と判断され、GetExtensionメソッドはファイル名をそのまま返します。

さらに非Windows環境では、ピリオドを含み、かつWindows形式のディレクトリ区切り記号\で終わるパスは、拡張子として判断される点に注意が必要です。 例えばパスsome.dir\はディレクトリではなくファイルを表すものと判断されるため、これに従い拡張子も.dir\であると判断されます。 パスsome.dir/では、ディレクトリを表すと判断されるため、これに従い拡張子はないものとして扱われます。

Path.GetExtensionメソッドで拡張子を抽出する
Imports System
Imports System.IO

Class Sample
  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.",                  ' ピリオドで終わるファイル名
      "some.dir\",              ' ピリオドを含むディレクトリ名のパス (Windows形式)
      "some.dir/",              ' ピリオドを含むディレクトリ名のパス (UNIX形式)
      "dir/.file",              ' ピリオドで始まるファイル名
      ".file"                   ' ピリオドで始まるファイル名
    }
      Console.WriteLine("path = {0}", p)
      Console.WriteLine("ext = {0}", Path.GetExtension(p)) ' パスからファイルの拡張子を抽出
      Console.WriteLine()
    Next
  End Sub
End Class
実行結果
path = E:\dir\subdir\file.txt
ext = .txt

path = /dir/subdir/file.txt
ext = .txt

path = .\dir\subdir\file.txt
ext = .txt

path = ./dir/subdir/file.txt
ext = .txt

path = file.txt
ext = .txt

path = file
ext =

path = file.txt.bak
ext = .bak

path = file.
ext =

path = some.dir\
ext =

path = some.dir/
ext =

path = dir/.file
ext = .file

path = .file
ext = .file

実行結果
path = E:\dir\subdir\file.txt
ext = .txt

path = /dir/subdir/file.txt
ext = .txt

path = .\dir\subdir\file.txt
ext = .txt

path = ./dir/subdir/file.txt
ext = .txt

path = file.txt
ext = .txt

path = file
ext = 

path = file.txt.bak
ext = .bak

path = file.
ext = 

path = some.dir\
ext = .dir\

path = some.dir/
ext = 

path = dir/.file
ext = .file

path = .file
ext = .file

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。