ファイルのフルパスからファイル名や拡張子を抽出する

これは何?

JavaScript正規表現を利用して、Windowsのファイルのフルパスからファイル名や拡張子を抽出してくるための関数です。例えば次のようなファイルのフルパスがあったとします。

C:\\music\\album\\test.mp3

このとき、「test.mp3」や「mp3」、「test」、「album」といった項目を文字列として抽出するときに使ってください。

ソース

var str="C:\\music\\album\\test.mp3";

//ファイルパスの解析に失敗したら実行されない	
if( FilePath(str) ){ 
	alert(FilePath.FullPath);//C:\\music\\album\\test.mp3
	alert(FilePath.Drive);//C
	alert(FilePath.FileName);//test.mp3
	alert(FilePath.FileNameShort);//test
	alert(FilePath.FileExt);//mp3
	alert(FilePath.ParentDir);//album
}

/**
 * ファイルのパスを引数として渡すと適当に分解してくれます
 */
function FilePath(str){
	var pattern = /(\w+):(?:\\([^\\:\*?\"<>\|]+))*(?:\\(([^:\\\*?\"<>\|]+)\.+([^:\\\*?\"<>\|]+)$))/;
	
	FilePath.result = str.match(pattern);
	if(FilePath.result){
		FilePath.FullPath = FilePath.result[0];//フルパス
		FilePath.Drive = FilePath.result[1];//ドライブ
		FilePath.ParentDir = FilePath.result[2];//親のディレクトリ
		FilePath.FileName = FilePath.result[3];//ファイル名
		FilePath.FileNameShort = FilePath.result[4];//拡張子を除いたファイル名
		FilePath.FileExt = FilePath.result[5];//拡張子
		
		return true;
	}
	return false;
}

使いかた

関数FilePathに引数として上記のようなファイルのフルパスを渡してやります。このフルパスが正しければ、FilePathのプロパティにファイル名や拡張子の値が設定されます。例えばファイル名「test.mp3」の値はFilePath.FileNameというプロパティに設定されます。

正規表現についての説明

(\w+):(?:\\([^\\:\*?\"<>\|]+))*(?:\\(([^:\\\*?\"<>\|]+)\.+([^:\\\*?\"<>\|]+)$))

これが正規表現になってます。部分ずつ見て行きましょう。

(\w+)

ドライブ名が入ります。

(?:\\([^\\:\*?\"<>\|]+))*

この部分には「\\music」や「\\album」が該当します。その内側の([^:\*?\"<>\|]+)の部分に「music」や「album」が該当します。これは「:」、「*」、「?」、「"」、「<」、「>」といったファイル名には利用できない記号を含んでいないという意味です。

(?:\\(([^:\\\*?\"<>\|]+)\.+([^:\\\*?\"<>\|]+)$))

この部分には「\\test.mp3」が該当します。そのもう一つ内側の括弧に「test.mp3」が対応しています。この内側の部分についてもう少し詳しくみてみます。

(([^:\\\*?\"<>\|]+)\.+([^:\\\*?\"<>\|]+)$)

前の括弧が「test」、後の括弧が「mp3」の文字列に対応しています。ちなみに拡張子以外にドット(.)が含まれているファイル名にも対応しています。例えば「test.004.mp3」なんていうファイル名です。

応用 ネットワークドライブ(NAS)に対応

\\\\music\\album\\test.mp3

ネットワークドライブ上のファイルは上記のような形式をしています。これに対応させるには正規表現を以下のようにすると良いです。

var pattern = /(?:(\w+):|\\)(?:\\([^\\:\*?\"<>\|]+))*(?:\\(([^:\\\*?\"<>\|]+)\.+([^:\\\*?\"<>\|]+)$))/;