パス名やファイル名からベース名と拡張子を取得するには?.NET TIPS

.NETのPathクラス(System.IO名前空間)には、ファイル名から拡張子を取得するGetExtensionメソッドと、ベース名を取得するGetFileNameWithoutExtensionメソッドが用意されている。C#およびVB.NETでの使い方を解説する。

» 2005年04月22日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 一般的に、ファイル名はベース名と拡張子の2つの部分で構成されている。拡張子とは、ファイル名末尾のピリオド(.)で始まる部分(.cs、.jpgなど)であり、ベース名はファイル名から拡張子を除いた部分を指す。

 Pathクラス(System.IO名前空間)には、ファイル名からこの2つを取得するための静的メソッドが用意されている。拡張子の取得はGetExtensionメソッド、ベース名の取得はGetFileNameWithoutExtensionメソッドである。

拡張子を取得するGetExtensionメソッド

 GetExtensionメソッドは、パラメータで渡された文字列に対して、最後尾から先頭方向に向かってピリオドを走査していき、ピリオド以降を拡張子として返す。パラメータはファイル名のみではなく、パス区切り文字(Windowsでは「\」)を含んだパス名でも問題ない。

ext1 = Path.GetExtension("dog.jpg"); // 文字列ext1は「.jpg」
ext2 = Path.GetExtension(@"c:\tmp\dog.jpg"); // 文字列ext2は「.jpg」


ベース名を取得するGetFileNameWithoutExtensionメソッド

 一方、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

ベース名と拡張子を表示するC#のサンプル・プログラム(extension.cs)
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

ベース名と拡張子を表示するVB.NETのサンプル・プログラム(extension.vb)
extension.vbのダウンロード

 なお、パス文字列からファイル名を取り出すGetFileNameメソッドについては、「TIPS:パス文字列からファイル名部分を取り出すには?」で解説している。

カテゴリ:クラス・ライブラリ 処理対象:パス
使用ライブラリ:Pathクラス(System.IO名前空間)
関連TIPS:パス文字列からファイル名部分を取り出すには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。