mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得するコードを紹介します。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの情報をファイル内の「ID3タグ」に記録できます。この記事ではファイル内に記録されたタイトルやトラック番号、アーティスト名などの情報をWindowsのShellオブジェクトを利用して取得するコードを紹介します。
Windows Formアプリケーションを作成します。
はじめに、WindowsのCOMコンポーネントの参照を追加します。Windows Formアプリケーションを開きます。
ソリューションエクスプローラーのプロジェクトのノードの子にある[参照]ノードをクリックして選択し、右クリックします。下図のポップアップメニューが表示されますので、[参照の追加]の項目をクリックします。
[参照マネージャー]ダイアログが表示されます。
ダイアログの左側の[COM]の項目内の[タイプライブラリ]の項目をクリックして選択します。下図の画面が表示されます。右側のエリアにCOMコンポーネントのリストが表示されます。
右側のエリアの一覧から [Microsoft Shell Controls And Automation]の項目を探し、左側のチェックボックスをクリックしてチェックを付けます。チェックを付けた状態が下図です。選択後、ダイアログ右下の[OK]ボタンをクリックします。
ダイアログが閉じられ、ソリューションエクスプローラーの[参照]ノードに"Shell32"が追加されます。
Windows Formアプリケーションで下図のフォームを作成します。ボタンと複数行のテキストボックスとFileOpenDialogを配置します。
下記のコードを記述します。button1のclickイベントの実装が中心です。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using Shell32;
namespace GetFileProperty
{
public partial class FormSoundFile : Form
{
public FormSoundFile()
{
InitializeComponent();
}
[STAThread]
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK) {
Shell shell = new Shell();
Folder f = shell.NameSpace(Path.GetDirectoryName(openFileDialog1.FileName));
FolderItem item = f.ParseName(Path.GetFileName(openFileDialog1.FileName));
for (int i = 0; i < 500; i++) {
textBox1.Text += i.ToString() +"\t"+f.GetDetailsOf(null, i) +"\t"+f.GetDetailsOf(item, i) + "\r\n";
}
}
}
}
}
ファイルを開くダイアログを開きます。ファイルが選択され、DialogResult.OK が戻った場合に、if文のブロックを実行します。
if (openFileDialog1.ShowDialog() == DialogResult.OK) {
//中略...
}
Shellオブジェクトを作成し、NameSpaceメソッドを呼び出しフォルダオブジェクトを取得します。NameSpaceオブジェクトの引数には取得したい情報のあるフォルダのパスを与えます。
フォルダオブジェクトが取得できたら、ファイルを示す、FolderItemオブジェクトを取得します。FolderオブジェクトのParseNameメソッドを呼び出すことでFolderItemオブジェクトを取得できます。ParseNameメソッドの引数には、ファイル名を与えます。与えるファイル名はフルパスのファイル名ではなく、フォルダオブジェクトのフォルダに配置されているファイル名を与えます。
Shell shell = new Shell();
Folder f = shell.NameSpace(Path.GetDirectoryName(openFileDialog1.FileName));
FolderItem item = f.ParseName(Path.GetFileName(openFileDialog1.FileName));
FolderItemオブジェクトのGetDetailOfメソッドを呼び出すことで、ファイルの詳細情報を取得できます。GetDetailsOfメソッドの第一引数に取得したいファイルのFolderItemオブジェクトを与えます。第二引数に取得するフィールド番号を与えます。なお、GetDetailsOfメソッドにnullを与えた場合は、プロパティの値ではなく項目名が取得できます。
また、項目数は取得できないため、ループで500カラムまでを取得しています。数値に上限はなく値が無いカラムでも例外は発生しないようです。
for (int i = 0; i < 500; i++) {
textBox1.Text += i.ToString() +"\t"+f.GetDetailsOf(null, i) +"\t"+f.GetDetailsOf(item, i) + "\r\n";
}
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。ファイルを開くダイアログが表示されます。プロパティ情報を取得したいサウンドファイルを選択します。
ファイルを開くと下部のテキストボックスにファイルの情報が表示されます。
サウンドファイル中にトラック番号やビットレートなどが設定されていれば、それらの値も表示されます。
音楽ファイル内のタグ情報を取得できました。